Java: почему методы родительского класса видны производному классу?

#java #class #inheritance #methods #java-8

#java #класс #наследование #методы #java-8

Вопрос:

  class Base {
    public void display(int n){ 
        System.out.println(n); 
        
    }}
 class Derived extends Base{ 
    public void display(){ //Line-1 
        System.out.println("display overloaded"); 
            
        }}
public class Tester { 
    public static void main(String[] args){ 
        Derived ref = new Derived(); 
        ref.display(10); //Line-2 
                }}
  

Почему этот код работает?Как методы родительского класса видны и доступны дочернему классу? Разве строка 2 не должна выдавать ошибку, в которой говорится, что такого метода не существует или что определенный метод не должен иметь никаких параметров.

Комментарии:

1. Вы не переопределяете . Вы перегружаете .

Ответ №1:

Это разные методы, для переопределения метода у вас должна быть одна и та же сигнатура метода

 @Override
public void display(int n){ 
  System.out.println("display overloaded"); 
}
  

Добавьте также @Override , чтобы указать, что вы переопределяете базовый метод

Обратите внимание, что вы не можете удалить метод, просто переопределите его (или перегрузите в качестве примера)

Ответ №2:

В java все методы и переменные с public protected модификаторами и access наследуются от родительского класса к дочернему классу. Из-за того, что ваш метод отображения с входным параметром как int display(int n) также наследуется от родительского класса Base to Derived . Результирующий метод также будет доступен базовому классу.

И когда вы создаете метод отображения в своем Derived классе без параметра display() , вы фактически используете концепцию перегрузки метода (не переопределяя). Итак, в вашем Derived классе на самом деле у вас есть два метода с одинаковым именем (разные аргументы) display() и display(int n) .

И именно поэтому вы не получаете такого метода или что определенный метод не должен иметь никаких параметров.

Ответ №3:

Производный метод переопределяет метод в своем суперклассе, но он не принимает никаких аргументов, но вы дали аргумент своему дочернему производному классу, поэтому он находит, какой метод принимает аргумент, и находит, поэтому он не выдает ошибку