Абстрактный класс и Interface в Java
1. Введение
В этой статье я дам инструкцию про Интерфейс и Абстрактный класс (Abstract Class). В то же время, проанализируем сходство и разницу между ними.
2. Абстрактный класс (Abstract Class)
Абстрактный класс (Abstract class). Посмотрим пример:
// Это абстрактный класс.
// Он заставляет объявить как abstract
// так как в нем имеется абстрактный метод
public abstract class ClassA {
// Это абстрактный метод.
// Он не имеет тела (body).
// Access modifier данного метода является public.
public abstract void doSomething();
// Access modifier данного метода является protected.
protected abstract String doNothing();
// Данный метод не объявляет access modifier.
// Его аccess modifier является по умолчанию.
abstract void todo() ;
}
// Это абстрактный класс.
// Он объявляется как abstract,
// несмотря на то, что он не имеет никакого абстрактного метода.
public abstract class ClassB {
}
Характеристика абстрактного класса:
- Объявлен abstract.
- Может объявлять 0, 1 или более абстрактных методо внутри.
- Не может инициализировать 1 объект напрямую из абстрактного класса.
3. Абстрактный класс, примеры
Смотрите иллюстрацию:
AbstractJob.java
package org.o7planning.tutorial.abs;
// Абстракный класс (Симулирующий работу)
// Он объявляет 2 абстрактных метода.
public abstract class AbstractJob {
public AbstractJob() {
}
// Это абстрактный метод.
// Этот метод возвращает название работы.
public abstract String getJobName();
// Это абстрактный метод.
public abstract void doJob();
}
JavaCoding.java
package org.o7planning.tutorial.abs;
// Данный класс выполняет все абстракные методы родительского класса.
public class JavaCoding extends AbstractJob {
public JavaCoding() {
}
// Выполнить абстракный метод объявленный в родительском классе.
@Override
public void doJob() {
System.out.println("Coding Java...");
}
// Выполнить абстракный метод объявленный в родительском классе.
// Этот метод будет иметь тело (body).
// И возвращает название работы.
@Override
public String getJobName() {
return "Coding Java";
}
}
ManualJob.java
package org.o7planning.tutorial.abs;
// ManualJob - (Симулирует универсальную работу)
// Родительский класс (AbstractJob) имеет 2 абстрактных метода.
// Этот класс выполняет только 1 абстрактный метод родительского класса.
// Поэтому он должен быть объявлен как abstract.
public abstract class ManualJob extends AbstractJob {
public ManualJob() {
}
// Выполняет абстрактные методы родительского класса.
@Override
public String getJobName() {
return "Manual Job";
}
}
BuildHouse.java
package org.o7planning.tutorial.abs;
// Этот класс унаследован от абстрактного класса ManualJob
// BuildHouse не может быть объявлен как абстрактный.
// Поэтому он должен выполнить все остальные абстрактные методы.
public class BuildHouse extends ManualJob {
public BuildHouse() {
}
// Выполняет абстрактные методы родительского класса.
@Override
public void doJob() {
System.out.println("Build a House");
}
}
Пример демо
JobDemo.java
package org.o7planning.tutorial.abs;
public class JobDemo {
public static void main(String[] args) {
// Создать объект AbstractJob
// из Constructor класса JavaCoding.
AbstractJob job1 = new JavaCoding();
// Вызвать метод doJob()
job1.doJob();
// Метод getJobName является абстрактным в классе AbstractJob.
// Но он выполнен в определенном подклассе.
// Поэтому вы можете его вызвать.
String jobName = job1.getJobName();
System.out.println("Job Name 1= " + jobName);
// Создать объект AbstractJob
// из Constructor класса BuildHouse.
AbstractJob job2 = new BuildHouse();
job2.doJob();
String jobName2 = job2.getJobName();
System.out.println("Job Name 2= " + jobName2);
}
}
Результаты запуска примера:
Coding Java...
Job Name 1= Coding Java
Build a House
Job Name 2= Manual Job
4. Tổng quan về Interface
Мы знаем что класс, может быть расширен из родительского класса.
// Класс B является подклассм A, или можно сказать B расширен из A
// Java позволяет расширить только один класс из другого.
public class B extends A {
// ....
}
// В случае не определяется из какого класса расширен класс B.
// По умолчанию, понимается, что В расширен из класса Object.
public class B {
}
// Данный способ объявления и способ выше являются индентичными.
public class B extends Object {
}
Но класс может быть расширен из нескольких Interface (Интерфейсов).
// Класс может быть расширен только из родительского класса.
// Но может выполнить (расширение) из многих Interface.
public class Cat extends Animal implements CanEat, CanDrink {
// ....
}
Các đặc điểm của interface
- Интерфейс всегда имеет modifier это: public interface, несмотря на то, объявляете ли вы точно или нет.
- Если имеются поля (field), то они: public static final, несмотря на то, объявляете ли вы точно или нет.
- Его методы являются абстрактными, то есть без основы функцимм, и все имеют modifier: public abstract, несмотря на то, объявляете ли вы или нет.
- Интерфейс не имеет конструктора (Constructor).
5. Структура Interface
NoAccessModifierInterface.java
package org.o7planning.tutorial.itf;
// Это интерфейс не определяющий 'access modifier'.
// Его аccess modifier является по умолчанию.
// Только классы одного пакета могут выполнить данный интерфейс.
interface NoAccessModifierInterface {
}
CanMove.java
package org.o7planning.tutorial.itf;
// Данный интерфейс (Interface) определяет стандарт
// про вещи, которые могут двигаться.
public interface CanMove {
// Методы в Interface все являются абстрактынми и public.
public abstract void run();
// Даже если вы не пишете 'public abstract' то java все равно понимает так.
void back();
// Скорость.
public int getVelocity();
}
CanDrink.java
package org.o7planning.tutorial.itf;
// Данный интерфейс (Interface) определяет стандарт
// про вещи которые могут пить.
public interface CanDrink {
// Поля (field) в Interface все являются 'public static final'.
// Даже если вы объявляете или нет, java будет понимать так.
public static final String PEPSI = "PEPSI";
final String NUMBER_ONE = "NUMBER ONE";
String SEVENUP = "SEVEN UP";
public void drink();
}
CanEat.java
package org.o7planning.tutorial.itf;
// Данный интерфейс (Interface) определяет стандарт
// про вещи которые могут кушать.
public interface CanEat {
public void eat();
}
6. Класс применяющий интерфейс
Animal.java
package org.o7planning.tutorial.cls;
import org.o7planning.tutorial.itf.CanMove;
// Animal (Животное).
// Данный класс раширен от класса Object (Несмотря на то, что не написано).
// И объявлен выполнить (или еще называется унаследовать) interface CanMove.
// Interface CanMove имеет 3 абстрактных метода.
// Этот класс выполняет только 1 метод.
// Поэтому он должен быть объявлен как abstract.
// Остальные абстрактные методы будут выполнены подклассами.
public abstract class Animal implements CanMove {
// Выполнить метод run() в interface CanMove.
@Override
public void run() {
System.out.println("Animal run...");
}
}
Cat.java
package org.o7planning.tutorial.cls;
import org.o7planning.tutorial.itf.CanDrink;
import org.o7planning.tutorial.itf.CanEat;
// Класс Cat расширен от класса Animal и выполняет 2 interface CanEat, CanDrink.
// Cat это обычный класс (Он не объявлен абстрактным).
// Поэтому ему надо выполнить все абстрактные методы Interface.
public class Cat extends Animal implements CanEat, CanDrink {
private String name;
public Cat(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// Выполняет метод интерфейса (interface) CanMove.
@Override
public void back() {
System.out.println(name + " cat back ...");
}
// Выполняет метод интерфейса (interface) CanMove.
@Override
public int getVelocity() {
return 110;
}
// Выполняет метод интерфейса (interface) CanEat.
@Override
public void eat() {
System.out.println(name + " cat eat ...");
}
// Выполняет метод интерфейса (interface) CanDrink.
@Override
public void drink() {
System.out.println(name + " cat drink ...");
}
}
Mouse.java
package org.o7planning.tutorial.cls;
import org.o7planning.tutorial.itf.CanDrink;
import org.o7planning.tutorial.itf.CanEat;
public class Mouse extends Animal implements CanEat, CanDrink {
@Override
public void back() {
System.out.println("Mouse back ...");
}
@Override
public int getVelocity() {
return 85;
}
@Override
public void drink() {
System.out.println("Mouse drink ...");
}
@Override
public void eat() {
System.out.println("Mouse eat ...");
}
}
AnimalDemo.java
package org.o7planning.tutorial.cls;
import org.o7planning.tutorial.itf.CanEat;
public class AnimalDemo {
public static void main(String[] args) {
// Наследует статическое поле от interface CanDrink.
System.out.println("Drink " + Cat.SEVENUP);
// Создает объект CanEat.
// Объект объявлен как CanEat.
// Но на самом деле является Cat.
CanEat canEat1 = new Cat("Tom");
// Объект объявлен как CanEat.
// Но на самом деле является Mouse.
CanEat canEat2 = new Mouse();
// Полиморфизм (Polymorphism) ясно показывается здесь.
// Java всегда знает вид объекта
// ==> Tom cat eat ...
canEat1.eat();
// ==> Mouse eat ...
canEat2.eat();
boolean isCat = canEat1 instanceof Cat;
System.out.println("catEat1 is Cat? " + isCat);
// Cast.
if (canEat2 instanceof Mouse) {
Mouse mouse = (Mouse) canEat2;
// Выхывается метод drink (Унаследованный от CanDrink).
mouse.drink();
}
}
}
Результаты запуска примера:
Drink SEVEN UP
Tom cat eat ...
Mouse eat ...
catEat1 is Cat? true
Mouse drink ...
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