Son variables estáticas heredadas

He leído en miles de ubicaciones que las variables estáticas no se heredan. Pero entonces, ¿cómo funciona este código?

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); } } 

Este código imprime “Parent”.

Lea también en pocas ubicaciones el concepto de ocultamiento de datos.

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); } } 

Ahora la salida es “Niño”.

Entonces, ¿esto significa que las variables estáticas son heredadas pero siguen el concepto de ocultar datos ?

Eche un vistazo a la documentación de Oracle: http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12110

Las variables estáticas se heredan siempre que no estén ocultas por otra variable estática con el mismo identificador.

“Heredado” no es una descripción ideal de lo que está sucediendo; una mejor forma de describirlo sería decir que las variables estáticas se comparten entre las subclases de la clase base.

Todas las clases derivadas obtienen acceso a variables estáticas de sus clases base. Esto incluye variables protegidas, reflejando la situación con variables heredadas.

El concepto de ocultación se aplica también: cuando aparece una variable str específica de clase en la clase Child , oculta la variable str de la clase padre.

Tenga en cuenta que la variable str de la clase base no se vuelve inaccesible: Child aún puede acceder a ella calificando completamente con el nombre de la clase Parent .

Esto no es exactamente herencia, es más como compartir el acceso al atributo estático de la clase que está extendiendo a menos que lo esté ocultando al declarar el mismo identificador en su subclase, tenga en cuenta que en el caso de atributo de instancia si cambia el valor de la clase El atributo heredado se cambiará en la superinstancia que fue instanciada para su objeto, pero si hay otra jerarquía que supuestamente será ciega a su jerarquía, no se verá afectada.

En el caso de estática, el atributo padre se modificará y cualquier otra jerarquía también tendrá este efecto.