【问题标题】:Access to protected method [duplicate]访问受保护的方法
【发布时间】:2020-07-26 22:55:09
【问题描述】:

Ex15.java

import utils.A;

public class Ex15  extends A{
    public static void main(String[] args){
        A a = new A();
        a.print("Test");
    }
}

**utils/A.java**

package utils;

public class A {
    public A(){
        System.out.println("A created");
    }

    protected void print(String s){
        System.out.println(s);
    }
}

michael@michael:~/Downloads/thinking_in_java/Reusing_Classes/Ex15$ tree
.
├── Ex15.class
├── Ex15.java
└── utils
    ├── A.class
    └── A.java

编译:

michael@michael:~/Downloads/thinking_in_java/Reusing_Classes/Ex15$ javac Ex15.java
Ex15.java:6: error: print(String) has protected access in A
        a.print("Test");
         ^
1 error

文档

https://docs.oracle.com/javase/specs/jls/se14/html/jls-6.html#jls-6.6.2.1

引用:

令 C 为声明受保护成员的类。访问是 只允许在 C 的子类 S 的主体内。

一个子类S被认为是负责实现 类 C 的对象。根据 C 的可访问性,S 可能是 在与 C 相同的包中声明,或在相同的不同包中声明 模块作为 C,或完全在不同模块的包中。

问题

Ex15 类是 A 的子类。它位于不同的包中(在默认包中,但绝对不在“utils”中)。对受保护方法的访问在子类的主体内。没想到会出现编译错误。

您能否解释一下为什么会出现这个错误以及如何编译代码。

【问题讨论】:

  • 静态方法不是对象的一部分,它们只在类中定义。
  • 您应该将驱动程序与示例类分开。

标签: java


【解决方案1】:

您正在尝试调用具有从该点看不到的范围的方法。即使您的类是子类,它也无法访问该方法,因为它不在其可见性中。您可以调用 Ext15 类的私有/受保护方法,而不是 A 类。A 仍在另一个包中。

尝试查看here 以获得更好的解释。

【讨论】:

    【解决方案2】:

    这是因为您调用 a.print("Text") 不是作为子类。当您创建这样的超类时,就像创建任何其他不是子类的类一样。

    protected 可以作为super.print("Text") 之类的子类访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 2014-12-19
      • 2012-08-06
      • 2014-12-29
      • 2013-04-06
      • 2014-10-31
      • 1970-01-01
      • 2020-05-02
      相关资源
      最近更新 更多