日期:2014-05-20  浏览次数:20749 次

关于继承中protected问题
Java code

package com.yongan.test;

public class C {
    
    protected  int i=2012;

}



Java code

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 不能通过对象实例访问?

求解!谢谢!

------解决方案--------------------
我也想听听
------解决方案--------------------

------解决方案--------------------
你override类的equals方法和hashcode方法试试,再比较下看看
------解决方案--------------------
你确定d.i的时候不会报错 要不你再试试
------解决方案--------------------
protected只是指其对子类对见,所以你才能调用d.i;但这并不代表c.i可在D类中访问,能否在D类中访问要看i在C类的访问权限,很不幸除了public其它修饰符都不能让该变量在包外可见。如果你C,D类是同一个包就没问题了。
------解决方案--------------------
哪有问题、、?
------解决方案--------------------
才看见,你好歹把俩类放在一个包里,就可以访问了
------解决方案--------------------
C c=new D();

c就是一个指针,指向D(虚拟机分配的一块小内存。)

你用c给d赋值,结果是d也指向这快内存空间。

因为c,d指向同一个内存空间,所以会返回true即用 "=="就行。

如果想用equals 你就得比较就不是比较c,d是否指向同那块小小地盘。

用equals是找到c,d分别指向哪个地址,比较这俩地址的内容是否相同。
------解决方案--------------------
C c=new D();
向上转型
c实际上指向的是一个子类对象

 c.i 与d.i应该都能访问
楼主自己好好调试下!
------解决方案--------------------
探讨

C c=new D();
向上转型
c实际上指向的是一个子类对象

c.i 与d.i应该都能访问
楼主自己好好调试下!

------解决方案--------------------
protected 访问权限是:本包 和 子类。

(1):D类和C类没有在同一包下 ,故不能直接用c.i 访问。 如果i是public权限则可以如此访问,或者把

两个类放到同一包下。

(2):d.i可以访问的原因是D是C的子类,故有权限访问。(是继承下来得)
------解决方案--------------------
sorry 我看错了
楼主不是同一个包
关于这个问题有人解释了
而我只表示记住了,保存了

http://blog.csdn.net/hongyuan19/article/details/1946636
------解决方案--------------------
探讨

protected 访问权限是:本包 和 子类。

(1):D类和C类没有在同一包下 ,故不能直接用c.i 访问。 如果i是public权限则可以如此访问,或者把

两个类放到同一包下。

(2):d.i可以访问的原因是D是C的子类,故有权限访问。(是继承下来得)