1. Интерфейс
1.1 Обзор интерфейсов
Интерфейс — это совокупность функций. Его также можно рассматривать как тип данных, и он более абстрактен, чем абстрактный класс.Class 。
Интерфейс только описывает методы, которые у него должны быть, без конкретной реализации. Конкретная реализация выполняется классом реализации интерфейса (эквивалентным подклассу интерфейса). Это отделяет определение функциональности от её реализации, оптимизируя проектирование программы.
1.2 Формат интерфейса
1.2.1 Формат интерфейса
В отличие от определения класса,classразница в том, что при определении интерфейса нужно использоватьinterfaceключевое слово.
Файл, в котором определяется интерфейс, всё ещё является.javaфайлом. Хотя в объявлении используетсяinterfaceключевое слово, после компиляции всё равно создаётся.classфайл. Это позволяет рассматривать интерфейс как особый класс, который содержит только объявления свойств.
Формат определения:public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
1.2.2 Использование интерфейсов
Все методы в интерфейсе являются абстрактными методами. Прямое применение `new` к интерфейсу для вызова методов не имеет смысла, и Java не позволяет этого.
Отношение между классом и интерфейсом — это отношение реализации, т. е. класс реализует интерфейс. Действие реализации похоже на наследование, но ключевое слово отличается; реализация используетimplements。
После того как другие классы (классы реализации) реализуют интерфейс, это эквивалентно объявлению:"Я должен обладать функциональностью этого интерфейса."Класс реализации всё ещё должен переопределить методы, чтобы реализовать конкретную функциональность.
Формат:
class 类 implements 接口 {
重写接口中方法
}
После того как класс реализует интерфейс, класс наследует абстрактные методы из интерфейса. В этот момент класс должен переопределить эти абстрактные методы, чтобы завершить конкретную логику.
1.2.3 Пример кода 1
Пример
1.3 Характеристики членов интерфейса
-
1. В интерфейсе можно определять переменные, но они должны быть объявлены с фиксированными модификаторами: `public static final`. Поэтому переменные в интерфейсе также называются константами, и их значения нельзя изменять. Ключевое слово `final` мы объясним позже.
-
2. В интерфейсе можно определять методы, и методы также имеют фиксированные модификаторы: `public abstract`.
-
3. Интерфейс не может создавать объекты.
-
4. Подкласс должен переопределить все абстрактные методы интерфейса, прежде чем его можно будет создать. В противном случае подкласс является абстрактным классом.
1.3.1 Пример кода 2
Пример
1.4 Связь между интерфейсами и классами
- A: Между классами: отношение наследования. Класс может напрямую наследовать только один родительский класс, но поддерживает многоуровневое наследование.
- B: Между классами и интерфейсами: только отношение реализации. Класс может реализовывать несколько интерфейсов.
- C: Между интерфейсами: только отношение наследования. Интерфейс может наследовать несколько интерфейсов.
1.4.1 Пример кода 3
Пример
1.5 Идея интерфейсов
Ранее мы узнали, как интерфейсы представляются в коде. Теперь давайте разберём идею интерфейсов и затем объясним её на примерах из повседневной жизни.
Например: Мы все знаем, что у компьютера есть много портов, и к этим портам можно подключать соответствующие устройства. Почему эти устройства можно подключать? Основная причина в том, что при производстве эти устройства соответствовали правилам использования порта; иначе их нельзя было бы подключить к порту, не говоря уже об использовании. Оказывается, наличие этих портов позволяет нам использовать больше устройств.
Появление интерфейсов облегчает дальнейшее использование и сопровождение. Одна сторона использует интерфейс (например, компьютер), а другая сторона реализует интерфейс (устройства, подключаемые к порту). Например, ноутбук использует это правило (интерфейс), а компьютерная периферия реализует это правило (интерфейс).
Интерфейсы широко используются в фреймворке коллекций:
Collection 接口
List 接口
ArrayList 实现类
LinkedList 实现类
Set 接口
1.6 Преимущества интерфейсов
- 1. Отношение между классом и интерфейсом — это реализация, причём множественная реализация. Класс может реализовывать несколько интерфейсов. Отношение между классами — это наследование. Наследование в Java — одиночное; класс может иметь только один родительский класс. Это снимает ограничение наследования.
- 2. Предоставлять правила для внешнего мира (интерфейс USB).
- 3. Уменьшить связанность программы (это позволяет вести модульную разработку; после определения правил каждый реализует свой модуль, что повышает эффективность разработки).
1.7 Различия между интерфейсами и абстрактными классами
1. Общее:Оба постоянно выделяют абстрактные методы, не имеющие конкретной реализации, и ни один из них нельзя инстанцировать (нельзя создавать объекты).
2. Различия
1: Связь с классами
(1) Отношение между классом и интерфейсом — это реализация, причём множественная реализация; класс может реализовывать несколько интерфейсов. Отношение между классом и абстрактным классом — это наследование. Наследование в Java бывает одиночным и многоуровневым; класс может наследовать только один родительский класс, но может иметь класс-прародитель.
(2) Различие 2: Члены
a.成员变量 抽象类可以有成员变量,也可以有常量 接口只能有常量,默认修饰符public static final b.成员方法 抽象类可以有抽象方法,也可以有非抽象方法 接口只能有抽象方法,默认修饰符 public abstract c.构造方法 抽象类有构造方法,为子类提供 接口没有构造方法
1.8 Пример со спортсменами

