(一)定义
一个父类的引用类型变量既可以指向父类对象也可以指向子类对象,它可以根据当前时刻指向对象的不同,自动调用不同对象的方法。
class A{
public void f(){
System.out.printf("AAAA\n");
}
}
class B extends A{
public void f(){
System.out.printf("BBBB\n");
}
}
class TestDuo{
public static void main(String[] args){
A aa=new A();
aa.f(); //输出AAAA
B bb=new B();
bb.f(); //输出BBBB
aa=bb;
aa.f(); //输出BBBB
}
}
(二)优点
同一段代码做不同的事。
class A{
public void f(){
System.out.printf("AAAA\n");
}
}
class B extends A{
public void f(){
System.out.printf("BBBB\n");
}
}
class C extends B{
public void f(){
System.out.printf("CCCC\n");
}
}
class TestPloy{
public void g(A aa){
aa.f();
}
public static void main(String[] args){
A aa=new A();
B bb=new B();
C cc=new C();
g(aa);
g(bb);
g(cc);//可以理解为传递的参数是cc的地址
}
}
//运行结果为:AAAA
// BBBB
// CCCC
(三)注意事项
1、子类对象可以直接赋给父类引用,但父类对象无论何种情况都不能直接赋给子类引用;
2、父类引用只能访问子类对象从父类继承过来的成员,即父类引用不能访问子类对象特有的成员;
3、只有父类引用本身就是指向子类对象时,才能把父类强制类型转化为子类引用,即其它情况下不允许把父类引用强制转化为子类引用,否则运行时会出错。
class A{
public void f(){
System.out.printf("AAAA\n");
}
}
class B extends A{
public void f(){
System.out.printf("BBBB\n");
}
}
class TestTai{
A aa=new A();
B bb=new B();
aa=bb;
bb=(B)aa;
bb.f();
}
//输出为:BBBB