为什么继承静态变量可以被非静态子类方法访问?

时间:2014-04-19 08:04:50

标签: java inheritance

我有一个问题,为什么任何继承的静态变量和方法都可以被子类的非静态方法访问。它是否违反了关键字static? 代码

package com.pack1;
public class MyClass {
    static protected int testpro =100;

    protected static void  chkstat()
    { 
        System.out.println("check stat");
    }
}


package com.pack2;
import com.pack1.MyClass;
public class Test extends MyClass {
    public void fromsup() {
        System.out.println("" + this.testpro + "");
        testpro = 200;
        chkstat();
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Test tt = new Test();
    tt.fromsup();   
    }
}

3 个答案:

答案 0 :(得分:0)

不仅仅是子类,它们也可以被访问,就好像它们也是类本身中的实例变量一样。这只是Java语法的一个怪癖,它在JLS中提到,§8.3.1.1§15.11(特别是§15.11.1)。基本上,评估.之前的表达式(在您的情况下,它是一个非常简单的表达式:this),如果它引用一个实例,则该结果被丢弃,只有类型信息是使用

答案 1 :(得分:0)

如果希望子类无法访问它们,则可以创建私有静态方法和变量。适用相同的访问规则原则。

答案 2 :(得分:0)

由于该类的所有实例共享静态变量的相同副本(在您的情况下来自upup),我不会看到任何类型的违规行为。

考虑一下

Test ob=new Test();
ob.fromsup=12;
Test oc=new Test();
System.out.println(oc.fromsup);

输出仍为12 ..