내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
인터페이스는 왜 있는 걸까요?
우리 모두 알고 있듯이 상속은 하위 클래스의 공통 추상화를 상위 클래스로 추출하고전체 시스템의 공통성그러나 코드를 저장하려면 상황도 있습니다. 대부분의 하위 클래스에는 특정 공통성이 있지만 소수의 하위 클래스에만 이 기능이 없습니다. 그러면 이 공통성이 상위 클래스에 기록되면 상속됩니다. 이는 불합리합니다. 이 몇 가지 하위 카테고리입니다.
예를 들어, 고양이와 개는 수영할 수 있지만 토끼는 수영할 수 없습니다. 이때 부모 클래스에 "swimming" 메소드를 정의하면 토끼가 자신만의 수영 메소드를 상속받는 것은 무리입니다. 두 메서드의 작성 형식과 이름이 각각 일치하지 않을 수 있습니다. 따라서 우리는 이 두 하위 클래스에서 "swimming" 메서드의 작성 사양을 제한하는 새로운 개념을 정의해야 합니다.이 시점에서 우리는 "수영"을 정의할 수 있습니다.상호 작용, 인터페이스에서 추상 메서드 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();
}
쓰기 인터페이스 수영:
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의 새로운 기능은 인터페이스에서 정의할 수 있다는 것입니다.사적인방법.
메소드 본문이 있는 메소드는 주로 다음을 위해 인터페이스에 정의됩니다.인터페이스 업그레이드인터페이스가 불변일 수 없다는 점을 고려하면 업그레이드하려면 새로운 메소드를 추가해야 합니다. 이러한 메소드가 추상 메소드인 경우 이 메소드를 구현 클래스에서 동시에 구현해야 하는데 이는 매우 번거롭고 번거로운 작업입니다. 업그레이드가 메소드 본문이 있는 메소드를 사용하는 경우에는 구현 클래스를 추가로 수정할 필요가 없으며 수정이 필요한 경우 다시 작성하여 수정할 수도 있습니다.
인터페이스 Inter1:
package oopInterface5;
public interface Inter1 {
public abstract void method();
public default void default_method() {
System.out.println("Inter1接口中的默认方法");
}
}
인터페이스 Inter2:
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 이상에서는 정적 메서드를 인터페이스에 정의할 수 있으며 이를 정적 메서드로 수정해야 합니다.
인터페이스에서정적 방법정의 형식은 다음과 같습니다.
인터페이스의 정적 메서드에 대해 참고할 사항:
인터페이스를 작성합니다:
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("只要用第五个方法");
}
}