Пример 2. Виртуальные методы. Пример 2 Deer d = new Deer();Animal a = d;Vegetarian v = d;Object o = d; . 25. Java – Абстракция: абстрактный класс и метод, наследование абстрактного класса
Пример 2 Deer d = new Deer(); Animal a = d; Vegetarian v = d; Object o = d;Все переменные (d, a, v, o) ссылаются к тому же объекту Deer (Олень). Виртуальные методы В этом разделе рассмотрим, как поведение переопределённых методов в Java позволяет воспользоваться преимуществами полиморфизма при оформлении классов. Мы уже рассмотрели переопредение методов, где дочерний класс может переопределить метод своего «родителя». Переопределённый метод же скрыт в родительском классе и не вызван, пока дочерний класс не использует ключевое слово super во время переопределения метода. Пример /* File name: Employee. java */public class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System. out. println(" Собираем данные о работнике" ); this. name = name; this. address = address; this. number = number; } public void mailCheck() { System. out. println(" Отправляем чек " + this. name + " " + this. address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; }}Теперь предположим, что мы наследуем класс Employee следующим образом: /* File name: Salary. java */public class Salary extends Employee { private double salary; // Годовая заработная плата public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System. out. println(" Внутри mailCheck класса Salary " ); System. out. println(" Отправляем чек " + getName() + " с зарплатой " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary > = 0. 0) { salary = newSalary; } } public double computePay() { System. out. println(" Вычисляем заработную плату для " + getName()); return salary/52; }}Теперь, внимательно изучите программу и попытайтесь предугадать её вывод: /* File name: VirtualDemo. java */public class VirtualDemo { public static void main(String [] args) { Salary s = new Salary(" Олег Петров", " Минск, Беларусь", 3, 3600. 00); Employee e = new Salary(" Иван Иванов", " Москва, Россия", 2, 2400. 00); System. out. println(" Вызываем mailCheck, используя ссылку Salary --" ); s. mailCheck(); System. out. println(" Вызываем mailCheck, используя ссылку Employee --" ); e. mailCheck(); }}После запуска программы будет выдан такой результат:
Итак, мы создали два объекта Salary. Один использует ссылку Salary, то есть s, а другой использует ссылку Employee, то есть e. Во время вызова s. mailCheck(), компилятор видит mailCheck() в классе Salary во время компиляции, а JVM вызывает mailCheck() в классе Salary при запуске программы. mailCheck() в e совсем другое, потому что e является ссылкой Employee. Когда компилятор видит e. mailCheck(), компилятор видит метод mailCheck() в классе Employee. Во время компиляции был использован mailCheck() в Employee, чтобы проверить это утверждение. Однако во время запуска программы JVM вызывает mailCheck() в классе Salary. Это поведение называется вызовом виртуальных методов, а эти методы называются виртуальными. Переопределённый метод вызывается во время запуска программы вне зависимости от того, какой тип данных был использован в исходном коде во время компиляции.
25. Java – Абстракция: абстрактный класс и метод, наследование абстрактного класса Абстракция — это качество общения с идеями, а не с событиями. Например, в случае с e-mail, подробные детали о происходящем во время отправки e-mail, используемый протокол сервером e-mail – всё это скрыто от пользователя. Тем не менее, для отправки e-mail вам достаточно напечатать содержимое, адрес получателя и нажать «отправить». Так и в объектно-ориентированном программировании: абстракция – это процесс скрытия деталей реализации от пользователя, предоставляя ему только функционал. Иными словами, пользователь будет владеть информацией о том, что объект делает, а не как он это делает.
В Java абстракция достигается с использованием абстрактных классов и интерфейсов. Абстрактный класс Класс, который во время объявления содержит в себе ключевое слово abstract, известен как абстрактный класс. · Абстрактные классы в Java могут содержать или не содержать абстрактные методы, т. е. методы без тела (public void get(); ) · Если класс имеет хотя бы один абстрактный метод, то класс должен быть объявлен абстрактным. · Если класс объявлен абстрактным, его нельзя реализовать. · Чтобы использовать абстрактный класс, вам нужно наследовать его из другого класса, обеспечить реализацию абстрактных методов в нём. · Если вы наследуете абстрактный класс в Java, вам нужно обеспечить реализацию всех абстрактных методов в нём.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|