在下面的代码中,Consumer类可以访问Parent类的受保护方法。怎么可能,因为Parent和Consumer类之间没有关系。请解释
class Parent {
public void method1(){
System.out.println("PUBLIC METHOD");
}
private void method2(){
System.out.println("PRIVATE METHOD");
}
protected void method3(){
System.out.println("PROTECTED METHOD");
}
}
public class Consumer {
public static void main(String[] args){
Parent parentObj = new Parent();
parentObj.method1();
//parentObj.method2();
parentObj.method3();
}
}
由于
答案 0 :(得分:45)
protected
表示:相同的包或继承。由于您的课程都在default package
(现实生活中不推荐),protected
启用了访问权限。顺便说一下:如果您尝试测试java访问控制,则忘记default access
(default access
=无修饰符= package private
)。
private
访问意味着:除了这个特定的类(以及仍然是主机类成员的非静态内部类)之外,从无处访问。
答案 1 :(得分:7)
以下是Java语言规范的相关摘录:
JLS 6.6 Access Control
Java编程语言提供访问控制的机制,以防止
package
或class
的用户依赖于{{1}的实现的不必要细节}或package
。如果允许访问,则称所访问的实体可访问。JLS 6.6.1 Determining Accessibility
- [...]
- 只有在类型可访问且声明成员/构造函数允许访问时,才能访问引用类型的成员/构造函数:
class
:允许访问。public
:仅当以下其中一项为真时才允许访问:
- 访问该成员或构造函数的行为来自
protected
,其中包含package
成员或构造函数所在的类声明。强>- 访问权限正确,如JLS 6.6.2 Details on
protected
Access中所述。
- 对象的
protected
成员/构造函数可以从protected
外部访问,只能通过负责实现该对象的代码来声明它。package
:当且仅当它出现在包含成员或构造函数声明的顶级类的主体内时才允许访问。- 否则,我们说有默认访问,只有在声明类型的
private
内进行访问时才允许访问。
粗体部分是此方案中问题的答案:package
和Parent
属于同一Consumer
,因此,至少package
protected
的成员可以从Parent
访问。
答案 2 :(得分:3)
答案 3 :(得分:1)
首先,它们属于同一个包装。其次,消费者是父母的内在阶级。
答案 4 :(得分:1)