Rumah >Java >javaTutorial >Bagaimana untuk menguasai kelas dan antara muka abstrak Java?
pengenalan abstrak: boleh digunakan untuk mengubah suai: kelas (kelas abstrak), kaedah (kaedah abstrak)
abstrak diubah suai kelas :
①Kelas ini tidak boleh digunakan (iaitu, objek kelas ini tidak boleh dibuat)
②Walaupun ia tidak boleh digunakan dengan sendirinya, subkelas akan memanggil pembina kelas induk, jadi kelas abstrak Mesti ada pembina
①Kaedah abstrak hanya mempunyai pengisytiharan kaedah tetapi tiada badan kaedah, dan kelas yang berada di dalamnya mestilah kelas abstrak. Kerana jika kelas tidak abstrak, maka kelas ini boleh mencipta objek, dan jika ia boleh mencipta objek, ia boleh dipanggil. Sebaliknya, tiada kaedah abstrak dalam kelas abstrak.
② Jika subkelas menulis semula semua kaedah abstrak kelas induk, ia boleh dijadikan instantiated Jika tidak semua ditulis semula, maka subkelas juga merupakan kelas abstrak dan perlu diubah suai dengan abstrak.
③Abstrak tidak boleh digunakan untuk mengubah suai kaedah persendirian, kaedah statik, kaedah yang diubah suai dengan kata kunci akhir dan kelas yang diubah suai dengan kata kunci akhir.
Final jelas tidak boleh diwarisi, tetapi abstrak memerlukan warisan subkelas, jadi ia tidak boleh digunakan, kerana jika kedua-dua kaedah statik, kedua-dua kaedah itu tidak dianggap sebagai ditindih atau ditindih, jadi abstrak digunakan untuk mengubah suai statik kaedah, cuma Tidak boleh ditindih.
Aplikasi abstrak
Corak reka bentuk kaedah templat. Apabila melaksanakan algoritma dalam pembangunan perisian, langkah-langkah keseluruhan adalah sangat tetap dan biasa Langkah-langkah ini ditulis dalam kelas induk, dan beberapa bahagian yang tidak menentu dan tidak pasti boleh diabstrakkan untuk pelaksanaan oleh subkelas.
public static void main(String[] args){ //匿名对象 eat(new son()); //非匿名类的非匿名对象 son John=new son(); eat(John); //匿名子类对象 father f=new father(){//抽象类造对象必须要重写方法,了解看得懂就ok了。 @Override public void work() { } @Override public void info(father i) { } }; } //普通方法 public static void eat(father f){ System.out.println("吃饭"); } //父类 public abstract static class father{ String name; int age; public abstract void work();//抽象方法不能有方法体 public abstract void info(father i); } //子类 public class son extends father{//继承 String name; int age; @Override public void work(){ System.out.println("上学"); } @Override public void info(father i) { System.out.println("name:"+i.name+" age:"+i.age); } } //接口的匿名对象 非匿名的对象可以被多次调用,匿名的对象只能使用一次 Computer com=new Computer();//创建了接口的非匿名实现类(子类)的非匿名对象,类和对象都是有名的 Flash flash = new Flash(); //2.创建了接口的非匿名实现类的匿名对象,对象匿名了 com.transferData(new Printer()); //3创建了接口的匿名实现类的非匿名对象,就是类是匿名的,就不知道是接口中的哪个实现类,所以 需要重写方法进行说明 USB phone = new USB{ public void start(){ ... } }; //4.创建了接口的匿名实现类的匿名对象 com.transferData(new USB(){ public void start(){ ... } });
kelas diubah suai akhir: Kelas ini tidak boleh diwarisi oleh kelas lain, seperti: String, System, StringBuffer
kaedah pengubahsuaian akhir: Kaedah ini tidak boleh ditindih lagi, contohnya: getClass() dalam kelas Objek
akhir statik digunakan untuk mengubah suai sifat: pemalar global
akhir diubah suai pembolehubah : Pembolehubah pada masa ini dipanggil pemalar
atribut diubah suai akhir: Anda boleh mempertimbangkan lokasi penugasan: pemulaan eksplisit, permulaan dalam blok kod, permulaan dalam pembina
akhir diubah suai pembolehubah tempatan : Terutamanya apabila mengubahsuai parameter formal dengan akhir, ia menunjukkan bahawa parameter formal adalah pemalar Apabila memanggil kaedah ini, tetapkan parameter sebenar kepada parameter formal malar Setelah ditetapkan, parameter formal hanya boleh digunakan dalam badan kaedah , tetapi tidak boleh ditugaskan semula
Antaramuka ditakrifkan menggunakan Antara Muka dan berada dalam hubungan selari dengan kelas
Takrifan antara muka dan ahli dalam antara muka:
1. Semua kaedah dalam antara muka adalah abstrak.
2. Walaupun ahli dalam antara muka tidak ditandakan secara eksplisit sebagai awam, mereka adalah daripada jenis akses awam
3. jadi pembolehubah yang ditakrifkan dalam antara muka Pembolehubah adalah pemalar statik global.
4. Anda boleh mentakrifkan antara muka baharu dan menggunakan lanjutan untuk mewarisi antara muka sedia ada
5.
6 Anda boleh mentakrifkan kelas abstrak dan menggunakan alat untuk melaksanakan beberapa kaedah dalam antara muka.
1. Antara muka tidak boleh digunakan
2 Kelas pelaksana mesti melaksanakan semua kaedah antara muka
3 berbilang antara muka
4. Pembolehubah dalam antara muka semuanya adalah pemalar statik
Jika kelas merangkumi semua kaedah abstrak dalam antara muka, anda boleh membuat contoh jika kelas tidak merangkumi semua kaedah abstrak dalam kaedah abstrak antara muka, kelas masih merupakan kelas abstrak. Kelas Java boleh melaksanakan berbilang antara muka - menebus kekurangan warisan tunggal
kelas AA melanjutkan BB melaksanakan CC,DD,EE
Antaramuka dan Antara Muka Warisan perantaraan mungkin , dan pewarisan berbilang mungkin. Penggunaan antara muka mencerminkan polimorfisme. Antara muka ialah spesifikasi, pengaturcaraan untuk antara muka.
Mata yang serupa: ia tidak boleh dijadikan instantiated, kedua-duanya boleh mengandungi kaedah abstrak
Perbezaan:
1 kelas abstrak Definisi dan penjelasan struktur dalaman antara muka (java7, java8)
2. Kelas: warisan tunggal, antara muka: warisan berbilang.
Latihan pada kelas abstrak dan antara muka
abstract class Door { //开门 public abstract void openDoor(); //关门 public abstract void closeDoor(); } interface Lock { public static final int num = 200; //开锁 public abstract void openLock(); //上锁 public abstract void closeLock(); } class LockDoor extends Door implements Lock { public void openDoor() { System.out.println("开门"); } public void closeDoor() { System.out.println("关门"); } public void openLock() { System.out.println("开锁"); } public void closeLock() { System.out.println("上锁"); } } public class TestLockDoor { public static void main(String[] args) { LockDoor lockDoor = new LockDoor(); lockDoor.openLock(); lockDoor.openDoor(); lockDoor.closeDoor(); lockDoor.closeLock(); } }
Aplikasi antara muka
Dua corak reka bentuk
- Corak ejen
Reka bentuk ejen adalah Menyediakan proksi untuk objek lain untuk mengawal akses kepada objek ini
Senario aplikasi: proksi keselamatan, proksi jauh, pemuatan malas
Klasifikasi: proksi statik, proksi dinamik
- Corak kilang
Menyedari pemisahan pencipta dan pemanggil
interface A{ int x=0; } class B{ int x=1; } class C extends B implements A{ public void pX(){ System.out.println(x); } public static void main(String[] args){ new C().pX(); } } //问题:编译期不知道是要输出哪个x System.out.println(super.x);//这个调用的是父类中的 System.out.println(A.x);//这个调用的是接口中的
Ciri antara muka baharu dalam java8
JDK8: Selain pemalar global dan kaedah abstrak, anda juga boleh menentukan kaedah statik dan Lalai kaedah (pengubahsuaian kata kunci lalai)
public interface CompareA{ public static void method1(){ //静态方法 System.out.println("CompareA:北京"); } public default void method2(){ //默认方法 System.out.println("CompareA:上海"); } }
Kaedah statik yang ditakrifkan dalam antara muka hanya boleh dipanggil melalui antara muka, antara muka.kaedah.
Dengan melaksanakan objek kelas, anda boleh memanggil kaedah lalai dalam antara muka, object.method.
Jika kelas pelaksanaan mengatasi kaedah lalai dalam antara muka, kaedah yang diganti masih akan dipanggil semasa memanggil
Jika subkelas (atau kelas pelaksanaan) mewarisi kelas induk dan kaedah A yang dilaksanakan dengan nama yang sama dan parameter yang sama diisytiharkan dalam antara muka Jika subkelas tidak mengatasi kaedah ini, ia akan memanggil kaedah dalam kelas induk - prinsip keutamaan kelas
如果实现类实现了多个接口,而这个多个接口中定义了同名同参数的默认方法,在实现类没有重写方法的情况下会报”接口冲突“错误,此时需要重写。
如何在子类(或者实现类)调用父类、接口中被重写的方法? 接口.super.方法。
需要关注的问题:如何实例化成员内部类的对象:外部类Person,静态内部类Brain,非静态内部类Lungs,静态成员内部类:new 外部类.内部类()
Person.Brain brain=new Person.Brain();
非静态成员内部类:先造对象,对象.new 内部类()
Person p=new Person(); p.Lungs lungs=p.new Lungs();
如何在成员内部类中区分调用外部类的结构
形参直接调,所在类的用this.结构,外部类的用外部类.this.结构
成员内部类和局部内部类在编译以后都会生成字节码文件
成员内部类:外部类.内部类名.class
局部内部类:外部类.数字 内部类名.class
在局部内部类的方法中,如果调用局部内部类所在的方法中的局部变量,该局部变量必须用final关键字修饰(JAVA8之后可以不写出来,但仍然还是final的)
public void Person(){ int num=10; class AA{//局部内部类 public void show(){//局部内部类的方法 num=20;//试图修改会报错 System.out.println(num);//调用局部内部类所在的方法中的局部变量 } } }
开发中局部内部类的使用
常用的局部内部类:
//方式一 public Comparable getCompareble(){ class MyComparable implements Comparable{//局部内部类 public int compareTo(Object o){ return 0; } } return new MyComparable(); } //方式二 public Comparable getCompareble(){ return new Comparable(){ public int CompareTo(Object o){ return 0; } }; }
Java允许将一个类A声明在另一个类B中,A为内部类,B为外部类
内部类的分类:成员内部类、局部内部类(方法内,代码块内,构造器内)
成员内部类
作为外部类的成员:可以调用外部类的结构,可以被static修饰
作为一个类:可以定义属性、方法、构造器,可以用final、abstract修饰,可以被继承
this.name//内部类的属性
Person.this.name//外部类的属性
Atas ialah kandungan terperinci Bagaimana untuk menguasai kelas dan antara muka abstrak Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!