继承
主要目的:
-
代码复用:通过继承可以将公共属性和方法提取到父类中,从而避免在子类中重复编写相同的代码,提高了代码的重用性。
-
代码扩展:子类可以继承父类的成员属性和方法,并在此基础上增加新的属性和方法,从而扩展了代码的功能。
-
统一接口:通过继承可以实现统一接口,即所有的子类都具有相同的方法和属性,方便程序的扩展和管理。
-
多态性:通过向上转型和动态绑定的机制,可以实现多态性,即同一操作作用于不同的对象,可以产生不同的结果,提高代码的灵活性。
介绍:
Java的继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。
- 定义子类:通过关键字
extends
来定义子类,并指定父类的名称。
public class SubClass extends SuperClass {
// 子类的成员变量和成员方法
}
-
子类继承父类的属性和方法:子类继承了父类的所有非私有成员属性和方法,可以直接使用。
-
重写父类方法:子类可以重写父类的方法,即在子类中重新定义一个同名的方法,但是必须保证参数列表和返回值类型与父类相同,权限修饰符不小于父类,同时可以添加新的功能。
public class SubClass extends SuperClass {
@Override
public void printName() {
super.printName();
System.out.println("This is SubClass.");
}
}
- 使用super调用父类构造函数和方法:子类可以使用super关键字来调用父类的构造函数和方法,可以用于初始化父类的属性和调用父类的方法。
public class SubClass extends SuperClass {
public SubClass(String name, int age) {
super(name, age); // 调用父类构造函数初始化父类属性
}
public void printInfo() {
super.printName(); // 调用父类方法
System.out.println("The age is " + super.getAge()); // 调用父类的getter方法
}
}
-
多级继承:Java中支持多级继承,即在子类中继续定义子类,从而形成一个继承层次结构。
-
继承的限制:Java中的继承遵循一些限制,比如不能继承final类、不能访问父类的私有成员、不能重写父类的final方法等。
继承与构造方法的关系
主要体现在以下两个方面:
-
子类构造方法必须调用父类构造方法:当一个子类被实例化时,它的构造方法必须先调用其直接父类的构造方法,以初始化从父类继承而来的属性。如果子类没有显式地调用父类的构造方法,Java会自动调用父类的默认构造方法。
-
父类构造方法对子类的影响:当父类的构造方法被调用时,它会初始化父类中定义的成员变量,并且可能执行一些其他的操作。如果子类继承了父类中的属性或方法,那么在子类的构造方法中,需要先调用父类的构造方法,以确保父类的属性得到正确的初始化。
具体来说,当子类被实例化时,Java会按照如下的规则进行构造方法的调用:
- 先调用父类的构造方法,以初始化从父类继承的属性;
- 再调用子类的构造方法,以初始化子类特有的属性。
如果子类没有显式地调用父类的构造方法,则Java会自动调用父类的默认构造方法。如果父类没有提供默认构造方法,则子类的构造方法必须显式地调用父类的构造方法。
以下是一个示例代码,展示了子类构造方法调用父类构造方法的过程:
class SuperClass {
private int value;
public SuperClass(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
class SubClass extends SuperClass {
private String name;
public SubClass(int value, String name) {
super(value); // 调用父类构造方法
this.name = name;
}
public String getName() {
return name;
}
}
// 创建子类对象
SubClass subObj = new SubClass(10, "Tom");
// 获取子类和父类的属性值
int value = subObj.getValue(); // 通过父类的Getter方法获取属性值
String name = subObj.getName(); // 获取子类的属性值
继承的缺点
-
父类的变化对子类的影响:当修改父类的实现时,可能会对子类产生意想不到的影响,导致程序出现错误。
-
方法重写的歧义:如果在子类中重写了父类的方法,但是没有正确地覆盖父类的同名方法,就会导致程序出现歧义。
-
子类过多的依赖于父类:过度使用继承可能导致子类过于依赖于父类,导致代码的耦合度过高,使得代码难以重构和维护。
-
向上转型的限制:当将子类向上转型为父类时,会丢失子类特有的属性和方法,导致功能受到限制。
-
过度设计的问题:如果过度依赖继承,可能导致出现过度设计,即设计过于复杂而不易维护的代码结构。
-
继承链的深度:继承链过长可能导致代码的性能下降,因为每次访问继承链中的属性和方法时都需要进行一次查找。