#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:
Производный метод переопределяет метод в своем суперклассе, но он не принимает никаких аргументов, но вы дали аргумент своему дочернему производному классу, поэтому он находит, какой метод принимает аргумент, и находит, поэтому он не выдает ошибку