如果类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中的方法和字段呢??

解决方案 »

  1.   

    通常这么用 CCC c = new BBB()
    :)
      

  2.   

    对于c能不能调用BBB中的方法和字段,其结果是不能的,因为c当前的类型是接口CCC,其只能调用CCC接口中定义的方法。但是可以将c显式转换为类型BBB.
      

  3.   

    zhgroup(Hotel California)所说的“可以将c显式转换为类型BBB”,怎么样转化呀?
    CCC c=new BBB();
    BBB b1=(BBB)c;
    是这样吗??
    这样转化后的b1就可以调用BBB的字段和方法了吗?
      

  4.   


    ///
    a是不能调用BBB中的字段的,也不能调用BBB中特有的方法的
    ///a可以调用bbb中的字段只是 a.XX 无法在编译器中通过。因为a的指针中不包含其子类新添加的成员指针信息,但这些新添加的成员却真实的存在于数据堆中.因此,你可以用返射的方式访问到这些新添加的成员
      

  5.   

    Q: 那么a是不能调用BBB中的字段的,也不能调用BBB中特有的方法的。
    ——————————————————————————————————————————
    A: 不对,至少是似是而非。((B)a).MethodDeclareInB(); 是完全可以的。这个问题解决了,下边的也就解决了。
    注意,不论是a还是c,其类型都是BBB,不是AAA或者CCC。这就是“面向对象”给我们的原则。
      

  6.   

    有人说
      AAA a;
    就说明变量a的类型是AAA,这是错误的,至少是似是而非的、根据情况改变的。变量就是一个对象的指针,AAA a只是让编译器知道a应该兼容于AAA的接口而已,至于a在运行时的具体类型,随时可以变化。楼主提出的第二个问题很好,比第一个问题更有深度!c并只知道CCC,并不了解后继BBB,但是仍然可以在运行时通过强制类型转换(其实没有做任何实质上的转换,顶多是做个类型验证)来使用BBB中定义的与CCC无关的方法接口。