我是否可以使用超类引用访问受保护的超类实例变量?

时间:2017-06-23 12:28:42

标签: java inheritance

无法使用超类引用访问受保护的实例变量,但能够使用超类引用访问同一超类的受保护函数

package Test;
import Different.Exam;

public class Test  {
    protected int a = 4;

    protected int add(int a, int b){
       return  a+b;
    }
}

子类

package Different;

import Test.Test;

public class Exam extends Test {
   protected void methodWithDefaultAccess(){
       Exam exam = new Exam();
       exam.add(1, 2);
       System.out.println("A in super class is.. "+a);
       System.out.println("A in super class is .." exam.a);
   }
}

在这种情况下,我能够使用超类引用访问受保护的函数,但无法使用超类引用访问实例变量。

1 个答案:

答案 0 :(得分:0)

如果问题是为什么声明引用为Test exam = new Exam();使得exam.a不可访问,那么Java语言规范(http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2)声明:

  

对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码(...)来声明它。设C是声明受保护成员的类。仅允许在C的子类S的主体内进行访问。此外,(...)如果访问是通过字段访问表达式E.Id,其中E是主表达式,或者通过方法调用表达式E. Id(...),其中E是主表达式,当且仅当E的类型是S或S的子类时才允许访问。

简单来说:在子类中,您无法使用类型为父类的引用访问父类中声明的受保护成员。引用的类型必须是子类(或其后代类)。