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

Пример

/** Наследование в Java является одиночным; у подкласса может быть только один родительский класс (у сына может быть только один биологический отец). * Java предоставляет нам механизм для обработки ограничения одиночного наследования: интерфейсы. * * Интерфейс: интерфейс — это класс, даже более абстрактный, чем абстрактный класс. Все методы в интерфейсе являются абстрактными методами. Отношение между интерфейсом и классом — реализация, с использованием implements. * interface * * Формат: * interface InterfaceName { * * } **/ public class InterfaceDemo { public static void main(String[] args) { BillGates gates = new BillGates(); gates.code(); } } class Boss { public void manage() { System.out.println("Управляй компанией"); } } class Programmer { public void code() { System.out.println("Написание кода"); } } //Билл Гейтс class BillGates extends Programmer { }

1.3 Характеристики членов интерфейса

  • 1. В интерфейсе можно определять переменные, но они должны быть объявлены с фиксированными модификаторами: `public static final`. Поэтому переменные в интерфейсе также называются константами, и их значения нельзя изменять. Ключевое слово `final` мы объясним позже.

  • 2. В интерфейсе можно определять методы, и методы также имеют фиксированные модификаторы: `public abstract`.

  • 3. Интерфейс не может создавать объекты.

  • 4. Подкласс должен переопределить все абстрактные методы интерфейса, прежде чем его можно будет создать. В противном случае подкласс является абстрактным классом.

1.3.1 Пример кода 2

Пример

