2016-09-22 5 views
0

Итак, я изучал абстрактные классы и динамическое связывание и решил проверить несколько примеров.Аннотация класс и динамическое связывание

У меня есть следующие 3 класса: AbstractDemo (main), MyAbstract и MySubAbstract. Основным методом является вызов методов из обоих классов с использованием динамического или статического привязки.

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

Может кто-нибудь объяснить, почему?

public abstract class MyAbstract { 
public abstract void abs1(); 
public abstract void abs2(); 

public void nonAbs1() { 
    System.out.println("MyAbstract nonAbs1"); 
} 

public void nonAbs2() { 
    System.out.println("MyAbstract nonAbs2"); 
} 
} 


public class MySubAbstract extends MyAbstract { 

public void abs1() { 
    System.out.println("MySubAbstract abs1()"); 
} 

public void abs2() { 
    System.out.println("MySubAbstract abs2()"); 
} 

public void sub1() { 
     System.out.println("MySubAbstract sub1()"); 
} 

public void sub2() { 
     System.out.println("MySubAbstract sub2()"); 
} 

public void nonAbs1() { 
     System.out.println("MySubAbstract nonAbs1()"); 
} 
} 


public class AbstractDemo { 

public static void main(String[] args) { 
    MySubAbstract a = new MySubAbstract(); a.abs1(); 
    MySubAbstract b = new MySubAbstract(); b.sub1(); 
    MySubAbstract c = new MySubAbstract(); c.nonAbs2(); 
    MySubAbstract d = new MySubAbstract(); d.nonAbs1(); 
    MySubAbstract e = new MySubAbstract(); e.nonAbs2(); 
    MyAbstract f = new MySubAbstract(); f.abs1(); 
    MyAbstract g = new MySubAbstract(); g.nonAbs1(); 
    MyAbstract h = new MySubAbstract(); h.sub1(); 
    } 
} 
+0

Возможный дубликат [Вызов метода класса ребенка от родительского объекта класса] (http://stackoverflow.com/questions/11466441/call-a-child-class-method-from -a-parent-class-object) –

ответ

1

MyAbstract ч = MySubAbstract(); h.sub1();

Это создаст и объект MySubAbstract и сохранить его в качестве ссылки типа MyAbstract, который означает, что вы можете только вызывать методы MyAbstract, если вы не брось ((MySubAbstract) h).

см polymorphism в Exemple

+1

Создает объект типа MySubAbstract и сохраняет его в ссылке (или переменной) типа MyAbstract (а не объекта). –

+0

Думаю, я не совсем понял, что происходит. Благодаря! – rmettig

+0

@DavideLorenzoMARINO, вы правы, я пошел быстро объяснять. Я отредактировал эту часть –

2

Из кода h объявлен как MyAbstract, так что без явного кастинга вы можете получить доступ только методы, объявленные в MyAbstract (как абстрактных и конкретных методов).

Для вызова sub1() вам нужно бросить его

MyAbstract h = new MySubAbstract(); 
((MySubAbstract) h).sub1();