2015-08-16 6 views
-1

Учитывая следующие классы:полиморфизм в классы Java

public class AA {  
    public int _x; 

    public AA() {  
     this(1);  
    } 

    public AA(int k) {  
     _x = k*10;  
    } 

    public int getX() {  
     return _x ;  
    }  
} 

public class BB extends AA {  
    public int _x; 

    public BB() {  
     this(2);  
    } 

    public BB(int k) {  
     super(k+1); 
     _x = super.getX() + 1; 
    }  

    public int getX() {  
     return _x;  
    }  
} 

Если я выполнить следующую операцию:

a =new BB(); 

Я думаю, что я должен получить значение _x на 31, но это не то, что я я получаю. В моем понимании полиморфизма значение _x должно исходить из класса AA, разве это не так?

+1

Как 'a' объявлен? Что вы используете для изучения значения '_x'? – RealSkeptic

+2

Значение '_x' в' BB' будет '31', а' AA' будет '30'. Разве это не то, что вы получаете? – Codebender

+1

_... но это не то, что я получаю. Почему вы думаете, что не предоставление того, что вы действительно получаете, делает ваш вопрос более ясным, чем нам это говорит? –

ответ

2

Поля не переопределены, только скрыты.

Предположительно вы делаете:

Аа = новый BB();

Что даст 30, если вы получите доступ к a._x, так как вы получите доступ к полю с классом AA.

Но если вы должны были вызвать a.getX(), вы вызовете переопределенный метод и, следовательно, получите 31 (вы получите поле, ограниченное классом BB через метод get).

Вы также получите 31, если вы сделали:

BB B = новый BB();

И доступ к b._x;

1

Полиморфизм применяется только к нестационарным неличным методам. Переменные разрешаются во время компиляции, поэтому a._x будет ссылаться на переменную, объявленную в AA независимо от того, что представляет собой фактический объект.

+0

Строитель BB подает переменную в BB или в AA? Если я вызываю функцию getX() в BB, она возвращает значение в _x из AA или BB? –

+0

Любой '_x' внутри фигурных скобок BB относится к BB' _x'. Метод 'getX' возвращает AA' _x'. – Joni

2

Я полагаю, что вы написали

AA a = new BB(); 

поскольку переменные во время компиляции _x, что вы собираетесь получить является один в классе АА. Таким образом, вы получаете 30 печатных изданий. Если предположить, конечно, что вы делаете:

System.out.println(a._x); 

Следующая должно дать вам 31:

System.out.println(a.getX()); 
    System.out.println(((BB)a)._x); 
2

По словам @drrob, поля только скрыты, не перекрываться. Поскольку полиморфизм является поведенческой концепцией. И даже это имеет значение, как вы объявляете. Чтобы сделать это ясно, Я добавил небольшой код, вызванный из main.

Посмотрите на следующих сценариев

AA a = new BB(); 
System.out.println(" finally1 = "+a._x); 
System.out.println(" finally2 = "+a.getX ()); 
BB a1 = new BB(); 
System.out.println(" finally3 = "+a1._x); 
System.out.println(" finally4 = "+a1.getX()); 

Здесь выход для вывода должен быть следующим:

finally1 = 30

finally2 = 31

finally3 = 31

finally4 = 31