尝试在位于其他包中的子类中使用受保护的构造函数时,Eclipse 显示错误

2023-12-06

你好 Stackoverflow 社区 :-]

我是一名新会员,首先我要感谢您提供的非常有帮助的建议和纠正。由于我是法国人,如果我的英语不完美,请原谅我。

这是我的问题:我目前正在学习 Java 编程语言,我想测试一些继承的东西。如果我理解正确的话,一个字段声明为protected可以由与声明 protected 字段的类位于同一包中的类及其所有子类访问,无论它们是否位于同一包中。

所以,我做了这 4 门课来测试这一点。我有一个名为“package1”的包,其中包含类 A 和 C。我还有一个名为“package 2”的包,其中包含类 A2 和 C,其中 A2 扩展了 A。这两个 C 类具有完全相同的代码,只是包所在的位置它们位于变化处。它们不扩展 A。

在 A 类中,我声明了一些具有不同访问属性的成员,尤其是使用protected能见度。这是四个类的代码。

包 1,A 类:

package package1;

public class A {

    public int a;
    protected int b;
    private int c;
    int d;

    protected static int h = 30;

    protected void aff(){
        System.out.println(h);
    }

    protected A(){
        a = 1;
        b = 2;
        c = 3;
        d = 4;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

套餐 1,C 类:

package package1;

public class C {

    public C(){
        super();
    }

    public void app(){
        A obj = new A(); //////// OK
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub


        A obj = new A(); //////// OK
        obj.aff(); //////// OK

        System.out.println(obj.a);

    }

}

package2,A2 类(扩展 A):

package package2;
import package1.A;

public class A2 extends A{

    public int x;

    A2(){
        super();
    }


    public void app(){
        A obj = new A(); //////// ERROR
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub


        A obj = new A(); //////// ERROR

        A2 obj2 = new A2();
        obj2.aff(); //////// OK



    }

}

包2,C类:

package package2;
import package1.A;

public class C {


    public C(){
        super();
    }

    public void app(){

        A obj = new A(); //////// ERROR
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub


        A obj = new A(); //////// ERROR
        obj.aff(); //////// ERROR

        System.out.println(obj.a);

    }

}

对于package2中的C类,代码A obj = new A();抛出错误,但 package1 中的 C 类并非如此。这是正确的,因为构造函数被声明为protectedpackage2 中的 C 不是 A 的子类,而 C 位于 package1 中。至此,我明白了。

我的问题出在代码上A obj = new A();在 A2 类中:无论写到哪里,都会抛出错误The constructor A() is not visible...由于类 A 构造函数声明为protected,为什么我无法在 A2 类中实例化 A 类型的对象?

当我将构造函数声明为public,效果很好。此外,如果我将 A2 类放入 package1 中,让代码保持原样,它也可以工作。似乎只有当子类位于同一个包中并且 A 构造函数声明为时,才可以在 A 的子类中实例化 A 对象protected.

但是,正如你所看到的,如果我首先实例化一个 A2 对象,然后调用 A 类protectedaff() 方法,它可以工作并且尊重受保护的规则。

有人对此错误有解释吗?当在子类中实例化超类的对象时,如果超类构造函数声明为,则该子类是否始终与其超类位于同一个包中protected?如果是的话,为什么会这样呢?

或者这是否必须处理构造函数不被子类继承的事实?但我不明白为什么如果是这样的话......

预先非常感谢您花时间阅读和回答:-]


这很有趣,所以让我尝试总结一下。看JLS#6.6.1

protected可以限定构造函数或类的成员。

“成员”包括字段/方法(静态/实例)、嵌套类/接口(静态/内部)

class A {
    protected int f
    protected void m(){}
    protected class X{}
    protected interface Y{}

首先,要访问受保护的构造函数/成员,封闭类(例如A) 必须是可访问的。假设情况确实如此,那么——

--包装内--

受保护的构造函数或成员可以在同一包中的任何位置访问。

--包装外--

受保护的构造函数只能在子类构造函数中访问,或者作为super()调用,或作为匿名类实例化。

受保护的静态字段/方法、嵌套类/接口可以在子类体内的任何位置访问。


受保护的实例字段/方法更复杂——

  • protected "m" 在 A 类中定义
  • obj.m在B类中访问(在A的包之外)
  • obj的类型是C

访问权限obj.m仅当 B 是 A 的子类且 C 是 B 的子类或 C 是​​ B 时才被授予。

super.m总是允许的;然而,目前还不清楚 JLS 如何解决这个问题。看来访问应该被视为相同this.m,因此允许访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在位于其他包中的子类中使用受保护的构造函数时,Eclipse 显示错误 的相关文章

  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