以下是同一问题的略微详细版本。
我们无法访问子类中的受保护变量(超类),其中子类位于不同的包中。我们只能访问supeclass的继承变量。但是如果我们将修饰符更改为'protected static',那么我们也可以访问超类的变量。为什么会那样。?
以下是我试图解释的代码片段。
package firstOne;
public class First {
**protected** int a=7;
}
package secondOne;
import firstOne.*;
public class Second extends First {
protected int a=10; // Here i am overriding the protected instance variable
public static void main (String [] args){
Second SecondObj = new Second();
SecondObj.testit();
}
public void testit(){
System.out.println("value of A in Second class is " + a);
First b = new First();
System.out.println("value in the First class" + b.a ); // Here compiler throws an error.
}
}
预计会出现上述行为。但我的问题是,如果我们将超类实例变量'a'的访问修饰符更改为'protected static',那么我们也可以访问变量(超类的变量)。我的意思是,
package firstOne;
public class First {
**protected static** int a=7;
}
package secondOne;
import firstOne.*;
public class Second extends First {
protected int a=10;
public static void main (String [] args){
System.out.println("value in the super class" + First.a ); //Here the protected variable of the super class can be accessed..! My question is how and why..?
Second secondObj = new Second();
secondObj.testit();
}
public void testit(){
System.out.println("value of a in Second class is " + a);
}
}
上面的代码显示了输出:
超级7中的值
test1类中x的值为10
这怎么可能......?
答案 0 :(得分:3)
从“检查对Java虚拟机中受保护成员的访问”:
让 m 成为属于 p 包的 c 类中声明的成员。如果 m 是公共的,则可以通过(代码输入)任何类访问它。如果 m 是私有的,则只能通过 c 访问它。如果 m 具有默认访问权限,则只能由属于 p 的任何类访问它。
如果 m 受到保护,事情会稍微复杂一些。首先,可以访问 m 属于 p 的任何类,就好像它具有默认访问权限一样。此外,它可以被属于不同于 p 的包的 c 的任何子类 s 访问,具有以下限制:if < em> m 不是静态的,那么正在访问其成员的对象的类 o 必须是 s 或 s的子类,写 o ≤ s (如果 m 是静态的,则限制不适用: m 可以是始终由 s )访问。
我发现JLS, section 6.6.2.1中的引用支持关于“正在访问其成员的对象必须是 s 或子类......”的部分。我没有看到任何支持静态子句的东西,但根据你自己的例子,它显然是正确的。
答案 1 :(得分:0)
覆盖仅适用于方法,而不适用于类变量。没有覆盖变量的东西。您正在隐藏访问超类变量a的符号。