“种瓜得过,种豆得豆”、“有其父必有其子”,这些都是现实世界中的遗传现象,而“一母生九子,连母十个样”、“青出于蓝而胜于蓝”则体现了现实世界的变异现象。在Java语言中,继承充分体现了遗传和变异的特点。
- 继承的定义:多个类(子类)中存在相同属性和行为时,将这些内容向上抽取到一个单独的类(父类)中,而这几个类只需要继承这个类,无需再定义这些属性和行为。在子类和父类之间存在着明显的“is-a”关系。
- 继承的语法规则
修饰符 子类名 extends 父类名 {} - 继承的特点
Java只支持单继承,不支持多继承,但支持多层继承。 - 继承的优势
a.提高了代码的复用性
b.提高了代码的维护性
c.类与类之间产生了关系,是多态的前提
- 继承的弊端
由于类与类之间产生了关系,这也导致了类的耦合度增加了,而我们在开发是的原则是:高内聚,低耦合。 - 继承注意事项
a.不要为了部分功能而刻意的去继承。
b.子类只能继承父类所有非私有的成员(成员变量和成员方法)
c.子类不能继承父类的构造方法,但是可以通过super关键字去调用父类的构造方法。1
public class Fu {
private String name;
private int age;
public Fu(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Zi extends Fu {
public Zi(String name,int age){
super(null,0);
}
}
- 继承中构造方法的注意事项
1.子类中所有的构造方法默认都会访问父类中的空参构造方法,因为在子类初始化之前一定要先完成父类数据的初始化。
2.而如果父类中没有无参构造方法时:
a.在父类添加一个无参的构造;
b.子类通过super关键字去显式的调用父类的其他的带参的构造方法;
c.子类通过this去调用本类中其他的构造方法,前提是本类的其他构造必须首先访问了父类构造。
public class Zi extends Fu {
public Zi() {
this(null,0);
}
public Zi(String name, int age){
super(null,0);
}
}
3.super(…)和this(…)必须位于子类构造方法语句的第一条。
- 方法重写
子类需要父类的功能,同时有自己特有的功能时,就需要方法重载(子类中出现和父类中一模一样的方法声明) - 方法重写注意事项
a.父类私有的方法不能被重写(继承都不可以);
b.子类重写父类方法时,访问权限不能更低,最好一致;
public class Fu {
public void eat(){
System.out.println("吃饭");
}
}
public class Zi extends Fu {
//void eat(){ 访问权限:public>protected>缺省的>private
public void eat(){
System.out.println("吃晚饭");
}
}
c.父类静态方法,子类也必须通过静态方法进行重写。
public class Fu {
public static void eat(){
System.out.println("吃饭");
}
}
public class Zi extends Fu {
public static void eat(){
System.out.println("吃晚饭");
}
}
由于子类的构造器不能直接访问父类的私有域,所以必须利用父类的构造器对这部分私有域进行初始化,我们可以通过super关键字实现对父类构造器的调用。 ↩︎