Переопределение метода может иметь различное количество параметров в подклассе и родительском классе? Могут ли параметры no.of отличаться?
У нас есть родительский класс и дочерний класс, имеющий общий метод testparent()
но есть разница в параметрах
// Родительский класс
public class Overriding {
int a,b,c;
//Parameters are different in number
public void testParent(int i, int j) {
System.out.println(a+b);
}
}
//Child Class Extending Parent Class Method
class ChildOverriding extends Overriding {
int c;
public void testParent(int i,int j,int k) {
System.out.println(a+b+c);
}
//Main Is not getting executed????
public static void main(String args[]) {
Overriding obj = new ChildOverriding();
obj.testParent(1,4,8);
}
}
}
3 ответа
Подкласс Overriding Means должен иметь такую же сигнатуру метода базового класса. Параметры и тип возвращаемого значения должны быть одинаковыми.
На самом деле ваша проблема здесь в том, что вы обращаетесь к методу из SubClass через эталонный объект SuperClass.
Позвольте мне объяснить немного больше.
Super obj = new Sub();
Эта строка создаст одну ссылочную переменную (класса Super) с именем obj
и сохранить его в памяти стека и экземпляр new Sub()
со всеми деталями реализации будут храниться в области памяти кучи. Таким образом, после этого адрес памяти экземпляра, хранящийся в куче, связывается с ссылочной переменной, хранящейся в памяти стека.
obj.someMethod()
Теперь, когда мы вызываем любой метод (например, someMethod
) по ссылочной переменной obj
он будет искать сигнатуру метода в суперклассе, но когда он вызывает реализацию someMethod
он будет вызывать его из экземпляра, хранящегося в области памяти кучи.
Вот причина, по которой нельзя разрешать отображение из Super в Sub класс (например, Sub obj = new Super();
) потому что подкласс может иметь более конкретную сигнатуру метода, которая может быть вызвана, но экземпляр, сохраненный в области кучи, может не иметь реализацию этого вызванного метода.
Таким образом, ваша программа выдает ошибку только потому, что не может найти сигнатуру метода, которую вы вызываете в суперклассе.
Просто помните, что Java всегда будет искать сигнатуру метода только в типе ссылочного объекта.
Ответ на ваш вопрос Yes, we can have different number of parameters in subclass's method but then it won't titled as method overloading/overriding.
потому что перегрузка означает, что вы добавляете новое поведение, а переопределение означает изменение поведения.
Извините за мой плохой английский, и если я где-то ошибаюсь, пожалуйста, дайте мне знать, так как я изучаю Java.
Благодарю.:)
Вы можете иметь два метода, но затем один в ChildOverriding
не переопределяют один в Overriding
, Это два независимых метода.
Чтобы исправить проблему компиляции, вы должны либо объявить obj
ChildOverriding
ChildOverriding obj = new ChilOverriding();
или вы должны также реализовать метод трех аргументов в Overriding