Perché le variabili di istanza di una superclasse non sono nascoste nell'eredità?Ereditarietà Java - variabili di istanza che prevalgono
risposta
Poiché l'ereditarietà è intesa a modificare il comportamento. Il comportamento è esposto attraverso i metodi, ed è per questo che possono essere sovrascritti.
I campi non sono il comportamento ma lo stato. Non è necessario modificarlo né i metodi privati utilizzati dalla superclasse. Hanno lo scopo di permettere alla superclasse di fare il suo lavoro.
È possibile nascondere un campo, ma non override it.
Nascondere significa che un campo avrà un valore diverso a seconda della classe a cui è stato effettuato l'accesso. Il campo nella sottoclasse "nasconderà" il campo nella super-classe, ma entrambi esistono.
Questa è una pratica estremamente cattiva per nascondere campo, ma funziona:
public class HideField {
public static class A
{
String name = "a";
public void doIt1() { System.out.println(name); };
public void doIt2() { System.out.println(name); };
}
public static class B extends A
{
String name = "b";
public void doIt2() { System.out.println(name); };
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.doIt1(); // print a
b.doIt1(); // print a
a.doIt2(); // print a
b.doIt2(); // print b <-- B.name hides A.name
}
}
A seconda che il metodo è stato sovrascritto , il campo in A
o B
si accede.
Non farlo mai! Non è mai la soluzione al tuo problema e crea bug molto sottili legati all'ereditarietà.
Perché:
Può rompere il codice
parent class
. Ad esempio si consideri seguente codice (Quale sarebbe il comportamento della lineaobB.getInt();
nel codice seguente se, variabili di istanza imperativi è consentito):class A { int aInt; public int getInt() { return aInt; } } class B extends A { int aInt; public int getInt2() { return aInt; } public static void main(String[] args) { B obB = new B(); //What would be behavior in following line if, //instance variables overriding is allowed obB.getInt(); } }
Non è logica perché
child class
dovrebbe avere/riflettere tutti i comportamenti diparent class
.
Quindi, solo è possibile nascondere le ereditati metodi/variabili in child class
ma non può override
.
seguito è riportato un estratto Java doc from Oracle specificare quale operazione è possibile eseguire/aspettare da child class
:
È possibile utilizzare i membri ereditati come è, sostituirli, li nasconde, o integrare con i nuovi membri :
- I campi ereditati possono essere utilizzati direttamente, proprio come qualsiasi altro campo.
- è possibile dichiarare un campo nella sottoclasse con lo stesso nome di quello nella superclasse, nascondendo così (non raccomandato).
- 1. Variabili di istanza Java vs variabili locali
- 2. Variabili di istanza della classe Ruby ed ereditarietà
- 3. Il monitor java include variabili di istanza?
- 4. Variabili statiche Java e ereditarietà e memoria
- 5. Rails - Variabili locali contro variabili di istanza
- 6. Java variabili di istanza di inizializzazione con il metodo
- 7. Valori predefiniti di variabili di istanza e variabili locali
- 8. Java -Che cos'è una variabile di istanza?
- 9. Java - Variabili di riferimento
- 10. Le migliori variabili di istanza di Scala
- 11. Variabili di istanza nel layout
- 12. Dichiarazione di variabili di istanza che iterano su un hash!
- 13. Ordinamento di inizializzatori variabili di istanza
- 14. ereditarietà Java
- 15. Metodi di istanza e sicurezza thread delle variabili di istanza
- 16. Ereditarietà in Core Java
- 17. Costruttori predefiniti ed ereditarietà in Java
- 18. Perché si consiglia di dichiarare variabili di istanza come private?
- 19. Variabili di istanza rispetto a variabili di classe in Python
- 20. Variabili di istanza di override rapide
- 21. Variabili di istanza di iOS 5
- 22. Java Dove si trovano Variabili locali, riferimenti a oggetti, variabili di istanza
- 23. variabili di istanza della classe python e variabili di classe
- 24. Avviso di ereditarietà generica Java
- 25. Ereditarietà Java vs inizializzazione
- 26. Le variabili di istanza sono le nuove variabili globali?
- 27. Ereditarietà del costruttore Java?
- 28. ereditarietà Java vs polimorfismo
- 29. Ereditarietà multipla in java
- 30. java copy constructor ed ereditarietà
Oh per più upvotes per il consiglio imperativo di NON FARE QUESTO. È molto simile a un signore malvagio che si trasforma in un serpente .... Non aiuta mai. –
Ci sono alcuni motivi per cui potresti voler: specialmente con i campi di classi statiche a cui accedi usando specificamente il nome super o sottoclasse. "Mai" non è mai una buona cosa da dire;) – RichieHH
L'uso di statico è un'altra cosa, Oracle ha lo stesso suggerimento con @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT