2015-07-13 3 views
0

Я хотел бы знать, почему это не работает, так как в том, почему не компилятор вызывает метод перезагрузки в компьютерном классе ...ссылочные переменные и объекты

Рассмотрим следующий сценарий:

I имеют 3-х классов, как показано ниже:

public class Computer { 
public int compStatus = 0; //0 means off, 1 means on. 

public void turnOn(){ 
    this.compStatus = 1; 
} 

public void turnOff(){ 
    this.compStatus = 0; 
} 

public void restart(){ 
    if(compStatus ==1){ 
    System.out.println("Turning off"); 
    compStatus = 0; 
    System.out.println("Turning on"); 
    compStatus = 1; 
    System.out.println("Restart successful"); 
    } 
} 


} 

Теперь суб-класс:

public class Macintosh extends Computer { 

public void openXCode(){ 
    if(compStatus == 1){ 
     System.out.println("XCode Compiler opened."); 
    } 
    else{ 
     System.out.println("Mac is off."); 
    } 
} 

public void restart(){ 
    System.out.println("Mac restarted"); 
} 

} 

Тестер класс:

public class CompTest { 
public static void main(String[] args){ 

    Computer testObj = new Macintosh(); 
    testObj.turnOn(); 
    testObj.restart(); ///ERROR HERE 
} 
} 

Я знаю, что компилятор проверяет, если метод перезапуска в классе ссылочной переменной «Computer» не класс фактического объекта на другом конце ссылки «макинтош ». Итак, если то, что я сказал, верно, почему не запускается метод перезапуска?

+0

Каков ваш ожидаемый результат от этого кода? «Отключение» «Включение» «Перезапуск успешно»? –

+0

@MattMartin Я бы ожидал, что компилятор вызовет метод перезапуска суперклассов, я знаю, что вы обычно делаете super.restart(), но мне любопытно, почему метод перезапуска классов компьютеров не был вызван. – RamanSB

+1

Попробуйте '((Computer) testObj) .restart();' в проблемной строке. Это поведение, которого вы ожидали? Если это так, я могу написать вам полный ответ, объясняющий, почему это работает, и почему ваш исходный код не сделал то, что вы ожидали. Насколько я понимаю, вы знаете, что можете сделать это так, но просто не знаете, почему исходный код не работает. –

ответ

0

Вы должны вызвать метод базового класса для фактического перезапуска. Ваш метод просто скрывает базовый метод. Вы должны переопределить метод, а затем вызвать его base.restart, чтобы сделать то, что вы хотите.

+0

Метод перезагрузки уже переопределен в подклассе ..., Что такое мой метод и какой базовый метод, вы явно не указываете, к какому методу вы обращаетесь при использовании этих терминов ... 'my 'и' base '. – RamanSB

+1

super.restart(); was not очень ясно, что я пытался передать, я думаю. –

+0

Как работает testObj.restart(), не использует метод перезапуска суперклассов, я бы предположил, что это сделает, если компилятор проверяет только методы в ссылочных переменных класса (супер). – RamanSB

Смежные вопросы