2014-04-19 46 views
0

我有问题,在我的脑海,为什么任何继承静态变量和方法是subclass.Isn`t它违反了关键字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(); 
    } 
} 
+2

* “Isn't它违反关键字的静态?” * - 关键字不能被 “侵犯”。最糟糕的是它可能与你的“静态”应该如何表现的心理模型相矛盾。但那只是意味着你的心智模式是不正确的。 –

回答

0

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

0

,如果你希望他们不会被子类入店您可以创建一个私有静态方法和变量。访问规则的相同原则适用。

0

由于(在你的情况fromsup)静态变量的同一副本我看不出有违反任何形式的的类的所有实例共享。

考虑这个

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

输出仍然是12 ..

相关问题