JavaSE объектно-ориентированные основы_интерфейса

интерфейс

Требования: нужно лететь в Пекин в командировку

Самолеты, птицы и Супермен не принадлежат к одной категории, но имеют одну и ту же характеристику: они могут летать. Поэтому вводится новая концепция, называемая интерфейсом, которую можно использовать для указания того, что абстрактный метод в интерфейсе должен быть реализован в классе, реализующем интерфейс. Интерфейс можно понимать как контракт

Определите интерфейс с помощью ключевого слова interface

public interface 会飞的 {
    
    
	public void 起飞();
	public void 巡航飞行();
	public void 降落();
}

Интерфейс нельзя использовать напрямую, должен быть соответствующий класс реализации

public class 飞机类 implements 会飞的 {
    
     //共性是通过实现接口来表示的
private String name; //名称,这是类属的属性,这里可以定义字节类的成员,和接口无关
//如果当前类不是抽象类,则必须实现接口中的所有抽象方法
@Override
public void 起飞() {
    
    
System.out.println("使劲的跑,一抬头就飞起来了");
}
@Override
public void 巡航飞行() {
    
    
System.out.println("使劲的烧油...");
}
@Override
public void 降落() {
    
    
System.out.println("我对准...");
}
}

Определите переменные через интерфейс, используйте экземпляр конкретного класса и вызовите

会飞的 obj = new 飞机类();
obj.起飞();
obj.巡航飞行();
obj.降落();

Цель введения интерфейса состоит в том, чтобы изолировать реализацию

public void 出差(飞机 obj){
    
    }
这种写法当前类和飞机是耦合的,如果需要坐超人出差,则必须修改源代码
public void 出差(会飞的 obj){
    
    }
当前类只是和接口耦合,任何实现了接口的对象都可以作为参数进行传入

Используя интерфейс вместо использования определенного класса, вы можете переключаться между несколькими конкретными классами реализации, которые реализуют интерфейс, например, определяя сверхчеловеческий

что такое интерфейс

Java не поддерживает множественное наследование напрямую из-за неопределенности вызова, поэтому Java улучшает механизм множественного наследования и становится множественной реализацией в Java. Класс может реализовывать несколько интерфейсов, а интерфейс может наследовать несколько интерфейсов.

interface IA{
    
    }
interface IB{
    
    }
interface IC extends IA,IB{
    
    } 正确的,其中IC中的方法等于IA+IB
class A implements IA,IB{
    
    }
IA a=new A();
IB b=new A();
  • Интерфейс — это специальный абстрактный класс, и интерфейс может быть изменен только абстрактным или общедоступным классом.
  • нет метода конструктора
public interface IA{
    
    
	public IA(){
    
    } //语法报错
}
  • Нет атрибутов, можно определить только константы
public class Test {
    
    
	public static void main(String[] args) {
    
    
		System.out.println(IA.name); //常量可以直接使用
		System.out.println(B.name); //实现类也可以直接访问常量
	}
}
interface IA {
    
    
	String name = "yanjun";// 接口中只能定义常量,不能定义属性,默认限定词
	public static final,自定义限定词不能冲突
}
class B implements IA{
    
    }
  • Может содержать абстрактные методы или нет
interface IA1 {
    
    
}// 这个接口中没有包含任何抽象方法
class A1Impl implements IA1 {
    
    
}
    • Методы в интерфейсе могут быть изменены только общедоступными, стандартными, абстрактными, статическими.
      • Как правило, в интерфейсе определены только абстрактные методы.
      • Определенные методы по умолчанию являются общедоступными абстрактными методами.

Абстрактные методы должны обеспечивать реализацию в реализующем классе.

class A2Impl implements IA2{
    
     //在实现类中必须实现接口中的所有抽象方法,否则当前
类只能是抽象类
public int ee() {
    
    
return 0;
}
public void pp() {
    
    
System.out.println("A2Impl....");
}
public void cc() {
    
    
System.out.println("A2Impl.....");
}
//dd方法由于在接口中有默认实现,所以可以不用重新定义,也允许重新定义
}
  • Вы можете использовать ключевое слово по умолчанию, чтобы предоставить реализацию по умолчанию для абстрактных методов, а методы с реализациями по умолчанию могут быть переопределены или не переопределены в классе реализации.

Причина ошибки: Множественное наследование классов не поддерживается в Java, и у класса может быть только один родительский класс.

Интерфейсы допускают множественное наследование

Класс может реализовывать несколько интерфейсов при наследовании от другого класса.

接口允许多重继承
interface IA1{
    
    
public void p1();
}
interface IA2{
    
    
public void p2();
}
interface IC extends IA1,IA2{
    
    
public void p3();
}//可以继承多个父接口,此时IC中实际有3个抽象方法
类是单根继承,不允许继承多个父类

