Java运行时多态实现:继承与超类引用详解
Java运行时多态性的实现
一种是通过继承超类对象的引用变量和子类对象的引用来实现
//定义超类superA
classsuperA
{
voidfun()
{
}
//定义子类B来自superA
< < } //选择superA子类subC <{ <} } 章节测试 { 发布icstaticvoidmain(String[]args) { Aafun() () afun() () } ThisissubB ThisissubC 二、通过引用类对象来实现其中通过接口类型变量来实现接口 //定义InterA接口 InterA接口 { } //实现InterA接口的B类 classBimplementsInterA { publicvoidfun() { } //实现InterA接口的C类 classCimElementsInterA classTest { publicstaticvoidmain(String[]args) :{ :} :} :这是B :这是C什么是继承,试说明在java中实现多继承的方法
JAVA中没有多重继承,一个类可以有一个父类。
继承的表现形式就是多态。
一个父类可以有多个子类,并且子类中可以重写父类的方法(如print()方法)。
这样,每个子类中重写的代码就不同,自然表达也不同。
这样就用父类的变量来引用不同的子类。
调用同一个print()方法时,得到的结果和表达式是不同的。
这就是多态性,同一个消息(即调用同一个方法)会有不同的结果。
例如://父类publicclassFather{//父类有命中子类的方法publicvoidhitChild(){}}//子类1publicclassSon1extendsFather{//重写父类命中子类的方法publicvoidhitChild(){System.out.Println("为什么打我?我做错了什么!");}}//子类2publicclassSon2extendsFather{//重写父类方法,打子publicvoidhitChild(){System.out.println("我知道我错了,别打!");}}//子类3publicclassSon3extendsFather{//重写父类打孩子的方法publicvoidhitChild(){System.out.println("我执行,你打不到!");}}//测试类publicclassTest{publicstaticvoidmain(Stringargs[]){Fatherfather;father=newSon1();father.hitChild();father=newSon2();father.hitChild();father=newSon3();father.hitChild();}}都调用同一个方法,却出现不同的结果!这就是多态性!2、JAVA中没有多重继承,但是多重继承是使用接口来实现的!一个类可以同时实现多个接口!(相当于C++中的一个类同时继承多个类!)例如:publicclassSonimplementsFather1,Father2,Father3{}接口鼓励扩展代码功能(添加新功能)!继承鼓励修改代码函数(将旧函数变成新函数)!改变旧功能和增加新功能的前提是旧功能不改变并且旧功能仍然可以使用!旧的类代码不会改变!继承上面的例子:上面例子中的子类统称为第一代子类1.使用继承来修改旧的函数。
现在如果第一代Son1的函数击中了children,即hitChild()方法中的函数实现有问题,需要改变具体实现,那么我们可以重写第二代的新子类Son11继承自第一代子类Son1并重写其hitChild()方法。
//第二代子类publicclassSon11extendsSon1{//重写父类的子方法publicvoidhitChild(){System.out.println("我是第二代子类新实现了这个方法");}}2.使用接口实现添加新功能。
现在Son1类已经有了“打孩子”的功能(即方法),我们有了新的需求。
我们需要它有一个新的“抚摸婴儿”功能(newpet();方法)。
而且旧代码无法移动!然后我们可以定义一个新的接口(PetInterFace),并在接口中定义这个pet()方法的声明。
所以重写一个第二代Son11子类,让它先继承Son1类,同时实现PetInterFace接口!并实现pet()方法在界面中!//新增接口publicinterfacePetInterFace{//新增功能方法publicvoidpet();}//第二代子类publicclassSon11extendsSon1implementsPetInterFace{//实现接口方法publicvoidpet(){System.out.println("爸爸很爱我!");}}这样,这个第二代子类既有旧方法,又有新功能!