2010-09-28 15 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

Hej wszystkim, właśnie przeglądałem przykłady z mojego kursu i natknąłem się na ten problem, który mnie zaskoczył.
Zdaję sobie sprawę, że że kodeks ten powinien wydrukować "7 6 6 3 4 3"Prawdziwe vs Pozorne zajęcia w Javie

Ale dlaczego ab.y równa 3? Czy nie jest "prawdziwym" typem obiektu ab klasy B? Który następnie doprowadziłby mnie do przekonania, że ​​ok. 4 lata?

Odpowiedz

8

Ponieważ uzyskujesz dostęp do pól bezpośrednio, a nie za pomocą metod getter.

Nie można zastąpić pól, tylko metody.

Klasa ma pole y oprócz tego w klasie nadrzędnej A. Te dwa pola nie ingerują w siebie nawzajem, a ich pobranie jest określane podczas kompilacji (według typu znanego kompilatorowi).

Jeśli powiesz

A ab = new B(); 

następnie

ab.y 

zostaną skompilowane patrzeć na polu y zadeklarowanej w klasie A. To nie jest wywoływane w środowisku wykonawczym dla klasy prawdziwej instancji. Podobnie byłoby z metodą statyczną.

Jeśli nie

B ab = new B(); 

następnie pojawi się pole w klasie B.

+0

W porządku, czyści to dużo, dzięki! –