Классу разрешено реализовывать несколько интерфейсов, но абстрактный метод каждого интерфейса должен обеспечивать реализацию, иначе это абстрактный класс. Предоставленные реализации также могут быть унаследованы от

public class A1{
    
    
public void p1(){
    
    }
}
public class A2 extends A1 implements IA1,IA2{
    
    
public void p2(){
    
    }
}
public abstract class A3 extends A1 implements IA1,IA2{
    
    }//因为p2方法没有实现

Внешний вид интерфейса позволяет избежать ограничения одиночного наследования. Таким образом, определение интерфейса C имеет все определения A + B. Вы можете использовать интерфейсы A и B и родительский класс D для объявления типа переменной и прямо новый Т. Однако при ограничении тот, кто объявляет переменную, является типом, распознаваемым системой компилятора, что означает, что могут вызываться только методы идентифицированного типа, а другие методы вызываться не могут.

interface A{
    
    
public void p1();
}
interface B{
    
    
public void p2();
}
interface C extends A,B{
    
    }
class D{
    
    
public void abc(){
    
    }
}
class T extends D implements C{
    
    
public void p1(){
    
    }
public void p2(){
    
    }
}
D d=new T();这里只能调用abc方法,如果使用其他方法则需要进行类型转换
A a=new T();这里只能调用A接口中声明的方法p1
B b=new T();这里只能调用B接口中声明的方法p2

Синтаксис для объявления интерфейса

