gpt4 book ai didi

java - protected 访问说明符在 Eclipse 中的子类中给出意外的编译时错误

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:47 24 4
gpt4 key购买 nike

// This package and class are in ProtectedAccessSpecifierRnD.java file
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
protected int protectedIntVar;
protected String protectedStrVar;
}

我创建另一个文件,在其中扩展此类以研究 protected 访问说明符属性,如下所示:-

//This package and class are in ProtectedAccessSpecifierRnD2.java file

package com.j2se.access_specifiers_2;

import com.j2se.access_specifiers.ProtectedAccessSpecifierRnD;

public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{

public static void main(String[] args) {
ProtectedAccessSpecifierRnD obj = new ProtectedAccessSpecifierRnD();
/* Here on below line compile time error comes "The field ProtectedAccessSpecifierRnD.protectedStrVar & ProtectedAccessSpecifierRnD.protectedIntVar are not visible"*/
System.out.println(obj.protectedIntVar+" "+obj.protectedStrVar);
}
}

现在,据我所知,类的 protected 成员(实例变量和方法)对于相同的包类以及继承上述类的其他包类都是可见的。

奇怪的是,Eclipse 要求我将 protected 关键字添加到已 protected 变量中。请也在这里查看屏幕截图 ScreenShot

我已经清理并重建了项目,并重新启动了 Eclipse。

如果有人能够弥补我在 java/eclipse/oops 方面的知识差距,无论我在这里缺乏什么,我将不胜感激。提前致谢。

最佳答案

编译错误是正确的,我认为你只是错过了一点!

protected 访问修饰符意味着

  1. 如果一个类定义如下:

    package com.j2se.access_specifiers;

    public class ProtectedAccessSpecifierRnD {
    protected int protectedIntVar;
    protected String protectedStrVar;
    }

同一包中的所有类都可以通过其对象显式访问 protected 字段,而无需任何 setter 或 getter 方法。

  • 其他包中的所有类都可以在其代码中访问类的 protected 字段,例如在其方法或构造函数中:

    public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{

    public ProtectedAccessSpecifierRnD2() {
    protectedIntVar = 0;
    protectedStrVar = "Test";
    }
    }
  • 但是在您的代码中,您正在子类的代码中从父类创建一个对象,这从一开始就不应该起作用。

    简而言之:

    如果任何对象是从父类创建的,则只有同一包中的类可以通过其对象变量显式访问它。在其他包中,只有子类可以在其方法或构造函数中显式访问父类的那些 protected 字段。

    由于ProtectedAccessSpecifierRnD2扩展了ProtectedAccessSpecifierRnD,它将继承ProtectedAccessSpecifierRnD非私有(private)非默认(没有任何修饰符)字段。然后您可以说 ProtectedAccessSpecifierRnD2protectedIntVarprotectedStrVar 字段作为自己的字段,因此很明显您可以通过 ProtectedAccessSpecifierRnD2 中的对象访问它们,因为这些字段也是 ProtectedAccessSpecifierRnD2 的字段:

    ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
    System.out.println( obj.protectedIntVar + " " + obj.protectedStrVar );

    希望这有帮助。

    关于java - protected 访问说明符在 Eclipse 中的子类中给出意外的编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50342689/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com