2013-01-01 19 views
6

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ę

+0

dobre pytanie @Akavall –

Odpowiedz

7

Atrybuty cant być przeciążony jak metod.

test.myMethod(); 

Tutaj wywołania metody zależy od rodzaju rzeczywistego obiektu. Tutaj obiekt jest typu SubClass, więc wywoływana jest metoda SubClass.

test.myString 

Podczas uzyskiwania dostępu do atrybutów, to zależy od typu zmiennej referencyjnej. Tutaj zmienna referencyjna, tj. test, jest typu SuperClass, więc dostęp do atrybutu z SuperClass jest możliwy.

To, czego szukasz, to class variable hiding/shadowing.

+0

Niezły link, dziękuję. Kluczowym elementem jest: „Kiedy zmienna instancji w podklasie ma taką samą nazwę jak zmiennej instancji w super klasy, wówczas zmienna instancji jest wybrana w klasie, która jest typem odniesienia”. – Akavall

+0

@Akavall: Ya trafiłeś w sedno :) – xyz

3

Pola w języku Java są tylko ukryte i nie są nadpisywane (co nie oznacza, że ​​otrzymamy błąd podczas kompilacji podczas próby, zamiast tego nie zostaną one przesłonięte w jego prawdziwym znaczeniu).

Zastępowanie oznacza państwo powinny być powoływane na podstawie czasu pracy typu obiektu i nie opierają się na deklarowanej typu.

jednak wiążące dla pól w Javie zawsze jest statyczny, a więc jest ona oparta na zadeklarowanego typu odniesienia obiektu tylko.

W podanym przykładzie deklarując zmienną klasy o nazwie "myString" w klasie SubClass ukrywasz zmienną klasy, którą odziedziczyłby po swojej nadklasie SuperClass o tej samej nazwie "myString".

Java specyfikacja język:

Jeśli klasa deklaruje pole z pewnej nazwie, wówczas deklaracja tej dziedzinie mówi się ukryć wszelkie dostępne deklaracji pól o tej samej nazwie w superklas i superinterfejs klasy.

ukrytym polu można uzyskać za pomocą kwalifikowanej nazwy, jeśli jest statyczna, lub za pomocą wyrażenia dostępu pola zawierającego Super słów kluczowych lub oddanych do typu nadklasy.

Powiązane problemy