2010-03-17 16 views

risposta

23

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.

28

È 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à.

+0

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. –

+0

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

+0

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

1

Perché:

  • Può rompere il codice parent class. Ad esempio si consideri seguente codice (Quale sarebbe il comportamento della linea obB.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 di parent 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).
Problemi correlati