Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Переопределение методов при наследовании



Если два метода с одинаковыми именами и возвращаемыми значениями находятся в одном классе, то списки их параметров должны отличаться. Такие методы являются перегруженными (overloading). Если метод подкласса совпадает с методом суперкласса (родительского класса), то метод подкласса (дочернего класса) переопределяет (overriding) метод суперкласса.

Переопределение методов является основой концепции динамического связывания, реализующей полиморфизм. Когда переопределенный метод вызывается через ссылку суперкласса, Java определяет, какую версию метода вызвать, основываясь на типе объекта, на который имеется ссылка. Таким образом, тип объекта определяет версию метода на этапе выполнения.

В следующем примере переопределяемый метод show() находится в двух классах Fruits и Apple.

Пример 4.3 Переопределение метода

public class Fruits {

private String name;

private int price;

public Fruits(int p, String str) {

name = str;

price = p;

}

public float getPrice(){

return price;

}

public String getName(){

return name;

}

void show(){

System.out.println("название: " + name+ ", цена: " + price);

}

}

public class Apple extends Fruits{

private boolean seed;

public Apple(int p, String str, boolean f) {

super(p, str);

seed = f;

}

void show(){

System.out.println("название:" + getName()+ ", цена: " +getPrice() + ", наличие семечек:" + seed);

}

}

public class ShowInformation {

public static void main(String[] args) {

Fruits fruit1 = new Fruits(5000, "апельсин");

Fruits fruit2 = new Apple(3000, "яблоко", true);

fruit1.show();

fruit2.show();

}

}

Результат выполнения программы:

название: апельсин, цена: 5000

название:яблоко, цена: 3000.0, наличие семечек: true

Объект fruit1 создается при помощи вызова конструктора класса Fruits, и, соответственно, при вызове метода show() вызывается версия метода из класса Fruits. При создании объекта fruit2 ссылка типа Fruits инициализируется объектом типа Apple. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.

Стоит заметить, что статические методы могут быть переопределены в подклассе, но не могут быть полиморфными, так как их вызов не затрагивает объекты.

При объявлении совпадающих по сигнатуре полей в суперклассе и подклассах их значения не переопределяются и никак не пересекаются, то есть существуют в одном объекте независимо друг от друга. В этом случае задача извлечения требуемого значения определенного поля, принадлежащего классу в цепочке наследования, ложится на программиста.

Пример 4.4 Совпадение полей в суперклассе и подклассах

public class A {

int x = 1, y = 2;

public A() {

y = getX();

System.out.println("в классе A после вызова" + " getX() x=" + x + " y=" + y);

}

public int getX(){

System.out.println("в классе A");

return x;

}

}

public class B extends A{

int x = 3, y = 4;

public B() {

System.out.println("в классе B x=" + x + " y=" + y);

}

public int getX(){

System.out.println("в классе B");

return x;

}

}

public class DemoAB {

public static void main (String[] args) {

A objA = new B();

B objB = new B();

System.out.println("Вывод значения х из объекта А: " + objA.x);

System.out.println("Вывод значения х из объекта В: " + objB.x);

}

}

Результат выполнения программы:

в классе B

в классе A после вызова getX() x=1 y=0

в классе B x=3 y=4

в классе B

в классе A после вызова getX() x=1 y=0

в классе B x=3 y=4

Вывод значения х из объекта А: 1

Вывод значения х из объекта В: 3





Дата публикования: 2015-02-03; Прочитано: 393 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...