2015-12-03 2 views
0

У меня есть два класса в JavaНаследование Java супер класс и тип литья

Class A { void method1(){} } 
Class B extends A { void method2(){} } 

Когда я запускаю после него работает отлично:

Class C { 
    public static void main(String [] args){ 
    A a1 = new A(); 
    A a2 = new B(); 
    B b1 = new B(); 
    ((B)a2).method2(); 
    } 
} 

но почему следующее не работает?

Class C { 
    public static void main(String [] args){ 
    A a1 = new A(); 
    A a2 = new B(); 
    B b1 = new B(); 
    (B)a2.method2(); 
    } 
} 

Благодаря

+0

То, что вы пытаетесь выполнить, - это возвращаемое значение. –

ответ

1

Как Кабир сказал, вам нужно сначала преобразовать объект перед вызовом метода из другого объекта.

Это потому, что Java читает ваше второе заявление как: (B) (a2.method2();)

Так ява пытается использовать метод два в объект a2, но он не может, потому что нет в этом объекте не method2().

Однако, когда вы набираете брось (Поставив (В) перед а2 в скобках), он читает это нравится:

(Turn a2 into B).method2();

Который работает нормально, потому что она превращается а2 в В, включает метод 2, заранее.

В простом сравнении с математической концепцией это похоже на порядок операций над тем, как вы вычисляете значения. Вы не сказали бы 5 + 5 * 2 = 20, вы бы сказали 5 + 5 * 2 = 15, потому что он сначала вычисляет 5 * 2, а затем добавляет 5.

+0

спасибо, теперь понятно – thepiyush13

+0

приветствуются! –

1

Вы должны вызвать метод после литья. Вам нужно скобки a2 т.е.

((B)a2).method2(); 
+0

но почему? потому что оба заявления бросают его на B – thepiyush13

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