我在派生类中创建了基类的实例,并尝试访问受保护的成员。
我可以直接访问派生类中的受保护成员,而无需实例化基类。
基类:
package com.core; public class MyCollection { protected Integer intg; }
同一包中的派生类-
package com.core; public class MyCollection3 extends MyCollection { public void test(){ MyCollection mc = new MyCollection(); mc.intg=1; // Works } }
不同包中的派生类-
package secondary; import com.core.MyCollection; public class MyCollection2 extends MyCollection{ public void test(){ MyCollection mc = new MyCollection(); mc.intg = 1; //!!! compile time error - change visibility of "intg" to protected } }
当派生类也位于同一包中,而派生类位于不同包中时,如何使用基类的实例访问派生类中基类的受保护成员呢?
如果我将受保护的成员标记为“静态”,则可以使用驻留在不同包中的派生类中的基类实例来访问基类的受保护成员。
没错,您是对的。之所以不能访问该字段,是因为您与该类不在同一个程序包中, 也没有访问同一个类的继承成员 。
最后一点很关键-如果您写过
MyCollection2 mc = new MyCollection2(); mc.intg = 1;
那么这将起作用,因为您要更改 自己 类的受保护成员(该类通过继承出现在该类中)。但是,在您的情况下,您尝试更改其他包中 其他 类的受保护成员。因此,拒绝访问就不足为奇了。