访问修饰符 interface 接口名{
    
     } 一般建议接口名称使用形容词
  • Если публичный интерфейс определен, правила согласуются с определением общедоступного класса, а имя интерфейса должно соответствовать имени файла.
  • Внешние интерфейсы могут использовать только общедоступные квалификаторы и квалификаторы области по умолчанию; если вы определяете внутренний интерфейс, вы можете использовать 4 основных квалификатора области.
  • Интерфейс фактически предоставляет тот же самый рабочий интерфейс (метод).Если это версия JDK1.8, ни один из методов не будет реализован, ожидая, пока класс или классы реализуют свои методы [все методы в интерфейсе должны быть абстрактными】. Если вы используете JDK1.8+, вы можете использовать default для определения реализации по умолчанию в интерфейсе, что позволяет вам переопределить переопределение в классе реализации.
public class Test1 {
    
    
public static void main(String[] args) {
    
    
IA2 a2=new A2Impl();
a2.pp();
}
}
interface IA2 {
    
    
default void pp(){
    
    
System.out.println("this is pp....");
this.ff();
}
void ff();
}
class A2Impl implements IA2{
    
    
public void ff() {
    
    
System.out.println("this is ff...");
}
}

Реализация метода по умолчанию по умолчанию использует ограничения

public class Test1 {
    
    
public static void main(String[] args) {
    
    
IA2 a2 = new A2Impl();
a2.pp();
}
}
interface IA2 {
    
    
default void pp() {
    
    
System.out.println("this is No2 pp....");
}
}
interface IA3 {
    
    
default void pp(){
    
    
System.out.println("this is No3 pp");
}
}
class A2Impl implements IA2, IA3 {
    
    //如果IA2中有一个default实现的方法和IA3中
的方法一致,则必须在实现类中重新定义
public void pp() {
    
    
IA2.super.pp();//调用IA2接口中的pp方法的默认实现
IA3.super.pp();
}
}
  • В интерфейсе нет свойств, могут быть определены только константы, он предоставляет некоторые константы, и классы, которые его реализуют, могут совместно использовать эти константы.
  • Интерфейсам могут быть присвоены символы управления доступом, а те, которые изменены с помощью public, являются общедоступными интерфейсами, которые можно увидеть повсюду; если интерфейс определен без квалификаторов области действия, к нему можно получить доступ только в том же пакете.

В интерфейсе могут быть определены только константы и абстрактные методы.

  • В интерфейсе могут быть определены только общедоступные константы.Свойства в интерфейсе имеют тип public static final по умолчанию и должны иметь тип public static final.
interface IA{
    
    
String name="yanjun";//这里实际上是常量定义,不是属性,它的限定词是public
static final String name="yanjun",必须在声明的同时进行赋值
} 在接口中不能定义静态块 static{
    
    }
接口中不能定义构造器
  • В интерфейсе можно определить только общедоступные абстрактные методы, и только в JDK1.8+ можно использовать ключевое слово по умолчанию для определения реализации метода. Метод в интерфейсе по умолчанию имеет общедоступный абстрактный тип и должен иметь общедоступный абстрактный тип. Только в JDK1.8+ вы можете использовать ключевое слово по умолчанию для определения реализации метода по умолчанию, позволяя переопределять переопределение в классе реализации.
  • Интерфейсы не могут быть созданы, они могут быть реализованы только путем реализации классов, но их можно использовать для объявления типа переменных.
    接口 变量名=new 实现接口类();
  • интерфейс не имеет конструктора
  • Абстрактные методы в интерфейсах должны предоставлять реализации в неабстрактных подклассах, которые могут быть унаследованы.
interface IA2 {
    
    
public void pp();
}
class A2 {
    
    
public void pp() {
    
    
}
}
class B2 extends A2 implements IA2 {
    
     //这里的pp方法的实现是从父类中继承来的
}

Синтаксис класса, реализующего интерфейс

class 类名称 implements 接口名称 {
    
     }
  • Модификатор по умолчанию абстрактного метода интерфейса является общедоступным, который должен быть указан в заголовке метода с ключевым словом public при реализации интерфейса.
interface IA2 {
    
    
void pp();
}
class B2 implements IA2 {
    
    
void pp() {
    
     //语法报错,因为IA2接口中的方法为public abstract
}
}
  • Интерфейс может быть реализован несколькими подклассами. Подкласс также может реализовывать несколько интерфейсов.

класс реализует интерфейс

  • Когда класс реализует абстрактный метод интерфейса, он должен использовать точно такой же заголовок метода public
  • Если класс реализует несколько интерфейсов, разделите их запятыми.
  • Если класс реализует два интерфейса, которые объявляют один и тот же метод, он используется несколькими интерфейсами.
public class Test1 {
    
    
public static void main(String[] args) {
    
    
IA2 a2=new B2(); a2.pp();
IA3 a3=new B2(); a3.pp();
}
}
interface IA2 {
    
    
void pp();
}
interface IA3{
    
    
void pp();
}
class B2 implements IA2,IA3 {
    
    
public void pp() {
    
    
System.out.println("this is B2.pp()");
}
}
  • Класс может определять свои собственные дополнительные члены при реализации интерфейса, что является наиболее распространенной формой.
public class Test1 {
    
    
public static void main(String[] args) {
    
    
IA2 a2=new B2();
a2.pp();//这里不能直接调用B2实现类中的其它方法,如果需要调用则应该进行强制
类型转换
((B2)a2).dd();
}
}
interface IA2 {
    
    
void pp();
}
class B2 implements IA2 {
    
    
public void pp() {
    
    
System.out.println("this is B2.pp()");
}
private int age=100;
public void pp(int k){
    
    
System.out.println("this is pp(int)");
}
public void dd(){
    
    
System.out.println("this is dd()");
}
}
  • Если класс не полностью реализует все методы интерфейса, класс должен быть определен как класс абстрактного типа, и любой подкласс, наследующий класс, должен реализовывать интерфейс.

Константы в интерфейсе

Константы могут использоваться совместно для классов реализации нескольких интерфейсов.

public class Test1 {
    
    
public static void main(String[] args) {
    
    
System.out.println(IA2.PI);//可以直接使用
A3 a=new A3();
a.setR(4);
System.out.println(a.getArea());
}
}
interface IA2 {
    
    
double PI=3.1415;
}
class A3 implements IA2{
    
     //在实现类中也可以直接使用
private double r;
public double getArea(){
    
    
return PI*r*r;
}
public void setR(double r) {
    
    
this.r = r;
}
}
  • Просто определите и назначьте значение в интерфейсе, и его нельзя изменить впоследствии
  • В классе указано, что это класс реализации интерфейса, и можно использовать константы интерфейса

Объект часто имеет несколько идентификаторов

  • Подкласс в Java может наследоваться только от одного родительского класса (не может быть выражен)
  • Класс в Java может реализовывать несколько интерфейсов. (можно выразить)
class 类名称 implements 接口1,接口2,{
    
     }
  • Благодаря двойным механизмам наследования и полиморфизму времени выполнения можно определить согласованный интерфейс, используемый множеством разных, но связанных типов объектов.
  • Поддерживать абстрактный интерфейс, даже без перекомпиляции можно вызвать экземпляр нового класса
public void 出差(会飞的 obj){
    
     obj.起飞(); ...}
调用的时候可以传入不能类型的对象
出差(new 飞机()); --- 出差(new());

Особенности интерфейсов

  • У класса может быть только один родительский класс!
  • Класс может реализовывать несколько интерфейсов!
  • Интерфейс может наследовать несколько интерфейсов
interface 接口名 extends 接口名称1 ,父接口名称2 , ... {
    
     }

Роль интерфейса

  • единый доступ
接口 obj=new 实现1(); 可以还有实现2,实现3
obj只能调用接口中定义的方法
  • Разделение может изолировать конкретную реализацию через интерфейс.Развязка
    означает, что между пользователем и разработчиком нет никакой связи. Как бы реализатор не менял реализацию, для пользователя она не изменится

Сходства и различия между интерфейсом и абстрактным классом

  • Тот же самый момент: все они непрерывно составляются
  • разница:
    • Абстрактные классы должны наследоваться, и только одиночное наследование
    • Интерфейс должен быть реализован, и можно реализовать больше
  • Абстрактные и неабстрактные методы могут быть определены в абстрактных классах, а неабстрактные методы могут использоваться непосредственно после наследования подкласса.
  • Абстрактный метод и метод по умолчанию могут быть определены в интерфейсе, а абстрактный метод должен быть реализован подклассом; JDK1.8+ позволяет методу в интерфейсе иметь реализацию по умолчанию, а реализацию по умолчанию можно напрямую использовать в класс реализации, и определение может быть переопределено
  • Наследование абстрактных классов — это отношение, определяющее основное общее содержание системы.
  • Реализация интерфейса похожа на отношения, а дополнительные функции в системе определения
  • В интерфейсе могут быть определены только константы, и они должны быть инициализированы.Свойства могут быть определены в абстрактном классе, разрешая прямую инициализацию во время объявления или нет, и позволяя определять константы.

Все общедоступные методы в интерфейсе должны быть абстрактными. В версии JDK1.8+ реализация метода по умолчанию может быть определена с помощью ключевого слова default, что позволяет определять статические методы.Начиная с JDK1.9, частные методы могут быть определены, абстрактные методы также могут существовать в абстрактных классах.

public class Test1 {
    
    
public static void main(String[] args) {
    
    
IA2.pp();
A2Impl.pp();
IA2 a2 = new A2Impl();
a2.pp();// 语法报错
}
}
interface IA2 {
    
    
public default void cc(){
    
    }
public static void pp() {
    
    
System.out.println("IA2 static....");
}
}
class A2Impl implements IA2 {
    
    
public static void pp() {
    
    
System.out.println("A2Impl static..");
}
}

Определите спецификацию вызова в интерфейсе, абстрактный класс реализует интерфейс, предоставляет общедоступную функциональную часть и, наконец, реализует специальный метод в конкретном классе реализации.

public class Test2 {
    
    
public static void main(String[] args) {
    
    
Fa ff = new Son();
ff.pp();
}
}
class Fa {
    
    
public static void pp() {
    
    
System.out.println("Fa static....");
}
}
class Son extends Fa {
    
    
public static void pp() {
    
    
System.out.println("Son static....");
}
}

public void pp(); является абстрактным методом в интерфейсе, но если синтаксис public void pp(){} неверен, можно использовать public void pp(){} по умолчанию в версии JDK1.8+.

Как пользоваться интерфейсом

Как правило, интерфейс используется для изоляции конкретной реализации, а взаимозависимость между классами может быть заменена зависимостью классов от интерфейсов. Например, класс деловой поездки и летающие вещи изолированы через интерфейс полета, так что независимо от того, нужно ли изменить класс деловой поездки или изменить летающие вещи, они не будут влиять друг на друга.

При наличии общедоступных методов и специальных методов в группе связанных классов абстрактные классы могут использоваться для закрепления общедоступных методов [каркаса алгоритма] в абстрактном классе без повторной реализации конкретных подклассов; но те, которые не могут быть реализованы в абстрактных классах Методы могут быть отложены до тех пор, пока подклассы не реализуют их. Например, сортировщик BubbleSorter, в котором абстрактный класс BubbleSorter закрепляет используемый алгоритм пузырьковой сортировки и откладывает реализацию более крупного алгоритма сравнения, который не может быть реализован, до подкласса PigSorter от BubbleSorter, и нет необходимости переопределять алгоритм сортировки. в PigSorter

Лучшая практика разработки программного обеспечения: сначала определите метод вызова спецификации интерфейса, затем используйте абстрактный класс для реализации интерфейса, чтобы определить общедоступный метод, и, наконец, определите конкретный подкласс для реализации всех методов.

Сценарии использования интерфейсов и абстрактных классов

С точки зрения дизайна, абстрактный класс воплощает отношения наследования, которые в основном описывают принадлежность к классу или отношения родитель-потомок.Отношение между абстрактным классом и его производными классами является типичным отношением IS-A, то есть дочерним является родителем.

Интерфейс может быть реализован несколькими способами, и не требуется, чтобы разработчик и определение интерфейса были согласованы в концепции, реализуется только контракт, определенный интерфейсом. В основном он описывает контракт поведения между типами и типичные отношения CANDO между интерфейсом и его классом реализации, то есть дочерний элемент может выполнять родительский.

Зачем интерфейсам нужны методы по умолчанию

Добавление метода по умолчанию в интерфейс не требует изменения класса реализации, а метод по умолчанию, добавленный в интерфейс, доступен непосредственно в классе реализации.

Также обратите внимание на конфликты методов по умолчанию.

Supongo que te gusta

Origin blog.csdn.net/qq_39756007/article/details/127234376
Recomendado
Clasificación