无法使用超类引用访问受保护的实例变量,但能够使用超类引用访问同一超类的受保护函数
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);
}
}
在这种情况下,我能够使用超类引用访问受保护的函数,但无法使用超类引用访问实例变量。
答案 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的子类时才允许访问。
简单来说:在子类中,您无法使用类型为父类的引用访问父类中声明的受保护成员。引用的类型必须是子类(或其后代类)。