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
buona domanda @Akavall –