关于继承中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的子类,故有权限访问。(是继承下来得)