Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример 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(); }}

После запуска программы будет выдан такой результат:

Собираем данные о работникеСобираем данные о работнике Вызываем mailCheck, используя ссылку Salary ––Внутри mailCheck класса Salary Отправляем чек Олег Петров с зарплатой 3600. 0 Вызываем mailCheck, используя ссылку Employee ––Внутри mailCheck класса SalaryОтправляем чек Иван Иванов с зарплатой 2400. 0

Итак, мы создали два объекта 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...