class A{
public A(){System.out.println("A created!");}
public int f(){
System.out.println("call A.f()");
return 1;
}
}
class B extends A{
public int f(){
System.out.println("call B.f()");
return 2;
}
public B(){System.out.println("B created!");}
}
class C extends B{
public int f(){
System.out.println("call C.f()");
return 3;
}
}
public class Test01{
public static void main(String args[]){
C c = new C();
System.out.println(((A)c).f());
}
}
将c转型成A,试图调用A中的f(),结果没有如我所愿,为什么呢?
1、这就是java语言的多态性。
2、考虑以下代码:A a = new C();
a.f();
访问方法:a的编译时类型是A,其只能调用A具有的方法,否则编译出错,你可以把A的方法f()改成g()试试。
a的运行是类型是C,所以程序运行时,调用的是C的方法。
访问属性:a的编译时类型是A,其只能调用A具有的属性,否则编译出错,你可以为C添加属性,然后用a访问试试。
a的运行是类型是C,但是程序运行时,调用的是A的属性。
3、考虑你的代码:C c = new C();
编译时、运行时类型都是C,无法访问A的代码。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。