Le variabili statiche sono ereditate

Ho letto su 1000 di posizioni che le variabili statiche non sono ereditate. Ma allora come funziona questo codice?

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

Questo codice stampa “Parent”.

Leggi anche in alcuni punti il ​​concetto di nascondimento dei dati.

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

Ora l’output è “Bambino”.

Questo significa che le variabili statiche sono ereditate ma seguono il concetto di nascondimento dei dati ?

Si prega di dare un’occhiata alla documentazione di oracle: http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12110

Le variabili statiche sono ereditate a patto che non siano nascoste da un’altra variabile statica con lo stesso identificatore.

“Ereditato” non è una descrizione ideale di ciò che sta accadendo; un modo migliore per descriverlo sarebbe quello di dire che le variabili statiche sono condivise tra le sottoclassi della class base.

Tutte le classi derivate ottengono l’accesso a variabili statiche delle loro classi base. Ciò include variabili protette, che rispecchiano la situazione con variabili ereditate.

Si applica anche il concetto di nascondimento: quando una variabile di class specifica str appare nella class Child , nasconde la variabile str della class genitore.

Si noti che la variabile str della class base non diventa inaccessibile: Child può ancora accedervi completando completamente il nome della class Parent .

Questa non è esattamente ereditarietà, è più simile alla condivisione che ha accesso all’attributo statico della class che si sta estendendo, a meno che non lo si nasconda dichiarando lo stesso identificatore nella sottoclass, si noti che in caso di attributo di istanza se si modifica il valore del l’attributo ereditato sarà modificato nella super istanza che è stata istanziata per il tuo object ma se c’è un’altra gerarchia che sarà presumibilmente cieca per la tua gerarchia non sarà influenzata.

In caso di static, l’attributo genitore verrà modificato e qualsiasi altra gerarchia avrà anche questo effetto.