informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Mengapa ada antarmuka?
Seperti kita ketahui bersama, pewarisan adalah mengekstraksi abstraksi umum di subkelas ke dalam kelas induk, dan memperolehnyakesamaan keseluruhan sistemNamun, untuk menyimpan kode, ada juga situasi: sebagian besar subkelas memiliki kesamaan tertentu, tetapi hanya beberapa subkelas yang tidak memiliki fitur ini, maka jika kesamaan ini ditulis ke kelas induk, maka akan diwariskan, yang tidak masuk akal untuk beberapa subkategori ini.
Misalnya: kucing dan anjing bisa berenang, tapi kelinci tidak bisa. Saat ini, jika metode "berenang" didefinisikan di kelas induk, tidak masuk akal jika kelinci mewarisinya masing-masing, hal tersebut mungkin saja terjadi. Format penulisan dan penamaan kedua metode tersebut tidak konsisten. Oleh karena itu, kita perlu mendefinisikan konsep baru untuk membatasi spesifikasi penulisan metode "berenang" di kedua subkelas ini.Pada titik ini, kita dapat mendefinisikan "berenang"antarmuka, tentukan metode abstrak swim() di antarmuka, lalu biarkan kucing dan anjing terhubung ke antarmuka ini untuk memastikanPenyatuan kode。
Singkatnya, antarmuka adalah aaturan, ketika kita perlu mendefinisikan aturan untuk beberapa kelas secara bersamaan, kita perlu menggunakanantarmuka。
Antarmuka tidak mewakili suatu jenis hal, antarmuka mewakilisebuah aturan, sehingga antarmuka dapat diteruskan sebagai parameter ke metode.
“Entah itu truk, roda tiga, atau tenaga kerja, asalkan bisa bergerak, akan berguna.”
搬家(车的对象);
搬家(搬家公司);
public interface 运输 {
...
}
public void 搬家(运输的接口 c) {
...
}
public interface 接口名 {}
public class 类名 implements 接口名 {}
public class 类名 implements 接口名1 , 接口名2 {}
public class 类名 extends 父类 implements 接口名1 , 接口名2 {}
praktik:Tulis kelas Javabean standar dengan antarmuka dan kelas abstrak.
青蛙 属性:名字,年龄 行为:吃虫子,蛙泳
狗 属性:名字,年龄 行为:吃骨头,狗刨
兔子 属性:名字,年龄 行为:吃胡萝卜
Tuliskan kelas induknya terlebih dahulu. Karena ketiga subkelas tersebut memakan hal yang berbeda, Anda dapat mendefinisikan makan() sebagai metode abstrak:
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();
}
Tulis antarmuka Berenang:
package oopInterface;
public interface Swim {
public abstract void swim();
}
Saat menulis kelas katak, perhatikan pewarisan kelas induk dan penulisan ulang metode abstrak kelas induk, dan perhatikan penerapan antarmuka renang:
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("青蛙在吃虫子。");
}
}
Saat menulis kelas anjing, perhatikan pewarisan kelas induk dan tulis ulang metode abstrak kelas induk untuk mengimplementasikan antarmuka renang:
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("狗在吃骨头。");
}
}
Saat menulis kelas kelinci, perhatikan bahwa Anda hanya perlu mewarisi kelas induk dan mengganti metode abstrak, dan tidak perlu mengimplementasikan antarmuka renang (Anda tidak bisa berenang):
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("兔子在吃胡萝卜。");
}
}
Tulis kelas tes.
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());
}
}
Melihat:
1. Ketika sebuah kelas mengimplementasikan sebuah antarmuka, ia harus mengimplementasikan semua metode abstrak di antarmuka tersebut, atau kelas itu sendiri juga merupakan kelas abstrak.
2. Sebuah kelas dapat mengimplementasikan banyak antarmuka. Jika kelas tersebut mengimplementasikan banyak antarmuka, maka hal tersebut perlu dilakukansemuaSemua metode abstrak yang akan diterapkan di antarmuka diimplementasikan.
3. Antarmuka dapat diwarisi dari beberapa antarmuka. Jika sub-antarmuka mewarisi beberapa antarmuka dan kemudian diimplementasikan oleh kelas implementasi, maka kelas implementasi harus menggabungkan sub-antarmuka dan semua antarmuka induknya.semuaSemua metode abstrak diterapkan.
praktik:Tulis kelas Javabean standar dengan antarmuka dan kelas abstrak.
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
//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("教篮球。");
}
}
Sebelum JDK7, hanya metode abstrak yang dapat didefinisikan dalam antarmuka.
Fitur baru JDK8 adalah: metode dengan badan metode dapat didefinisikan di antarmuka (dapat mendefinisikanbawaanmetode ataustatismetode).
Fitur baru JDK9 adalah: dapat didefinisikan di antarmukapribadimetode.
Metode dengan badan metode didefinisikan dalam antarmuka, terutama untukPeningkatan antarmukaMengingat antarmuka tidak dapat diubah, metode baru perlu ditambahkan ke dalamnya untuk memutakhirkan. Jika metode ini adalah metode abstrak, saat ini metode tersebut perlu diimplementasikan di kelas implementasi pada saat yang sama, yang sangat merepotkan dan. tidak mudah untuk disinkronkan; jika pemutakhiran menggunakan metode dengan badan metode, maka kelas implementasi tidak perlu dimodifikasi tambahan. Jika diperlukan modifikasi, dapat juga dimodifikasi dengan menulis ulang.
Antarmuka Inter1:
package oopInterface5;
public interface Inter1 {
public abstract void method();
public default void default_method() {
System.out.println("Inter1接口中的默认方法");
}
}
Antarmuka Inter2:
package oopInterface5;
public interface Inter2 {
public default void default_method() {
System.out.println("Inter2接口中的默认方法");
}
}
Kedua metode default memiliki nama yang sama. Jika kelas implementasi mengimplementasikan dua antarmuka ini secara bersamaan, metode default ini harus ditulis ulang!
package oopInterface5;
public class InterImpl implements Inter1, Inter2 {
@Override
public void method() {
System.out.println("抽象方法的实现");
}
@Override
public void default_method() {
System.out.println("重写接口中的默认方法");
}
}
Kelas tes:
package oopInterface5;
public class Test {
public static void main(String[] args) {
InterImpl ii = new InterImpl();
ii.method(); //抽象方法的实现
ii.default_method(); //重写接口中的默认方法
}
}
JDK8 dan yang lebih baru akan mengizinkan metode statis untuk didefinisikan dalam antarmuka, yang perlu dimodifikasi dengan statis.
di antarmukametode statisFormat definisinya adalah:
Hal yang perlu diperhatikan tentang metode statis di antarmuka:
Tulis antarmuka:
package oopInterface6;
public interface Inter {
public abstract void method();
public static void static_method() {
System.out.println("接口中的静态方法");
}
}
Tulis kelas implementasi. Ada juga metode statis di kelas dengan nama yang sama dengan metode di antarmuka, tetapi ini tidak dilakukan karena metode statis tidak dapat diganti:
package oopInterface6;
public class InteImpl implements Inter {
@Override
public void method() {
System.out.println("重写接口中的抽象方法");
}
//这不叫重写
public static void static_method() {
System.out.println("我不是重写的Inter接口中的静态方法");
}
}
Namun nyatanya keduanya merupakan metode yang berbeda.
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. Antarmuka mewakili aturan dan merupakan abstraksi perilaku. Jika Anda ingin suatu kelas memiliki suatu perilaku, biarkan saja kelas tersebut mengimplementasikan antarmuka yang sesuai.
2. Jika parameter suatu metode adalah antarmuka, antarmuka tersebut dapat dilewatiSemua objek kelas implementasi, pendekatan ini disebut polimorfisme antarmuka.
Adaptor dapat digunakan untuk menyederhanakan kode dan menghindari ketidaknyamanan yang ditimbulkan ketika ada terlalu banyak metode abstrak di antarmuka dan kita hanya perlu menggunakan sebagian saja.
Langkah-langkah penulisannya secara umum adalah:
1. Tulis XXXAdapter kelas menengah untuk mengimplementasikan antarmuka yang sesuai.
2. Mengimplementasikan implementasi kosong dari metode abstrak di antarmuka.
3. Biarkan kelas implementasi nyata mewarisi kelas perantara dan menulis ulang metode yang diperlukan.
4. Untuk mencegah kelas lain membuat objek dari kelas adaptor, kelas adaptor perantara dihias dengan abstrak.
antarmuka:
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();
}
Kelas adaptor:
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() {
}
}
Kelas implementasi:
package AdapterDesignPattern;
public class InterImpl extends InterAdapter {
//我需要用到哪个方法,就重写哪个方法就可以了
@Override
public void method5() {
System.out.println("只要用第五个方法");
}
}