我在理解 java 中的 protected 访问修饰符(或其背后的设计)时遇到了一些麻烦。我认为这意味着包访问和通过继承包含抽象成员的类的对象进行访问。
我写了下面的示例代码。我看到如果未注释,注释掉的行会产生编译错误。为什么我可以通过 Second 中的 Second 对象访问 pro 而不能通过 Second 中的 First 对象访问?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
最佳答案
webpage @MadProgrammer 链接给出了一个体面的解释:
"The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package."
这意味着必须通过定义它的类或所述类的子类直接访问 protected 成员,同时还要在适当的包中。这并不一定意味着您可以通过在所述类的子类中创建的所述类的实例访问 protected 成员。重点是涉及的包。
以下是您的示例:
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个包访问有问题的成员? 第一
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,First
定义在package first
中,所以protected
成员可以从First
访问先打包
。
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个包访问有问题的成员? 第二个
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 不,First
是在 package first
中定义的,因此 protected
使得成员无法从 First
访问 包秒
.
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个包访问有问题的成员? 第二个
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,在package second
中定义的Second
继承了First
的成员,所以protected
成员可从 package second
中的 Second
访问。
为清楚起见,更多示例:
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个包访问有问题的成员? 第一
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,Second
继承了First
的成员,定义在package first
中,所以protected
成员可从 package first
中的 Second
访问。
package first; // Current package
Third third = new Third(); // from package third and extends Second from package second,
// which extends First from package first
third.pro();
试图从哪个包访问有问题的成员? 第一
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,Third
继承了 Second
的成员,Second
继承了定义成员的 First
(package first
),所以 protected
成员可以从 package first
中的 Third
访问。
关于java - Java 中 protected 访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939002/