当前位置: 首页 > 面试题库 >

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

岳亮
2023-03-14
问题内容

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

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

基类:

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 SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 问题内容: 我想对此进行一些讨论,但无法推断出我的情况的答案。仍然需要帮助。 这是我的代码: 在上面的示例中,下面的一些定义似乎令人困惑: 问题: 为什么我不能从子类实例(对象)访问受保护的成员()? 问题答案: 作为声明类的子类的其他包中的类只能访问其自己的继承成员。 …但不是其他对象的继承成员。

  • 我创建了Angular2 Typescript项目。我有很多表格,所以我想有一个类似基本组件的东西。 这是我的基本组件: 现在有我的子组件。我想从http获取所有项目,然后将其分配给基类 知道如何从订阅方法访问基字段吗?

  • 我理解您可以从派生类访问基类的成员,然而,我有一个函数需要指向我的基类作为一个整体的指针。例如: 有没有办法从派生类中获得指向这个基类的指针?

  • 除另有说明外,以下所有标准参考均指N4861(2020年3月布拉格后工作草案/C++20 DIS)。 如果基类是可访问的,则可以隐式地将指向派生类的指针转换为指向该基类[...]的指针。 意味着以下示例格式良好: 因为是上(+)的可访问基类。 [...] /5.3作为的成员受到保护,出现在类的成员或友类中,或者出现在从派生的类的成员中,其中作为的成员是公共的、私有的或受保护的,或者 /5.4存在一

  • 我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。