моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Зачем нужен интерфейс?
Как мы все знаем, наследование заключается в извлечении общих абстракций подкласса в родительский класс и полученииобщность всей системыДля экономии кода, однако, тоже существует ситуация: большинство подклассов имеют определенную общность, но лишь немногие подклассы не имеют этой особенности, тогда если эта общность будет записана в родительский класс, она будет унаследована, что неразумно для эти несколько подкатегорий.
Например: кошки и собаки могут плавать, а кролики — нет. В настоящее время, если в родительском классе определен метод «плавание», кролику нецелесообразно наследовать. Однако, если кошки и собаки пишут свои собственные методы плавания. соответственно, это может произойти. Формат записи и наименование этих двух методов несовместимы. Поэтому нам необходимо определить новую концепцию, чтобы ограничить спецификации написания «плавающих» методов в этих двух подклассах.На этом этапе мы можем определить «плавание».интерфейс, определите в интерфейсе абстрактный метод swim(), а затем позвольте кошкам и собакам подключаться к этому интерфейсу, чтобы гарантироватьУнификация кода。
Подводя итог, интерфейс представляет собойправило, когда нам нужно определить правила для нескольких классов одновременно, нам нужно использоватьинтерфейс。
Интерфейс не представляет тип вещи, интерфейс представляетправило, поэтому интерфейсы можно передавать в качестве параметров методам.
«Будь то грузовик, трехколесный транспорт или рабочая сила, если он может двигаться, он будет полезен».
搬家(车的对象);
搬家(搬家公司);
public interface 运输 {
...
}
public void 搬家(运输的接口 c) {
...
}
public interface 接口名 {}
public class 类名 implements 接口名 {}
public class 类名 implements 接口名1 , 接口名2 {}
public class 类名 extends 父类 implements 接口名1 , 接口名2 {}
упражняться: Напишите стандартные классы Javabean с интерфейсами и абстрактными классами.
青蛙 属性:名字,年龄 行为:吃虫子,蛙泳
狗 属性:名字,年龄 行为:吃骨头,狗刨
兔子 属性:名字,年龄 行为:吃胡萝卜
Сначала напишите родительский класс, поскольку три подкласса едят разные вещи, вы можете определить eat() как абстрактный метод:
package oopInterface;
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
Напишите интерфейс Swim:
package oopInterface;
public interface Swim {
public abstract void swim();
}
При написании класса лягушки обратите внимание на наследование родительского класса и переписывание абстрактного метода родительского класса, а также обратите внимание на реализацию интерфейса плавания:
package oopInterface;
public class Frog extends Animal implements Swim {
public Frog() {
super();
}
public Frog(String name, int age) {
super(name, age);
}
@Override
public void swim() {
System.out.println("青蛙在蛙泳。");
}
@Override
public void eat() {
System.out.println("青蛙在吃虫子。");
}
}
При написании класса собаки обратите внимание на наследование родительского класса и переопределение абстрактного метода родительского класса для реализации интерфейса плавания:
package oopInterface;
public class Dog extends Animal implements Swim {
public Dog(){
super();
}
public Dog(String name, int age) {
super(name,age);
}
@Override
public void swim() {
System.out.println("狗在狗刨。");
}
@Override
public void eat() {
System.out.println("狗在吃骨头。");
}
}
При написании класса кролика обратите внимание, что вам нужно только наследовать родительский класс и переопределить абстрактный метод, и не нужно реализовывать интерфейс плавания (плавать нельзя):
package oopInterface;
public class Rabbit extends Animal {
public Rabbit() {
}
public Rabbit(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("兔子在吃胡萝卜。");
}
}
Напишите тестовые классы.
package oopInterface;
public class Test {
public static void main(String[] args) {
Frog f = new Frog("小绿",23);
f.eat();
f.swim();
System.out.println(f.getName() + ", " + f.getAge());
Dog d = new Dog("大D", 24);
d.eat();
d.swim();
System.out.println(d.getName() + ", " + d.getAge());
Rabbit r = new Rabbit("兔子", 30);
r.eat();
System.out.println(r.getName() + ", " + r.getAge());
}
}
Уведомление:
1. Когда класс реализует интерфейс, он должен либо реализовать все абстрактные методы в интерфейсе, либо сам класс также является абстрактным классом.
2. Класс может реализовывать несколько интерфейсов. Если он реализует несколько интерфейсов, так и должно быть.всеВсе абстрактные методы, которые будут реализованы в интерфейсе, реализованы.
3. Интерфейсы могут быть унаследованы от нескольких интерфейсов. Если субинтерфейс наследует несколько интерфейсов и затем реализуется классом реализации, то класс реализации должен объединять субинтерфейс и все его родительские интерфейсы.всеВсе абстрактные методы реализованы.
упражняться: Напишите стандартные классы Javabean с интерфейсами и абстрактными классами.
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
//Person类
package oopInterExp;
//因为直接创建顶层父类人的对象是没有意义的
//所以将其写为抽象类
public abstract class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//Sporter类继承Person
package oopInterExp;
public abstract class Sporter extends Person {
public Sporter(String name, int age) {
super(name, age);
}
public Sporter() {
}
public abstract void learn();
}
//Coach类继承Person
package oopInterExp;
public abstract class Coach extends Person {
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void teach();
}
//SpeakEnglish接口
package oopInterExp;
public interface SpeakEnglishInter {
public abstract void speakEnglish();
}
//PingPongSporter继承Sporter,实现SpeakEnglish
package oopInterExp;
public class PingPongSporter extends Sporter implements SpeakEnglishInter {
public PingPongSporter(String name, int age) {
super(name, age);
}
public PingPongSporter() {
}
@Override
public void learn() {
System.out.println("学习乒乓球。");
}
@Override
public void speakEnglish() {
System.out.println("乒乓球运动员在说英语。");
}
}
//PingPongCoach继承Coach,实现SpeakEnglish
package oopInterExp;
public class PingPongCoach extends Coach implements SpeakEnglishInter {
public PingPongCoach() {
}
public PingPongCoach(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教乒乓球。");
}
@Override
public void speakEnglish() {
System.out.println("乒乓球教练在说英语。");
}
}
//BasketballSporter继承Sporter
package oopInterExp;
public class BasketballSporter extends Sporter {
public BasketballSporter(String name, int age) {
super(name, age);
}
public BasketballSporter() {
}
public void learn() {
System.out.println("学篮球。");
}
}
//BasketballCoach继承Coach
package oopInterExp;
public class BasketballCoach extends Coach {
public BasketballCoach() {
}
public BasketballCoach(String name, int age) {
super(name, age);
}
public void teach() {
System.out.println("教篮球。");
}
}
До JDK7 в интерфейсах можно было определять только абстрактные методы.
Новой особенностью JDK8 является то, что методы с телами методов могут быть определены в интерфейсе (могут определятьпо умолчаниюметод илистатическийметод).
Новая особенность JDK9: ее можно определить в интерфейсе.частныйметод.
В интерфейсе определены методы с телами методов, в основном дляОбновление интерфейсаУчитывая, что интерфейс не может быть неизменяемым, для обновления к нему необходимо добавлять новые методы. Если эти методы являются абстрактными, в это время эти методы необходимо реализовать в классе реализации одновременно, что очень хлопотно и хлопотно. непросто синхронизировать; если при обновлении используется метод с телом метода, поэтому класс реализации не нужно дополнительно модифицировать. Если необходимы изменения, их также можно изменить путем переписывания.
Интерфейс Интер1:
package oopInterface5;
public interface Inter1 {
public abstract void method();
public default void default_method() {
System.out.println("Inter1接口中的默认方法");
}
}
Интерфейс Интер2:
package oopInterface5;
public interface Inter2 {
public default void default_method() {
System.out.println("Inter2接口中的默认方法");
}
}
Два метода по умолчанию имеют одно и то же имя. Если класс реализации реализует эти два интерфейса одновременно, этот метод по умолчанию необходимо переписать!
package oopInterface5;
public class InterImpl implements Inter1, Inter2 {
@Override
public void method() {
System.out.println("抽象方法的实现");
}
@Override
public void default_method() {
System.out.println("重写接口中的默认方法");
}
}
Тестовый класс:
package oopInterface5;
public class Test {
public static void main(String[] args) {
InterImpl ii = new InterImpl();
ii.method(); //抽象方法的实现
ii.default_method(); //重写接口中的默认方法
}
}
JDK8 и более поздние версии позволят определять статические методы в интерфейсах, которые необходимо изменить с помощью static.
в интерфейсестатический методФормат определения:
Что следует отметить о статических методах в интерфейсах:
Напишите интерфейс:
package oopInterface6;
public interface Inter {
public abstract void method();
public static void static_method() {
System.out.println("接口中的静态方法");
}
}
Напишите класс реализации. В классе также есть статический метод с тем же именем, что и у метода в интерфейсе, но он не является переопределяющим, поскольку статические методы не могут быть переопределены:
package oopInterface6;
public class InteImpl implements Inter {
@Override
public void method() {
System.out.println("重写接口中的抽象方法");
}
//这不叫重写
public static void static_method() {
System.out.println("我不是重写的Inter接口中的静态方法");
}
}
Но на самом деле это разные методы.
package oopInterface6;
public class Test {
public static void main(String[] args) {
InteImpl ii = new InteImpl();
ii.method(); //重写接口中的抽象方法
Inter.static_method(); //调用接口中的静态方法
InteImpl.static_method(); //调用实现类中的一个同名的静态方法
}
}
package oopInterface7;
public interface InterA {
public default void show1() {
System.out.println("show1开始执行");
show3();
}
public default void show2() {
System.out.println("show2开始执行");
show3();
}
//普通的私有方法,给默认方法服务的
private void show3() {
System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");
}
}
package oopInterface7;
public interface InterB {
public static void show1() {
System.out.println("show1开始执行");
show3();
}
public static void show2() {
System.out.println("show2开始执行");
show3();
}
//普通的私有方法,给静态方法服务的
private static void show3() {
System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");
}
}
1. Интерфейс представляет правила и является абстракцией поведения. Если вы хотите, чтобы у класса было определенное поведение, просто позвольте классу реализовать соответствующий интерфейс.
2. Когда параметр метода является интерфейсом, интерфейс можно передатьВсе объекты класса реализации, этот подход называется полиморфизмом интерфейса.
Адаптеры можно использовать для упрощения кода и устранения неудобств, возникающих, когда в интерфейсе слишком много абстрактных методов и нам нужно использовать только часть из них.
Обычно этапы написания следующие:
1. Напишите промежуточный класс XXXAdapter для реализации соответствующего интерфейса.
2. Реализуйте в интерфейсе пустые реализации абстрактных методов.
3. Пусть реальный класс реализации унаследует промежуточный класс и перепишет необходимые методы.
4. Чтобы другие классы не могли создавать объекты класса адаптера, промежуточный класс адаптера декорируется абстрактным.
интерфейс:
package AdapterDesignPattern;
public interface Inter {
public abstract void method1();
public abstract void method2();
public abstract void method3();
public abstract void method4();
public abstract void method5();
}
Класс адаптера:
package AdapterDesignPattern;
public abstract class InterAdapter implements Inter {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
}
@Override
public void method5() {
}
}
Класс реализации:
package AdapterDesignPattern;
public class InterImpl extends InterAdapter {
//我需要用到哪个方法,就重写哪个方法就可以了
@Override
public void method5() {
System.out.println("只要用第五个方法");
}
}