2015-11-29 3 views
1
class Base { 
    private void SayHello(){ //PRIVATE 
     System.out.println("Hello from Base"); 
    } 
} 

class Derived extends Base { 
    public void sayHello(){ //PUBLIC 
     System.out.println("Hello from Derived"); 
    } 
} 

public class TestHello{ 

    public static void main(String[] args) { 
     Derived d = new Derived(); 
     Base b = d; 

     d.sayHello(); //works as expected 
     b.sayHello(); //Why does this not work? 
    } 
} 

Я хочу понять: это частное sayHello из базового класса, видимого для производного класса? или это переопределение? И почему вызов вызванного sayHello из базового указателя не работает? Я имею в виду, если бы он был общедоступным (в базе), тогда было бы вызвано sayHello из производного класса. Итак, я не могу понять, что если он должен вызывать public sayHello из производного класса, то зачем смотреть на модификатор доступа из базового класса?Как динамическая привязка работает для частных методов в базовом классе в Java?

Кроме того, если вы можете указать мне на какой-то краткий ресурс, который поможет мне разобраться в этом более подробно, я бы очень признателен этому. Благодаря!

+0

Когда вы предоставляете метод экземпляра в подклассе, который переопределяет реализацию родителей, это метод, который вызывается, а не родители. –

ответ

1

является частным sayHello из базового класса, видимым для производного класса?

Конечно, нет, поскольку он имеет private модификатор доступа.

Подробнее о модификаторов доступа:

Controlling Access to Members of a Class

or is it a redefinition? 

Как вы можете видеть в принятом ответ на этот вопрос:

What's the difference between redefining a method and overriding a method?

термин "переопределение" не обычно используется. Мы можем говорить о «переопределении» и «перегрузке», но в вашем случае sayHello от класса Derived - это своего рода новый метод, и это не перегруженная версия sayHello от класса Base.

И почему вызов производного sayHello от базового указателя не работает?

Просто потому, что вы пытаетесь вызвать метод, который не принадлежит интерфейсу открытого класса.

Я имею в виду, если бы он был общедоступным (в базе), тогда было бы вызвано слово из класса .

Конечно, это ожидаемое полиморфное поведение. В этом случае, sayHello из Derived класса переопределяет sayHello из Base класса, так что вы можете позвонить sayHello из Derived класса по отношению к Base в классе.

Итак, что я не могу понять, что если он должен вызвать общественный SayHello из производного класса, то почему бы посмотреть на модификатора доступа из базового класса?

Поскольку вы используете ссылки на Base класса и нет sayHello метода в интерфейсе Base класса.

Я нашел хорошее обсуждение здесь:

Overriding private methods in Java

Может быть также полезен для вас:

Overriding and Hiding Methods

Надеется, что это поможет.

+0

Спасибо за такой ясный ответ! –

0

b.sayHello() не работает, потому что когда вы вызываете метод sayHello(), компьютер начинает поиск метода в базовом классе, и когда он найдет метод, он увидит, что это частный метод, поэтому он скажет вам, что вы не можете его использовать.

С другой стороны, d.sayHello() работает, потому что компьютер начнет искать sayHello() в выведенном subClass, и когда компьютер найдет его, он позволит вам использовать его, потому что он является общедоступным.

1

Поскольку линия ниже просто присваивает в качестве ссылки на переменную объекта Derived

Base b = d; 

private и методы являются частными к объектам и не видны за пределами класса.