java – 使用基类实例在派生类中访问的受保护成员

我在派生类中创建了基类的实例,并尝试访问受保护的成员.

我可以直接访问派生类中的受保护成员,而无需实例化基类.

基类:

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;

然后这会工作,因为你正在改变你自己的类的受保护成员(通过继承存在于该类中).但是,在您的情况下,您尝试在不同的包中更改其他类的受保护成员.因此,如果您被拒绝访问,那就不足为奇了.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...