Java - 无法从子类访问受保护的字段?

时间:2015-03-08 07:31:11

标签: java protected

我正在学习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。根据下面的答案,它不应该工作......

2 个答案:

答案 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的子类。 [这是相关部分]
  •