2013-01-01 18 views
6

Eventuali duplicati:
The concept of shadowingIn che modo Java gestisce i campi durante l'upcasting?

Sono confuso su come i campi di classi sono gestite in Java durante upcasting. Ad esempio:

class SuperClass 
{ 
    String myString = "String in SuperClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SuperClass"); 
    } 
} 

class SubClass extends SuperClass 
{ 
    String myString = "String in SubClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SubClass"); 
    } 
} 

class Question 
{ 
    public static void main(String[] args) 
    { 
     SuperClass test = new SubClass(); 
      // object test is an instance of SubClass 
      // but I am telling the compiler to treat it as SuperClass 

     test.myMethod(); 
     System.out.println(test.myString); 

    } 
} 

uscita:

Method in SubClass 
String in SuperClass //Why is "String in SubClass" not used? 

Quando creo un oggetto test è un'istanza di SubClass classe; tuttavia, sto dicendo al compilatore di considerarlo come SuperClass. Tutto mi è chiaro sui metodi di lavoro: potrò utilizzare i metodi dello SubClass, se un determinato metodo è definito per SuperClass.

Tuttavia, mi sono perso perché un campo di un SuperClass viene utilizzato quando si tenta di accedere a myString di test. Poiché test è un'istanza di SubClass, mi sarei aspettato di utilizzaredefinito in SubClass, perché non sta succedendo? Cosa mi manca?

So che posso accedere, myString di SubClass utilizzando l'operatore this. Per esempio, potrei definire printMyString metodo nella superclasse e sovrascriverlo con

public void printMyString() 
{ 
    System.out.println(this.myString); 
} 

Nel SubClass, quindi la mia domanda è per lo più su come mai il campo della SuperClass è usato in test. Forse mi manca qualcosa di ovvio?

Ho cercato di cercare la risposta, e l'argomento più vicino che ho trovato è stato Upcasting in Java and two separate object properties, anche se utile, non ha risposto alla mia domanda.

Grazie in anticipo

+0

buona domanda @Akavall –

risposta

7

Gli attributi non possono essere sovraccaricati come i metodi.

test.myMethod(); 

Qui richiamo del metodo dipende dal tipo di oggetto effettivo. Qui l'oggetto è di tipo SubClass quindi viene richiamato il metodo SubClass.

test.myString 

Durante l'accesso attributi, che dipende dal tipo di variabile riferimento. Qui la variabile di riferimento vale a dire test è di tipo SuperClass quindi si accede all'attributo da SuperClass.

Quello che stai cercando è class variable hiding/shadowing.

+0

Bel collegamento, grazie. La parte fondamentale è: "Quando una variabile di istanza in una sottoclasse ha lo stesso nome di una variabile di istanza in una classe super, quindi la variabile di istanza è scelto nella classe che è il tipo di riferimento." – Akavall

+0

@Akavall: Ya hai colpito il punto :) – xyz

3

I campi in Java sono solo nascosti e non effettivamente sovrascritti (ciò non significa che otterremo un errore di compilazione durante il tentativo, ma non sono sovrascritti nel suo vero significato).

overriding significa l'elemento deve essere richiamata in base al tempo di esecuzione tipo dell'oggetto e non in base al tipo dichiarato.

ma vincolante per i campi in Java è sempre statica e quindi si basa sul tipo dichiarato del riferimento all'oggetto solo.

Nell'esempio che hai dato, dichiarando la variabile classe con il nome di 'myString' in classe SubClass si nasconde la variabile di classe avrebbe ereditato dalla sua superclasse SuperClass con lo stesso nome 'myString'.

Java specifica del linguaggio:

Se la classe dichiara un campo con un certo nome, quindi la dichiarazione di quel campo si dice per nascondere qualsiasi e tutti accessibili dichiarazioni di campi con lo stesso nome in superclassi e superinterfacce della classe.

È possibile accedere a un campo nascosto utilizzando un nome qualificato se è statico oppure utilizzando un'espressione di accesso al campo che contiene la parola chiave super o un cast a un tipo di superclasse.

Problemi correlati