2017-01-18 3 views
-1
class A{ 

    void a(){ 
     System.out.println("hello a"); 
    } 
} 

class B extends A{ 

    void b(){ 

     System.out.println("hello b"); 
    } 
} 


public class test{ 

    public static void main(String[] args){ 

     A a= new B(); 
     a.b(); 

    } 
} 

Это не дает ошибку компиляции, но дает запустить ошибку времени, но когда я сделать то же самое с переопределением, что я определить метод b() в class A также, что время, выполняет метод в Class B, но когда имена метода различаются в то время, он не может выполнить метод в class B. Пожалуйста, объясните?родитель ссылка переменной классы не в состоянии доступа к методам в дочернем классе

+0

"Это не дает ошибки компиляции" - Невозможно. Этот код не должен компилироваться. Убедитесь, что код, который вы компилируете, такой же, как и во время выполнения. И, пожалуйста, ознакомьтесь с основами объектно-ориентированного программирования. – JimmyB

+0

У вас есть идея о наследовании? Где-нибудь в любой книге написано, что ссылка родительского класса может получить доступ к методу дочернего класса? Лол. –

ответ

0

Это даст ошибку компиляции, поскольку причина привязки метода выполняется во время компиляции на основе ссылки, так как в классе A нет метода b(), поэтому класс не имеет понятия об этом методе, почему ошибка компиляции.

Второй метод будет вызван, потому что во время выполнения jdk знает тип объекта, поэтому будет вызван метод объекта. Следовательно, будет вызван метод B.

Вы также можете удалить ошибку компиляции, добавив пустой метод пустоты Ь() в классе А, так что теперь класс А знает о методе Ь(), но при б RUNTIME Б() будет называться

class A{ 

    void a(){ 
     System.out.println("hello a"); 
    } 

    void b(){ 

    } 
} 

class B extends A{ 

    void b(){ 

     System.out.println("hello b"); 
    } 
} 


public class Test{ 

    public static void main(String[] args){ 

     A a= new B(); 
     a.b(); 

    } 
} 

Чтобы не получить ошибку компиляции и только ошибку времени выполнения, попробуйте это

A b=new A(); 
((B)b).b(); 
Смежные вопросы