Наследование и полиморфизм в Java
1. Введение
Наследство и полиморфизм (Inheritance & polymorphism) - это очень важное понятие в Java. Которые вы должны понять лучше, если вы хотите обучиться в Java.
2. Класс, конструктор, экземпляр (Class, Constructor, instance)
Вам нужно ясно понять про класс, конструктор (constructor) и объект перед тем как начать обучение наследственного отношения в java. Рассмотрим class Person, описывающий человека с информацией полное имя, год рождения, mесто рождения.
Person.java
package org.o7planning.tutorial.inheritance.basic;
public class Person {
// Поле name - Информация имени.
private String name;
// Поле bornYear - Информация года рождения
private Integer bornYear;
// Поле placeOfBirth - Информация места рождения
private String placeOfBirth;
// Constructor имеет 3 параметра.
// В целях прикрепления значений полям Person.
// Определить имя, год рождения, места рождения человека.
public Person(String name, Integer bornYear, String placeOfBirth) {
this.name = name;
this.bornYear = bornYear;
this.placeOfBirth = placeOfBirth;
}
// Constructor имеет 2 параметра.
// В целях прикрепления значений 2-м полям имени и года рождения для Person.
// Не прикреплено к месту рождения.
public Person(String name, Integer bornYear) {
this.name = name;
this.bornYear = bornYear;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBornYear() {
return bornYear;
}
public void setBornYear(Integer bornYear) {
this.bornYear = bornYear;
}
public String getPlaceOfBirth() {
return placeOfBirth;
}
public void setPlaceOfBirth(String placeOfBirth) {
this.placeOfBirth = placeOfBirth;
}
}
PersonDemo.java
package org.o7planning.tutorial.inheritance.basic;
public class PersonDemo {
public static void main(String[] args) {
// Объект: Thomas Edison.
Person edison = new Person("Thomas Edison", 1847);
System.out.println("Info:");
System.out.println("Name: " + edison.getName());
System.out.println("Born Year: " + edison.getBornYear());
System.out.println("Place Of Birth: " + edison.getPlaceOfBirth() );
// Объект: Bill Gates
Person billGates = new Person("Bill Gate", 1955, "Seattle, Washington");
System.out.println("Info:");
System.out.println("Name: " + billGates.getName());
System.out.println("Born Year: " + billGates.getBornYear());
System.out.println("Place Of Birth: " + billGates.getPlaceOfBirth());
}
}
Отличие Class, конструктор (constructor) и объект:
Class Person симулирует класс людей, это что-то абстрактное, но имеющее информацию, в примере выше информация это полное имя, год рождения, mесто рождения.
Конструктор (Constructor) - Так же называют "Метод инициализации"
Конструктор (Constructor) - Так же называют "Метод инициализации"
- Конструктор всегда имеет одинаковое название с классом
- Один класс имеет один или более конструкторов.
- Конструктор имеет или не имеет параметры, конструктор без параметров называется конструктор по умолчанию.
- Конструтор используется для создания объекта класса.
Смотрите иллюстрацию, инициализация объекта из конструктора.
3. Наследование в java
Нам нужные некоторые классы для участия в примере.
- Animal: Класс симулирующий класс Животных.
- Duck: Класс симулирующий класс утки, подкласс Animal.
- Cat: Класс симулирующий класс кошки, подкласс Animal
- Mouse: Класс симулирующий класс мышеи, подкласс Animal.
Здесь у нас есть класс Animal, с методом без содержания.
Class Animal имеет 1 абстрактный метод, который нужно объявить как абстрактный (abstract). Абстрактный класс имеет конструктор (constructor), но вы не можете создать из него объект.
- public abstract String getAnimalName();
Class Animal имеет 1 абстрактный метод, который нужно объявить как абстрактный (abstract). Абстрактный класс имеет конструктор (constructor), но вы не можете создать из него объект.
- То есть вы хотите создать объект животного, вам нужно создать из определенного вида животного, в данном случе, вы должные создать из конструктора Cat, Mouse или Duck.
Animal.java
package org.o7planning.tutorial.inheritance.animal;
// Класс имеет минимут 1 абстрактный метод
// обязан быть объявленным как абстрактный.
public abstract class Animal {
// Имя, например Кот Tom, Мышь Jerry.
private String name;
// Constructor по умолчанию.
public Animal() {
// Прикрепляет значение по умолчанию для 'name'.
this.name = this.getAnimalName();
}
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// Это абстрактный метод.
// Возвращает название данного животного.
// Подробное содержание данного метода
// будет выполнент (implemented) в подклассах.
public abstract String getAnimalName();
}
Далее рассмотрим class Cat, унаследованный от Animal.
Cat also has constructor, and also has fields. In the first line of the constructor must call super(..), means that call to constructor of parent class, to assign value for fields of the parent class.
If you do not call call super(..), java auto insert super() into first line of constructor at compile time.
If you do not call call super(..), java auto insert super() into first line of constructor at compile time.
Cat.java
package org.o7planning.tutorial.inheritance.animal;
public class Cat extends Animal {
private int age;
private int height;
public Cat(int age, int height) {
// Вызывается Constructor по умолчанию родительского класса (Animal).
// В целях прикрепить значения полям (field) родительского класса.
super();
// Потом только прикрепить значения его полям (field).
this.age = age;
this.height = height;
}
public Cat(String name, int age, int height) {
// Вызывается Constructor родительского класса(Animal)
// В целях прикрепить значения полям (field) родительского класса.
super(name);
// Потом только прикрепить значения его полям (field).
this.age = age;
this.height = height;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
// Выполнить (implement) абстрактный метод объявленный в родительском классе.
@Override
public String getAnimalName() {
return "Cat";
}
}
Что происходит когда вы создаете объект Cat?
Смотрите class Mouse, унаследованный из Animal.
Mouse.java
package org.o7planning.tutorial.inheritance.animal;
public class Mouse extends Animal {
private int weight;
// Constructor по умолчанию.
public Mouse() {
// Gọi tới cấu tử Mouse(int)
// Call to constructor Mouse(int)
this(100);
}
// Constructor имеет 1 параметр
public Mouse(int weight) {
// Если вы не вызываете никакой super(..).
// Java вызовет super() по умолчанию.
// super();
this.weight = weight;
}
// Constructor имеет 2 параметра.
public Mouse(String name, int weight) {
super(name);
this.weight = weight;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public String getAnimalName() {
return "Mouse";
}
}
InstanceofDemo.java
package org.o7planning.tutorial.inheritance.demo;
import org.o7planning.tutorial.inheritance.animal.Animal;
import org.o7planning.tutorial.inheritance.animal.Cat;
import org.o7planning.tutorial.inheritance.animal.Mouse;
public class InstanceofDemo {
public static void main(String[] args) {
// Создать объект животное.
// Animal является абстрактным классом,
// вы не можете создать объект из Constructor в Animal.
Animal tom = new Cat("Tom", 3, 20);
System.out.println("name: " + tom.getName());
System.out.println("animalName: " + tom.getAnimalName());
// Используя оператор 'instanceof' проверить
// является ли объект определенным видом или нет.
boolean isMouse = tom instanceof Mouse;
System.out.println("Tom is mouse? " + isMouse);
boolean isCat = tom instanceof Cat;
System.out.println("Tom is cat? " + isCat);
boolean isAnimal = tom instanceof Animal;
System.out.println("Tom is animal? " + isAnimal);
}
}
Результаты запуска примера:
name: Tom
animalName: Cat
Tom is mouse? false
Tom is cat? true
Tom is animal? true
InheritMethodDemo.java
package org.o7planning.tutorial.inheritance.demo;
import org.o7planning.tutorial.inheritance.animal.Cat;
public class InheritMethodDemo {
public static void main(String[] args) {
// Создать объект Cat.
Cat tom = new Cat("Tom", 3, 20);
// Вызвать методы унаследованные от родительского класса (Animal).
System.out.println("name: " + tom.getName());
System.out.println("animalName: " + tom.getAnimalName());
System.out.println("-----------------");
// Вызвать методы объявленные в классе Cat.
System.out.println("Age: " + tom.getAge());
System.out.println("Height: " + tom.getHeight());
}
}
Результаты запуска примера:
name: Tom
animalName: Cat
-----------------
Age: 3
Height: 20
Casting in Java
CastDemo.java
package org.o7planning.tutorial.inheritance.demo;
import java.util.Random;
import org.o7planning.tutorial.inheritance.animal.Animal;
import org.o7planning.tutorial.inheritance.animal.Cat;
import org.o7planning.tutorial.inheritance.animal.Mouse;
public class CastDemo {
// Этот метод возвращает случайное животное.
public static Animal getRandomAnimal() {
// Возвращает случайное значение 0 или 1.
int random = new Random().nextInt(2);
Animal animal = null;
if (random == 0) {
animal = new Cat("Tom", 3, 20);
} else {
animal = new Mouse("Jerry", 5);
}
return animal;
}
public static void main(String[] args) {
Animal animal = getRandomAnimal();
if (animal instanceof Cat) {
// Сast в вид Cat.
Cat cat = (Cat) animal;
// И вызывает метод класса Cat.
System.out.println("Cat height: " + cat.getHeight());
} else if (animal instanceof Mouse) {
// Сast в вид Mouse.
Mouse mouse = (Mouse) animal;
// И вызывает метод класса Mouse.
System.out.println("Mouse weight: " + mouse.getWeight());
}
}
}
4. Полиморфизм в Java
У вас есть кошка азиатского происхождения (AsianCat), вы можете назвать ее кошкой (Cat) или сказать что это животное (Animal), это аспект в полиморфизме.
Или другой пример: В вашем резюме написано, что вы Азиат, когда на самом деле вы являетесь Вьетнамцем.
Пример ниже показывает вам как вести себя между объявлением и реальностью.
Или другой пример: В вашем резюме написано, что вы Азиат, когда на самом деле вы являетесь Вьетнамцем.
Пример ниже показывает вам как вести себя между объявлением и реальностью.
Class AsianCat это подкласс унаследованный от Cat.
AsianCat.java
package org.o7planning.tutorial.inheritance.animal;
public class AsianCat extends Cat {
public AsianCat(String name, int age, int height) {
super(name, age, height);
}
// Переопределить (override) метод родительского класса (Cat)
@Override
public String getAnimalName() {
return "Asian Cat";
}
}
Полиморфизм в Java объясняется в иллюстрации ниже:
PolymorphismDemo.java
package org.o7planning.tutorial.polymorphism;
import org.o7planning.tutorial.inheritance.animal.AsianCat;
import org.o7planning.tutorial.inheritance.animal.Cat;
public class PolymorphismDemo {
public static void main(String[] args) {
Cat cat1 = new Cat("Tom", 3, 20);
Cat cat2 = new AsianCat("ATom", 2, 19);
System.out.println("Animal Name of cat1: " + cat1.getAnimalName());
System.out.println("Animal Name of cat2: " + cat2.getAnimalName());
}
}
Результаты запуска примера:
Animal Name of cat1: Cat
Animal Name of cat2: Asian Cat
Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud