目录
多态的语法知识
例1:
把bb发送给aa,相当于将bb在栈中的指针给了aa,aa原来指向自己的对象在堆中的空间,后来指向bb在堆中的一块空间,如图:
多态的定义
一个父类的引用类型变量既可以指向父类对象,也可以指向子类对象,它可以根据当前时刻指向的不同,自动调用不同对象的方法。
多态的用法
多态的用法举例2:
package 多态2;
class A{
public void f() {
System.out.println("AAAA");
}
}
class B extends A{
public void f() {
System.out.println("BBBB");
}
}
class C extends B{
public void f() {
System.out.println("CCCC");
}
}
public class Testpoly_2 {
static void g(A aa) {//参数是父类对象
aa.f();
}//实现一个方法调用三个对象的方法。即使再增添一个类D继承于前面的类,也不用改变这个方法就可以调用新增对象的方法
public static void main(String[] args) {
A aa = new A();
B bb = new B();
C cc = new C();
g(aa);
g(bb);//将子类对象赋给父类对象,使aa指向子类对象的空间,所以就可以调用bb.f()
g(cc);//同理
}
}
将子类对象赋给父类对象,这也叫做多态的向下兼容。
将子类对象转换成父类对象,能调用的方法只有子类从父类继承或重写的方法,不能调用子类中独有的方法。虽然父类对象的指针已经指向了子类对象的空间,但是java语言的设计者不允许这样来处理,因为父类对象调用子类独有的方法,这在实际问题解决中逻辑上是行不通的。程序举例:
多态的用法举例3:
将父类强制转换为子类,语法上可以,但是逻辑上不正确,没有什么意义,所以在运行时会报错。
但如果加上bb = aa(也可写成A aa2 = new B();),程序运行就正确。这是因为将bb转换成aa,但是aa指向的还是父类对象,父类对象在逻辑上不能强制转换为子类对象,但是将bb赋给aa之后,aa指向的就是子类对象,这时候就可以进行强制转换,从而实现将父类对象转换为子类对象。(也就是说,把狗看作动物是无条件的,但是把动物看作狗的前提是:动物是“指向”狗的)