如何在子类中访问超类的“protected static”变量,其中子类位于不同的包中..?

时间:2013-06-24 03:21:13

标签: java

以下是同一问题的略微详细版本。

我们无法访问子类中的受保护变量(超类),其中子类位于不同的包中。我们只能访问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

这怎么可能......?

2 个答案:

答案 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的符号。