3.7 Отмена методов
В
классе derived, если мы включаем определение метода, которое имеет то же самое имя и точно то же самое число типов параметров что и метод, уже определенный в основном классе, то это новое определение заменяет старое определение метода.
3.7.1 Определение
Отмененные методы - те методы, которые находятся в суперклассе так же как в подклассе. Отмена позволяет общему классу определять методы, которые будут применены к его подклассу.
3.7.2 Вызов отменённых методов
Если объект - случай полученного класса, то отмененная версия, определенная в полученном классе - та, которая вызвана, super.someMethod () вызовет версию someMethod () непосредственно в суперклассе. Мы не можем использовать запись подобно super.super.someMethod (), чтобы вызвать метод из длинной иерархии наследования.
Следующая программа демонстрирует отмененные методы.
Пример 13:
class Superclass
{
int a ;
Superclass ()
{
а = 10;
}
public void printA()
{
System.out.println( In the super class );
System.out.println( a = +a);
}
}
class Subclass extends Superclass
{
int a ;
Subclass(int a)
{
this.a = a;
//indicates that the variable a of this object
//should assign the value of variable a, which is
//passed through the constructor
}
public void printA()
{
System.out.println( In the sub class );
System.out.println( a = +a) ;
}
}
public class OverrideDemo
{
public static void main(String args[])
{
Superclass si = new Subclass(10);
S1.printA() ;
Subclass s2 = new Subclass(20);
s2.printA() ;
}
}
Вывод описанной выше программы:
Рисунок 3.17: Вывод OverrideDemo
В классе OverrideDemo запись,
Superclass s1 = new Subclass(10);
создает объект типа
Superclass, s1.printA();
вызовет метод printA() класса SubClass, потому что s1 содержит ссылку Subclass. Это также называется
динамическим связыванием, так как компилятор не знает до времени выполнения, что s1 собирается содержать.
Обратите внимание: Ссылки распределяются во время выполнения.
Запись,
Subclass s2 = new Subclass(20) ;
cоздаёт объект класса SubClass. Так s2 содержит ссылку SubClass. Следовательно запись,
s2 .printA() ;
вызовет метод printA() класса SubClass. Это по-другому называется статическим связыванием, потому что s2 - объект SubClass и содержит ссылку SubClass.
Мы теперь изменим вышеупомянутую программу, чтобы вызвать метод printA () Суперкласса, не создавая объект Суперкласса.
Пример 14:
class Superclass
{
int a;
Superclass()
{
а = 10;
}
public void printA()
{
System.out.println( In the super class );
System.out.println( a = +a);
}
}
class Subclass extends Superclass
{
int a ;
Subclass(int a)
{
this.a = a;
}
public void printA()
{
super.printA() ;
System.out.println( In the sub class );
System.out.println( a = +a);
}
}
class OverrideDemo
{
public static void main(String args [])
{
Subclass s2 = new Subclass(20);
s2.printA() ;
}
}
Вывод соответствующей программы:
Рисунок 3.18: Вывод
В измененной программе, мы использовали ключевое слово
super, чтобы явно вызвать метод printA () Суперкласса.