如果类AAA是类BBB的父类,如果有
AAA a;
BBB b=new BBB();
a=b;
那么a是不能调用BBB中的字段的,也不能调用BBB中特有的方法的。
这个我明白,我想问问
如果类BBB继承了接口CCC,如果有
CCC c;
BBB b=new BBB();
c=b;
那么,这时c能不能调用BBB中的方法和字段呢??
AAA a;
BBB b=new BBB();
a=b;
那么a是不能调用BBB中的字段的,也不能调用BBB中特有的方法的。
这个我明白,我想问问
如果类BBB继承了接口CCC,如果有
CCC c;
BBB b=new BBB();
c=b;
那么,这时c能不能调用BBB中的方法和字段呢??
:)
CCC c=new BBB();
BBB b1=(BBB)c;
是这样吗??
这样转化后的b1就可以调用BBB的字段和方法了吗?
///
a是不能调用BBB中的字段的,也不能调用BBB中特有的方法的
///a可以调用bbb中的字段只是 a.XX 无法在编译器中通过。因为a的指针中不包含其子类新添加的成员指针信息,但这些新添加的成员却真实的存在于数据堆中.因此,你可以用返射的方式访问到这些新添加的成员
——————————————————————————————————————————
A: 不对,至少是似是而非。((B)a).MethodDeclareInB(); 是完全可以的。这个问题解决了,下边的也就解决了。
注意,不论是a还是c,其类型都是BBB,不是AAA或者CCC。这就是“面向对象”给我们的原则。
AAA a;
就说明变量a的类型是AAA,这是错误的,至少是似是而非的、根据情况改变的。变量就是一个对象的指针,AAA a只是让编译器知道a应该兼容于AAA的接口而已,至于a在运行时的具体类型,随时可以变化。楼主提出的第二个问题很好,比第一个问题更有深度!c并只知道CCC,并不了解后继BBB,但是仍然可以在运行时通过强制类型转换(其实没有做任何实质上的转换,顶多是做个类型验证)来使用BBB中定义的与CCC无关的方法接口。