是否inheritance了静态变量

我已经读过1000个位置的静态变量没有被inheritance。 但那么这段代码如何正常工作呢?

Parent.java

public class Parent { static String str = "Parent"; } 

Child.java

 public class Child extends Parent { public static void main(String [] args) { System.out.println(Child.str); } } 

此代码打印“父”。

还可以在几个位置读取数据隐藏的概念。

Parent.java

 public class Parent { static String str = "Parent"; } 

Child.java

 public class Child extends Parent { static String str = "Child"; public static void main(String [] args) { System.out.println(Child.str); } } 

现在输出是“Child”。

那么这是否意味着静态变量是inheritance的,但它们遵循数据隐藏的概念

请查看oracle的文档: http : //docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12110

静态变量是inheritance的,只要它们不被具有相同标识符的另一个静态变量隐藏即可。

“inheritance”并不是对正在发生的事情的理想描述; 描述它的更好方法是静态变量在基类的子类之间共享

所有派生类都可以访问其基类的静态变量。 这包括受保护的变量,使用inheritance的变量镜像情境。

隐藏的概念也适用:当一个特定于类的变量str出现在Child类中时,它隐藏了父类的str变量。

请注意,基类的变量str不会变得不可访问: Child仍然可以通过使用Parent类的名称完全限定来访问它。

这不是完全inheritance,它更像是共享可以访问您正在扩展的类的静态属性,除非您通过在子类中声明相同的标识符来隐藏它,请注意,如果是实例属性,则更改值的实例属性inheritance属性它将在为您的对象实例化的超级实例中更改,但如果存在另一个层次结构,该层次结构将被视为对您的层次结构视而不见,则不会受到影响。

在静态的情况下,将更改父属性,并且任何其他层次结构也将采用此效果。