本文共 3130 字,大约阅读时间需要 10 分钟。
物件导向编程中的继承与多态
在编程中,继承是面向对象编程的核心概念之一。它允许一个类继承另一个类的属性和方法,使得代码复用性更高。通过继承,我们可以将共同的功能抽象到父类中,而子类则可以扩展这些功能以满足特定需求。在Java中,使用箭头(->)表示继承关系。例如:
汽车 <---- 交通工具小汽
通过这种关系,小汽将继承交通工具所有的属性和方法。如果父类交通工具具有属性name和方法吃,小汽也将自动拥有这些属性和方法。子类可以通过调用parent的属性和方法进行操作,而无需重复实现。
在Java中,子类通过使用关键字extends声明继承关系。一个子类只能继承一个父类(与C++、Python等其他语言的多继承不同)。子类会自动继承父类的public字段和方法,但私有字段和方法无法被访问。在子类中,超类实例可以通过使用super关键字来访问。
一个示例:// 父类public class Animal {public String name;public Animal(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}}
// 子类public class Cat extends Animal {public Cat(String name) {super(name);}public void eat(String food) {System.out.println("猫正在吃" + food);}}
通过这种方式,Cat继承了Animal的全部属性和方法,但可以通过覆盖(method override)定义自身特定的行为。
在Java中,子类可以选择隐藏父类的属性或覆盖父类的方法。如果子类声明了与父类相同名称的字段或方法,那么父类的对应属性或方法将被隐藏。子类的字段或方法会完全遮盖父类的同名成员。
若子类定义与父类同名的字段,父类的字段将被隐藏。例如:
public class Animal {public String name;}
public class Cat extends Animal {public String name;}
Cat obj = new Cat();System.out.println(obj.name); // 输出:Cat的name字段
在这个案例中,Cat中的name字段将隐藏Animal中的name字段。
方法覆盖允许子类用与父类相同名称的方法重定义不同的行为。覆盖必须满足以下条件:
public class Animal {public void eat(String food) {System.out.println("动物在吃ingredient");}}
public class Cat extends Animal {public void eat(String food) {System.out.println("猫在吃ingredient");}}
Cat的eat方法会在运行时取代Animal的Eat方法。
构造方法的继承与普通方法不同。无参数的构造方法会自动调用父类的构造方法。带参数的构造方法不会继承父类的构造方法。
public class Animal {Animal() {// 构造代码}}
public class Cat extends Animal {Cat() {// 在Cat的构造代码中,super()会被自动调用super();}}
public class Animal {Animal(String name) {// 构造代码}}
public class Cat extends Animal {Cat(String name) {// 需要手动调用父类的构造方法super(name);}}
在子类的构造方法中,super关键字用于调用父类的构造方法。它只能在构造方法中使用,并且必须是首要语句。
public class Cat extends Animal {Cat(String name) {super(name);// 其他构造代码}}
多态是面向对象编程的重要特性,它允许一个对象在接收到不同消息时,表现出不同的行为。同一类的不同对象可能会对相同的消息作出不同的响应。
Java通过动态绑定的机制实现多态。在编译时,方法引用是虚拟的。因此,在运行时,VM会根据实际使用的对象类型,动态选择正确的方法进行调用。
重载允许在同一类中定义多个方法拥有相同的名字,但参数列表必须有所不同。在Java中,以下情况会引发重载:
public class Calculator {void add(int a, int b) {System.out.println("整数相加");}
void add(double a, double b) { System.out.println("小数相加");} }
两个方法名称相同,但参数列表不同,因此属于重载。
构造方法也可以重载。示例:public class Shape {Shape(int side) { ... }Shape(String type) { ... }}
重载:
覆盖:
代码改进最后优化的代码是:
class Animal { public String name; public Animal(String name) { this.name = name; } public void eat(String food) { System.out.println(this.name + "正在吃" + food); }}class Cat extends Animal { public Cat(String name) { super(name); }}class Bird extends Animal { public Bird(String name) { super(name); public void fly() { System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); } }}public class Test { public static void main(String[] args) { Cat cat = new Cat("小黑"); cat.eat("猫粮"); Bird bird = new Bird("圆圆"); bird.fly(); }} 如若有任何疑问或者需要进一步优化,请随时告知!
转载地址:http://vbrnz.baihongyu.com/