2013-02-18 12 views
9

Uczę się java. Mam wątpliwość w dziedziczeniu. Gdy klasa podrzędna rozszerza klasę nadrzędną, a klasa nadrzędna ma metodę, która odwołuje się do zmiennej instancji zadeklarowanej w obiekcie nadrzędnym. Jednak dity klasy potomnej zastępują tę metodę i zadeklarowały zmienną instancji o tej samej nazwie, co nazwa nadrzędna. W tym przypadku zmienna instancji od dziecka zostanie przekazana lub rodzic zostanie skierowany. Poniżej znajduje się fragment koduDziedziczenie Java zmienna instancji

class parent { 
    int a; 
    parent() { 
     System.out.println("in parent"); 
     a = 10; 
    } 
    void method() { 
     System.out.println(a); 
    } 
} 
class child extends parent { 
    int a; 
    child() { 
     System.out.println("in child"); 
     a = 11; 
    } 
} 

public class Test { 
    public static void main(String args[]) throws IOException { 
     parent p1 = new child(); 
     p1.method(); 
    } 
} 

Wyjście mogę to

w rodzica
u dziecka

Może ktoś proszę mnie zrozumieć, dlaczego wystąpienie swojego krajowego klasy nadrzędnej jest zmienna a i nie klasa dla dzieci a.

Inną wątpliwość jest, zrozumiałem, ukrywanie metody, gdy istnieje statyczna metoda w rodzicu i klasa potomna również zadeklarowała metodę statyczną z tą samą sygnaturą. Tu ukrywanie oznacza? jaka metoda jest ukrywana? Jeśli jest to metoda rodzica, czy możesz mi wyjaśnić?
Z góry dziękuję.

+2

Czy na pewno Twój kod się kompiluje? Czy uruchomiłeś swój kod? –

+1

To nie powinno się kompilować, rodzic nie ma metody "method()' –

+0

Przepraszamy, że została źle sformatowana. zaktualizował kod teraz. – Mojoy

Odpowiedz

17
  1. Java zmienne instancji nie może być przesłonięta w podklasie. Dziedziczenie Java nie działa w ten sposób.

  2. W twoim przykładzie nie ma metody ukrywania (lub przesuwania lub przeciążania).

  3. Istnieje jednak ukrywanie zmiennych instancji. W klasie child, deklaracja a ukrywa deklarację a w parent i wszelkie odniesienia do a w klasie child odnieść się do nie child.aparent.a.

Aby to zilustrować jaśniej, spróbuj uruchomić to:

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    parent p1 = c1; 

    System.out.println("p1.a is " + p1.a); 
    System.out.println("c1.a is " + c1.a); 
    System.out.println("p1 == c1 is " + (p1 == c1)); 
} 

Powinno wyjściowa:

p1.a is 10 
    c1.a is 11 
    p1 == c1 is true 

To pokazuje, że istnieje jeden obiekt o dwóch różnych polach zwanych a .. i możesz zdobyć obie ich wartości, jeśli dostęp na to pozwala.


Wreszcie, należy nauczyć się przestrzegać standardowych konwencji identyfikatorów Java. Nazwa klasy powinna ZAWSZE zaczynać się od dużej litery.

2

Instance variables are not overriden in sub-class. Jeśli zdefiniujesz zmienną w klasie o tej samej nazwie, co w klasie super, nazywa się shadowing zmiennychinheretence and polymorphism nie ma zastosowania do zmiennych instancji. jeśli zdefiniujesz metodę() w obiekcie nadrzędnym i nadpisasz ją w klasie Dziecko. poniżej by wywołać metodę dziecka() ze względu na run-time polimorfizm drukowania

parent p1 = new child(); 
  1. wywołuje konstruktor Child
  2. z konstruktora super() wywołanie powołać się za rodzica
  3. druku „na rodzica "i inicjuje rodzica do 10
  4. druku u dziecka i inicjuje Chils a do 11

    p1.method();// this invokes Child's method() during run-time 
    
0

Problem polega na utworzeniu instancji podrzędnej i zapisaniu jej w referencji do elementu nadrzędnego. W związku z tym, gdy użytkownik uzyskuje dostęp do właściwości obiektu, JVM odwołuje się do wartości zmiennej rodzica.

W przypadku, gdyby były to zmienne referencyjne klasy potomnej, otrzymalibyśmy wartość zmiennej dla klasy podrzędnej.

Powyższe to funkcja Java.

0

Podczas tworzenia wystąpienia rodzica. więc w czasie wykonywania kompilator wywołuje obiekt nadrzędny, wypróbuj poniższy kod.

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    c1.method(); 
} 
1

Po wykonaniu tej

Parent P1 = nowy child();

co zrobić JVM jest

   first Initialize Parent() 

         || 

       second Initialize Child() 

Więc najpierw konstruktor nadrzędna sprawdzony i wtedy dzieckiem, ale wartość wyjściowa będzie 11, ponieważ P1 odnosi się do obiektu dziecka.

1

jak nie jesteś przesłanianie() metoda w klasie dziecko, gdy oświadczenie,

parent p1 = new child(); 

jest wykonywany w wersji nadrzędny() metoda zostanie wykonana, a jedyną wartością znane klasy dominującej własny. dlatego wypisze a = 10 (jak to jest na stosie w tym czasie).

Wreszcie, po prostu śledzisz zmienną a od klasy rodzica do klasy dziecka.

Powiązane problemy