/** Характеристики членов интерфейса: * Могут иметь только абстрактные методы * Могут иметь только константы * Методы по умолчанию модифицируются с помощью public & abstract * Методы можно модифицировать только с помощью public & abstract * Переменные-члены по умолчанию модифицируются с помощью public static final * * Совет: Рекомендуется вручную добавлять модификаторы по умолчанию. * * Примечание: * Интерфейс не может создавать объекты (не может быть инстанцирован) * Отношение между классом и интерфейсом — это реализация. Класс, реализующий интерфейс, должен реализовать все его методы.*/ public class InterfaceDemo2 { public static void main(String[] args) { //Animal a = new Animal(); //Animal.num; } } interface Animal { public static final int num = 10; public abstract void eat(); } class Cat implements Animal { public void eat() { } }

1.4 Связь между интерфейсами и классами

  • A: Между классами: отношение наследования. Класс может напрямую наследовать только один родительский класс, но поддерживает многоуровневое наследование.
  • B: Между классами и интерфейсами: только отношение реализации. Класс может реализовывать несколько интерфейсов.
  • C: Между интерфейсами: только отношение наследования. Интерфейс может наследовать несколько интерфейсов.

1.4.1 Пример кода 3

Пример

/** * Класс против класса: отношение наследования, одиночное наследование, многоуровневое наследование * Класс против интерфейса: отношение реализации, множественная реализация * Интерфейс против интерфейса: отношение наследования, множественное наследование*/ public class InterfaceDemo3 { public static void main(String[] args) { } } interface InterA extends InterB { public abstract void method(); } interface InterB { public abstract void function(); } interface InterC extends InterA { } class Demo implements InterC { @Override public void method() { // TODO Автоматически созданная заглушка метода } @Override public void function() { // TODO Автоматически созданная заглушка метода } }

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

Пример

/** Баскетболисты и тренеры Игроки в настольный теннис и тренеры Теперь баскетболисты и тренеры отправляются за границу с визитом и им нужно выучить английский. Пожалуйста, используйте полученные знания, чтобы проанализировать, что является классами, что — абстрактными классами, а что — интерфейсами.*/ public class InterfaceTest { public static void main(String[] args) { //Создать объект баскетболиста BasketBallPlayer bbp = new BasketBallPlayer(); bbp.name = "Яо Мин"; bbp.age = 35; bbp.gender = "Мужской"; bbp.sleep(); bbp.study(); bbp.speak(); System.out.println("-------------"); //Создать объект тренера по настольному теннису PingpangCoach ppc = new PingpangCoach(); ppc.name = "Толстяк Лю"; ppc.age = 40; ppc.gender = "Мужской"; ppc.sleep(); ppc.teach(); //ppc.speak(); } } class Person { String name;//Имя int age;//Возраст String gender;//Пол //Конструктор без аргументов public Person() {} //Параметризованный конструктор public Person(String name,int age,String gender) { this.name = name; this.age = age; this.gender = gender; } //eat public void eat() { System.out.println("Есть"); } //sleep public void sleep() { System.out.println("Спать"); } } //Учись говорить по-английски interface SpeakEnglish { public abstract void speak(); } //Athlete abstract class Player extends Person { //Изучать public abstract void study(); } //Coach abstract class Coach extends Person { //Преподавать public abstract void teach(); } //Баскетболист class BasketBallPlayer extends Player implements SpeakEnglish{ @Override public void study() { System.out.println("Научись делать данк"); } @Override public void speak() { System.out.println("Говори по-английски"); } } //Игрок в настольный теннис class PingpangPlayer extends Player { @Override public void study() { System.out.println("Учись слэму"); } } //Баскетбольный тренер class BasketBallCoach extends Coach implements SpeakEnglish { @Override public void teach() { System.out.println("Учить данкам"); } @Override public void speak() { System.out.println("Говорить по-английски"); } } //Тренер по настольному теннису class PingpangCoach extends Coach { @Override public void teach() { System.out.println("Учить смешам"); } }

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 Код примера

Пример

/** Предпосылки полиморфизма: * Отношение наследования между дочерним и родительским классами * Переопределение метода * Ссылка на родительский класс указывает на объект дочернего класса * * Динамическое связывание: метод, вызываемый во время выполнения, основывается на его конкретном типе*/ public class PoymorphicDemo { public static void main(String[] args) { /*Cat c = new Cat(); c.eat();*/ //Ссылка на родительский класс Animal a //Указывает на = //Объект подкласса new Cat() Animal a = new Cat(); a.eat(); } } class Animal { public void eat() { System.out.println("Ест"); } } class Cat extends Animal { public void eat() { System.out.println("Кошка ест рыбу"); } }

2.3 Особенности полиморфных членов

A: Полиморфные переменные-члены

Когда переменная-член с одинаковым именем присутствует и в родительском, и в дочернем классе, и происходит обращение к этой переменной:

  • На этапе компиляции: проверяется, содержит ли класс, к которому принадлежит ссылочная переменная, вызываемую переменную-член. Если нет, компиляция завершается ошибкой.
  • Во время выполнения: также вызывается переменная-член класса, к которому принадлежит ссылочная переменная.

Простое правило для запоминания: и на этапе компиляции, и во время выполнения ориентируются на левую часть знака равенства. И при компиляции, и при выполнении смотрят на левую часть.

B: Полиморфные методы-члены

  • На этапе компиляции: ориентируются на класс, к которому принадлежит ссылочная переменная; если в классе нет этого метода, компиляция завершается ошибкой.
  • Во время выполнения: обращаются к классу, которому принадлежит объект, на который указывает переменная-ссылка, и выполняют метод-член класса, которому принадлежит объект.

Короче говоря: при компиляции смотрят на левую часть, во время выполнения — на правую.

2.3.1 Пример кода шесть

Пример

/** * Особенности полиморфных членов: * Переменные-члены при компиляции смотрят на левую часть, при выполнении — на левую * Методы-члены при компиляции смотрят на левую часть, при выполнении — на правую * Статические методы при компиляции смотрят на левую часть, при выполнении — также на левую * * * При компиляции все смотрят на левую часть; при выполнении методы-члены смотрят на правую, а остальные (переменные-члены и статические методы) все смотрят на левую **/ public class PoymorphicDemo2 { public static void main(String[] args) { Dad d = new Kid(); //System.out.println(d.num); //d.method(); d.function();//Вызов статического метода через переменную фактически эквивалентен вызову его с именем класса типа переменной. } } class Dad { int num = 20; public void method() { System.out.println("Я — метод родительского класса"); } public static void function() { System.out.println("Я — статический метод родительского класса"); } } class Kid extends Dad { int num = 10; public void method() { System.out.println("Я — метод дочернего класса"); } public static void function() { System.out.println("Я — статический метод дочернего класса"); } }

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 对象

Пример

/** * Восходящее и нисходящее преобразование в полиморфизме: * * Преобразование между ссылочными типами * Восходящее преобразование * От меньшего к большему (подтип преобразуется в родительский тип) * Нисходящее преобразование * От большего к меньшему * Преобразование базовых типов данных * Автоматическое преобразование типов * От меньшего к большему * byte short char --- int --- long --- float --- double * Принудительное преобразование типов * От большего к меньшему * * **/ public class PoymorphicDemo3 { public static void main(String[] args) { Animal2 a = new Dog();//Восходящее преобразование //a.eat(); Dog d = (Dog)a;//Нисходящее преобразование d.swim(); } } class Animal2 { public void eat() { System.out.println("Ест"); } } class Dog extends Animal2 { public void eat() { System.out.println("Грызет кости"); } public void swim() { System.out.println("Собачий гребок"); } }

2.5 Преимущества и недостатки полиморфизма

Пример

/** * Преимущества и недостатки полиморфизма * Преимущества: он может повысить сопровождаемость (гарантируется предпосылками полиморфизма) и улучшить расширяемость кода Недостатки: он не может напрямую обращаться к членам, специфичным для подкласса*/ public class PoymorphicDemo4 { public static void main(String[] args) { MiFactory factory = new MiFactory(); factory.createPhone(new MiNote()); фабрика.createPhone(new RedMi()); } } class MiFactory { /*public void createPhone(MiNote mi) { mi.call(); } public void createPhone(RedMi mi) { mi.call(); }*/ public void createPhone(Phone p) { p.call(); } } interface Phone { public void call(); } //Xiaomi Note class MiNote implements Phone{ public void call() { System.out.println("Xiaomi Note совершает звонок"); } } //Redmi class RedMi implements Phone { public void call() { System.out.println("Redmi совершает звонок"); } }

Исходный адрес: https://www.cnblogs.com/yoke/p/7453864.html