继承
继承: 子类继承父类,使得子类拥有父类中的成员变量与方法的属性的行为。
例如动物(Animal)都有名字,都会吃饭。而猫(Cat)不仅有名字,还有颜色,会吃饭,它还会跑;而鸭子(Duck)不仅有名字,会吃饭,还会游泳和飞。
那么此时动物与猫和鸭子就达到了继承的关系。
此时,Animal 这样被继承的类,我们称为 父类 , 基类 或 超类, 对于像 Cat 和 Duck 这样的类,,我们称为 子类,子类会继承父类的字段和方法,,以达到代码重用的效果。
语法:
class 子类 extends 父类 {
}
现在用代码实现上例的继承关系
Animal类
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
protected void eat() {
System.out.println(this.name + "正在吃饭!");
}
}
Cat类
public class Cat extends Animal {
String color;
public Cat(String name, String color) {
super(name);
this.color = color;
}
@Override
public void eat() {
System.out.println(this.color + "的" + this.name + "正在吃饭!");
}
public void running() {
System.out.println(this.color + "的" + this.name + "跑起来了!");
}
}
Duck类
public class Duck extends Animal {
public Duck(String name) {
super(name);
}
public void swimming() {
System.out.println(this.name + "正在游泳!");
}
public void flying() {
System.out.println(this.name + "飞起来了!");
}
}
Test类
public class Test {
public static void main(String[] args) {
Animal animal = new Animal("小动物");
Cat cat = new Cat("小猫", "白色");
Duck duck = new Duck("小鸭");
animal.eat(); //小动物正在吃饭!
System.out.println(cat.getName() + "是" +
cat.getColor() + "的。"); //小猫是白色的。
cat.eat(); //白色的小猫正在吃饭!
cat.running(); //白色的小猫跑起来了!
duck.eat(); //小鸭正在吃饭!
duck.swimming(); //小鸭正在游泳!
duck.flying(); //小鸭正在游泳!
}
}
继承的特性
- 具有传递性,在子类中,在权限允许的前提下,可以不声明而继承父类中的变量与方法。即只要父类中的变量和方法的权限允许,子类不需要再次声明这些变量与方法。
- 子类中有与父类同名的变量,此时子类的同名变量会覆盖父类的同名变量,但如果要访问父类的同名变量,可以用 super 关键字来实现。
- 子类可以重写父类已有的方法,但如果要访问父类中被重写的方法,需要使用 super 关键字来调用。
- 在类的强制转换中,只有继承层次才能发生。
- 子类不能访问父类中的私有字段和私有方法(不是没有继承,是不能访问)。
- 在子类的实例中,也包含父类的实例。
- 继承父类后,在构造子类时,一定要先帮父类构造。
关于重写:
- 子类的修饰权限一定要大于等于父类的修饰权限。
- 被修饰的方法不能用 final 关键字修饰。
- 被 static 关键字修饰的方法不可被重写。
- 实现重写方法要养成添加重写注释 @Override 的好习惯。
- 返回值必须相同,或者构成父子关系,即协变类型(被重写的方法返回值为父类类型,重写的方法返回值为子类类型)。
多层次的继承关系
我们总在生活中看到狗,但是狗也是隶属关系的。例如犬包含牧羊犬,牧羊犬包含边境牧羊犬,边境牧羊犬包含… 这种关系我们成为多层继承。
下面用代码实例:
Animal类
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
Dog类
public class Dog extends Animal{
public Dog(String name) {
super(name);
}
}
ShepherdDog类
public class ShepherdDog extends Dog{
public ShepherdDog(String name) {
super(name);
}
}
BorderCollie类
public class BorderCollie extends ShepherdDog {
public BorderCollie(String name) {
super(name);
}
}
这样的继承方式称为多层继承, 即子类还可以进一步的再派生出新的子类。
- java中只支持单继承,即一个类最多只能继承一个类,但是可以支持多层继承,但是即使如此,我们并不希望类之间的继承层次太复杂, 一般我们不希望出现超过三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了。
- 一般在多层继承层次达到三层的继承关系时,我们就要对第三层类使用 final 关键字进行修饰,表示该类不能再被继承。