我有一个问题,为什么任何继承的静态变量和方法都可以被子类的非静态方法访问。它是否违反了关键字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();
}
}
答案 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 ..