Powiel możliwe:
The concept of shadowingW jaki sposób Java obsługuje pola podczas upcastingu?
Jestem mylić o tym, jak pola klasy są obsługiwane w Javie podczas upcasting. Np
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);
}
}
wyjściowa:
Method in SubClass
String in SuperClass //Why is "String in SubClass" not used?
Podczas tworzenia przedmiotu test
jest wystąpienie SubClass
klasy; jednak mówię kompilatorowi, aby traktował to jako SuperClass
. Wszystko jest dla mnie jasne, jeśli chodzi o metody pracy: będę mógł używać tylko metod SubClass
, jeśli określona metoda jest zdefiniowana dla SuperClass
.
Jednak nie wiem, dlaczego pole SuperClass
jest używane, gdy próbuję uzyskać dostęp do myString
z test
. Ponieważ test
jest instancją SubClass
, należałoby się spodziewać, że zostanie użyte myString
zdefiniowane w SubClass
, dlaczego tak się nie dzieje? czego mi brakuje?
Wiem, że mogę uzyskać dostęp, myString z SubClass
przy użyciu operatora this
. Na przykład, można zdefiniować printMyString
metodę w SuperClass, i zastąpić ją
public void printMyString()
{
System.out.println(this.myString);
}
W SubClass
, więc moje pytanie jest głównie o tym, jak się pole z SuperClass
jest stosowany w test
. Może brakuje mi czegoś oczywistego?
Próbowałem wyszukać odpowiedź, a najbliższy temat, który znalazłem, był Upcasting in Java and two separate object properties, chociaż pomocny, nie odpowiedział na moje pytanie.
góry dziękuję
dobre pytanie @Akavall –