package com.yongan.test;public class C {

protected  int i=2012;}package com.yongan;import com.yongan.test.C;public class D extends C { public static void main(String[] args) {
C c=new D();
                // c.i 是不能访问的
D d=(D)c;
               // d.i 是可以访问的
System.out.println(c == d); // 打印引用地址为true
}}
我想既然内存地址一样的话,就应该可以用c.i访问呀!
难道就因为向上转型后,protected 不能通过对象实例访问?求解!谢谢!

解决方案 »

  1.   

    你override类的equals方法和hashcode方法试试,再比较下看看
      

  2.   

    protected只是指其对子类对见,所以你才能调用d.i;但这并不代表c.i可在D类中访问,能否在D类中访问要看i在C类的访问权限,很不幸除了public其它修饰符都不能让该变量在包外可见。如果你C,D类是同一个包就没问题了。
      

  3.   


    package com.yongan;
    import com.yongan.test.C;public class D extends C{ public static void main(String[] args) {
    C c=new D();
    System.out.println(c.i); //这里有红色波浪线,就不解释了
    D d=(D)c;
    System.out.println(d.i);

    }}
      

  4.   

    这两个在object下是public呀,当然可以访问,
    override clone()?
      

  5.   

    C c=new D();c就是一个指针,指向D(虚拟机分配的一块小内存。)你用c给d赋值,结果是d也指向这快内存空间。因为c,d指向同一个内存空间,所以会返回true即用 "=="就行。如果想用equals 你就得比较就不是比较c,d是否指向同那块小小地盘。用equals是找到c,d分别指向哪个地址,比较这俩地址的内容是否相同。
      

  6.   

    C c=new D();
    向上转型
    c实际上指向的是一个子类对象 c.i 与d.i应该都能访问
    楼主自己好好调试下!
      

  7.   

    这位大哥应该解释的地道!两个类不在同一个包,只是继承关系
    C c=new D();
    c中有属性 i
    调用c.i是不能通过编绎的
    而当我 D d=(c)c 强制转换后,能通过 d.i访问变量!这其中的原因不太明白!
      

  8.   

    protected 访问权限是:本包 和 子类。(1):D类和C类没有在同一包下 ,故不能直接用c.i 访问。 如果i是public权限则可以如此访问,或者把两个类放到同一包下。(2):d.i可以访问的原因是D是C的子类,故有权限访问。(是继承下来得)
      

  9.   

    package Try;public class C {
    protected  int i=2012;}package Try;import Try.C;public class D extends C{ public static void main(String[] args) { C c = new D();
    System.out.println(c.i);
    // c.i 是不能访问的
    D d = (D) c;
    /*
    D dd=new D();
    System.out.println(dd.i);
    */

    System.out.println(d.i);
    // d.i 是可以访问的
    System.out.println(c == d); // 打印引用地址为true }}
      

  10.   

    sorry 我看错了
    楼主不是同一个包
    关于这个问题有人解释了
    而我只表示记住了,保存了http://blog.csdn.net/hongyuan19/article/details/1946636
      

  11.   

    正解!!!!!
    C c=new D();
    System.out.println(c.i);
    是在包外新建的C类对象,在包外没有访问权限!