【发布时间】: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