继承是一个IS-A关系
在继承树结构中,如果A继承B,B继承C,那么应该满足A IS B,A IS C。IS-A也可以用来测试继承关系是否正确如果子类中打算引用父类的方法然后加上额外的行为应该怎么办?
你可以在父类中设计出所有子类都适用的方法的实现,然子类都可以不用完全覆盖掉父类的方法,
只是再加上额外的方法,你可以使用super这个关键词来取用父类
public void roam(){
super.roam;
}
关于子类对父类的方法和成员变量的继承
子类可以继承父类的成员。这包括了实例变量和方法,父类可以通过存取权限决定子类是否能够继承某些特定的成员
多态
Animal dog = new dog()两者的类型虽然不相同,但是animal是dog的父类
将引用类型定义为animal,但是对象确实dog
Animal[] animal = new Animal[5];//声明Animal类型的数组,也就是说一个会保存Animal类型对象的数组
animal[0] = new Dog();//可以放任何一个是Animal的子类对象进去
animal[1] = new Cat();
animal[2] = new Wolf();
animal[3] = new Lion();
animal[4] = new Hippo();
如果声明一个父类的引用变量,并且赋予子类的对象给它:
class Vet {
public void giveShot(Animal a){
//做一些随心所欲的事情,例如将dog或者cat对象传给a
//giveShot这个方法可以取用任何一种Animal,只要传入的是Animal的子类他都能执行
a.makeNoise
}
}
a参数可以用任何Animal的类型对象来当传入。执行到makeNoise()的时候,不管它引用的对象到底是个什么,
该对象都会执行重写的makeNoise()方法
class PetOwner{
Wolf w = new Wolf();
Dog d = new Dog();
Cat c = new Cat();
w.giveshot(d);//会执行dog的makeNoise方法
d.giveshot(c);//会执行cat的makeNoise方法
}