1.8.1 Код примера 4
Пример
2. Полиморфизм
2.1 Обзор полиморфизма
Полиморфизм — третья основная характеристика объектно-ориентированного программирования после инкапсуляции и наследования.
Объекты реального мира часто имеют несколько форм. Например, студент — это разновидность человека. Конкретный студент, Чжан Сань, является одновременно студентом и человеком, таким образом представляя две формы.
Java как объектно-ориентированный язык также может описывать несколько форм одной вещи. Например, если класс Student наследуется от класса Person, то объект Student является одновременно Student и Person.
2.2 Определение и формат использования полиморфизма
Формат определения полиморфизма: фактически это когда переменная-ссылка родительского класса указывает на объект дочернего класса.
父类类型 变量名 = new 子类类型(); 变量名.方法名();
A: Формат полиморфизма с обычными классами
父类 变量名 = new 子类();
Например:
class Fu {}
class Zi extends Fu {}
//类的多态使用
Fu f = new Zi();
B: Формат полиморфизма с абстрактными классами
抽象类 变量名 = new 抽象类子类();
Например:
abstract class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu= new Zi();
C: Формат полиморфизма с интерфейсами
接口 变量名 = new 接口实现类();
Например:
interface Fu {
public abstract void method();
}
class Zi implements Fu {
public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用
Fu fu = new Zi();
2.2.1 Код примера
Пример
2.3 Особенности полиморфных членов
A: Полиморфные переменные-члены
Когда переменная-член с одинаковым именем присутствует и в родительском, и в дочернем классе, и происходит обращение к этой переменной:
- На этапе компиляции: проверяется, содержит ли класс, к которому принадлежит ссылочная переменная, вызываемую переменную-член. Если нет, компиляция завершается ошибкой.
- Во время выполнения: также вызывается переменная-член класса, к которому принадлежит ссылочная переменная.
Простое правило для запоминания: и на этапе компиляции, и во время выполнения ориентируются на левую часть знака равенства. И при компиляции, и при выполнении смотрят на левую часть.
B: Полиморфные методы-члены
- На этапе компиляции: ориентируются на класс, к которому принадлежит ссылочная переменная; если в классе нет этого метода, компиляция завершается ошибкой.
- Во время выполнения: обращаются к классу, которому принадлежит объект, на который указывает переменная-ссылка, и выполняют метод-член класса, которому принадлежит объект.
Короче говоря: при компиляции смотрят на левую часть, во время выполнения — на правую.
2.3.1 Пример кода шесть
Пример
2.4 Восходящее и нисходящее преобразование в полиморфизме
Приведение типов в полиморфизме делится на два типа: восходящее и нисходящее преобразование:
A: Восходящее преобразование: когда объект подкласса присваивается ссылке на родительский класс, это восходящее преобразование. Сам полиморфизм — это процесс восходящего преобразования.
Формат использования:
父类类型 变量名 = new 子类类型();
Например:
Person p = new Student();
B: Нисходящее преобразование: объект подкласса, который уже был подвергнут восходящему преобразованию, может использовать формат принудительного преобразования типа, чтобы преобразовать ссылку на родительский класс в ссылку на подкласс. Этот процесс — нисходящее преобразование. Если объект родительского класса создан напрямую, его нельзя подвергнуть нисходящему преобразованию.
Формат использования:
Subclass type variable name = (Subclass type) Parent class type variable;
Например:
Student stu = (Student) p; // 变量p 实际上指向 Student 对象
Пример
2.5 Преимущества и недостатки полиморфизма
Пример
Исходный адрес: https://www.cnblogs.com/yoke/p/7453864.html