我正在学习Java访问修饰符。为此,我创建了一个班级Machine
:
package udemy.beginner.interfaces;
public class Machine {
public String name;
private int id;
protected String description;
String serialNumber;
public static int count;
public Machine(){
name = "Machine";
count++;
description = "Hello";
}
}
然后,在另一个包中,我创建了一个类Robot
作为汽车Machine
的子类:
package udemy.beginner.inheritance;
import udemy.beginner.interfaces.Machine;
public class Robot extends Machine {
public Robot(){
Machine mach1 = new Machine();
String name = mach1.name;
//here I am getting error "The field Machine.description is not visible"
String description = mach1.description;
}
}
尝试访问班级description
中的字段Robot
时收到错误消息。根据我对protected
访问修饰符如何工作的理解,它应该没问题,但也许我搞砸了。有什么想法吗?
编辑:我试图将Robot
类移到与Machine
类相同的包中,现在它可以工作,而不需要使用它。如果有人可以解释我this
。根据下面的答案,它不应该工作......
答案 0 :(得分:4)
protected
变量可以在类外部访问,但只能通过继承访问。所以,如果你把这个陈述改为:
public Robot(){
Machine mach1 = new Machine();
String name = mach1.name;
// This will work (access on `this` reference)
String description = this.description;
}
实际上protected
修饰符意味着,该字段可见,由子类继承,并且只能在那里使用this
引用。
答案 1 :(得分:3)
您无法在该类的其他实例中访问受保护的超类字段。
有一个很好的理由:你不知道它是否与你自己的子类相同,或者是一个完全不同的子类。如果允许访问受保护的字段,则允许您访问完全不相关的类的内部。
如果您确定该对象与想要访问超类字段的类具有相同的子类,则可以转换该对象;当你这样做时,你可以访问受保护的字段。
规则在Java Language Specification section 6.6.2
中描述6.6.2。受保护访问的详细信息
对象的受保护成员或构造函数可以从包外部访问,只能通过代码来声明它 负责该对象的实施。
<强> 6.6.2.1。访问受保护的会员
设C是声明受保护成员的类。访问是 只允许在C的子类S的主体内使用。
此外,如果Id表示实例字段或实例方法,则:
- 如果访问是通过限定名称Q.Id,其中Q是 ExpressionName,当且仅当类型时才允许访问 表达式Q是S或S的子类。 [这是相关部分]