Person person;//父类的引用指向子类的方法;
person = newStudent();//person类型引用做一个判断//(1)if(person.eat().size==2 )
{if(person instanceofPerson)
{
person.eat();
}else if(person instanceofStudent) {
Student stu=(Student)person;
stu.eat();
}
person.eat();//从代码角度看,此时是父类的引用调用的是父类中的eat方法//(2)子类若覆盖了父类的方法,eat动态绑定到父类的引用Person上,换个名字叫动态绑定//父类的引用可以调用子类的方法,我们把这一现象成为多态//从字面意思来理解person这个父类的引用一会是person一会是student//person有多种状态;//也叫方法的动态绑定//继承是通向多态的入口
person.f2();
person.gotobed();
person.eat();
Student stu= newStudent();
stu.eat();
stu.gotobed();//父类的引用能够调用子类的方法
}
Java中,父类的引用既可以指向父类的对象,也可以指向子类的对象。但子类的引用不能指向父类的对象。
引用类型也可以进行类型转换。
但转换的类型一定具有继承关系,即仅允许父子类之间进行转换。
如果尝试将毫无关联的两个类型进行转换,将会引发编译错误。可以使用instanceof来判断引用是否为指定的类型。
经典实例:
public classA {publicString show(D obj) {return ("A and D");
}publicString show(A obj) {return ("A and A");
}
}public class B extendsA{publicString show(B obj){return ("B and B");
}publicString show(A obj){return ("B and A");
}
}public class C extendsB{
}public class D extendsB{
}public classTest {public static voidmain(String[] args) {
A a1= newA();
A a2= newB();
B b= newB();
C c= newC();
D d= newD();
System.out.println("1--" +a1.show(b));
System.out.println("2--" +a1.show(c));
System.out.println("3--" +a1.show(d));
System.out.println("4--" + a2.show(b)); //4--B and A .首先a2是A引用,B实例,调用show(B b)方法,此方法在父类A中没有定义,所以B中方法show(B b)不会调用(多态必须父类中已定义该方法),再按优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O),即先查this对象的父类,没有重头再查参数的父类。查找super.show((super)O)时,B中没有,再向上,找到A中show(A a),因此执行。
System.out.println("5--" + a2.show(c)); //同上
System.out.println("6--" + a2.show(d)); //A and D .查找B中没有show(D d)方法,再查A中,有,执行。
System.out.println("7--" +b.show(b));
System.out.println("8--" + b.show(c)); //B and B .
System.out.println("9--" +b.show(d));
}
}
二、多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。