受保护的访问说明符在Eclipse中的子类中给出意外的编译时错误

时间:2018-05-15 05:08:14

标签: 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;
}

我创建了另一个文件,我在这里扩展了这个类,用于研究受保护的访问说明符属性,如下所示: -

//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);
        }
}

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

奇怪的是,Eclipse要求我将protected关键字添加到已经受保护的变量中。请在此处查看屏幕截图ScreenShot

我已经清理过& amp;重建了这个项目,并重新启动了日食。

如果有人能够弥补我对java / eclipse / oops的了解,我将不胜感激,无论我在这里缺少什么。提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

protected访问修饰符表示

  1. 如果类定义如下:

    package com.j2se.access_specifiers;
    
    public class ProtectedAccessSpecifierRnD {
        protected int protectedIntVar;
        protected String protectedStrVar;
    }
    
  2. 同一个软件包中的所有类都可以通过其对象显式访问protected字段,而无需任何setter或getter方法。

    1. 其他软件包中的所有类都可以在其代码中访问 parent 类的protected个字段,例如在他们的方法或构造函数中:

      public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{
      
          public ProtectedAccessSpecifierRnD2() {
              protectedIntVar = 0;
              protectedStrVar = "Test";
          }
      }
      
    2. 但是在你的代码中,你是在子类的代码中从父类创建一个对象,这不应该从头开始工作。

      简而言之:

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

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

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

      希望这有帮助。

答案 1 :(得分:0)

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

这应该有效