2015-11-09 5 views
-1

плз помочь мне понять mehtod вызова на line2 приведенном ниже фрагмент кода, который вызывающая bMethod() Оранжевый класса, даже если объект Orange отливает к типу рис на LINE1метод во время выполнения вызова на литейных объектах в Java

 interface a{public void aMethod();} 
    interface b{public void bMethod();} 
    interface c extends a,b{public void cMethod();} 
    class Fig implements b{ 
    @Override 
    public void bMethod() { 
     System.out.println("Fig a"); 
    } 
    } 

    class Orange extends Fig implements c{ 

    @Override 
    public void aMethod() { 
     System.out.println("Orange a"); 
    } 

    @Override 
    public void bMethod(){ 
     System.out.println("Orange b"); 
    } 

    @Override 
    public void cMethod() { 
     System.out.println("Orange c");  
    } 

    } 
    public class Q71 { 
     public static void main(String...args){ 
    Fig e = (Fig)(new Orange()); //line 1 -- 
     e.bMethod();    //line 2--invokes Orange's bMethod()? 
    } 
    } 

Справка Plz Я не могу выяснить вызов метода runtime с надлежащей причиной? Заранее благодарен

ответ

0

Полиморфизм здесь работает.

Переменная 'e' содержит ссылку на дочерний объект 'Оранжевый'. Оранжевый переопределил «bMethod()», поэтому для объектов типа «Оранжевый» метод выводит «Оранжевый b». Когда вызов bMethod() был вызван в строке 2, он вызвал метод объекта и вывел 'Оранжевый b' вместо 'Fig a'.

Чтобы проверить, просто прокомментируйте переопределенный 'bMethod()' в классе Orange, и он вызовет метод родительского вызова, напечатав 'Fig a'.

+0

Здравствуйте Андрей, я знаю о времени выполнения полиморфизм, но мой точный сомнение в том, что объект Оранжевый быть отлиты на рис типа объекта, так что теперь мы объект Рис ссылки «да»? Кастинг преобразует один тип объекта в другой? Я понимаю, что если Fig e = new Orange() был случайным, то было бы проблемой вызвать оранжевую версию bMethod() –

+0

@ Kamlesh Sharma: Typecasts не меняют тип объекта. Они меняют только тип * reference *, указывающий на него. Это ключевой момент полиморфизма во время выполнения. Если бы вам приходилось знать точный тип во время компиляции, это не был * полиморфизм времени выполнения *. – Holger

0

В Java это довольно просто, все зависит от того, как вы создаете свой экземпляр, как бы вы его ни называли.

Поэтому, когда вы создаете isntance new Orange(), он всегда будет экземпляром апельсина, и он будет использовать оранжевые методы, независимо от того, выбрали ли вы его или нет.

Эта линия Fig e = (Fig)(new Orange()); не имеет никакого значения для этого Fig e = new Orange();

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