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

标签 java eclipse oop inheritance

// 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/

    相关文章:

    java - android异步读取usb

    java - 测试 REST Web 服务时出现空指针异常

    java - 日期之间的天数/月数(仅限年/月)

    java - 在注释处理期间如何从方法获取其参数的注释?

    java - Maven 构建成功,但我的测试用例没有在 Eclipse 中运行

    java - 将 Android 项目导入 Eclipse 时出错

    java - 单击按钮后应用程序停止工作

    ruby - ruby 方法是否应该修改类的实例方法?

    java - 未找到 Java 对象名称中的类中的类

    java - 传递变量与访问类字段