2017年-2020年按月計算節假日與工作日
概念:類和類之間有共同的特徵,將這些共同特徵的類再進一步抽象形成了抽象類
註解:由於類本身是不存在的,所以抽象類無法建立物件(無法例項化),抽象類和抽象類實際上可能還會有共同特徵還可以進一步再抽象,抽象類也屬於引用資料型別
抽象類的定義
語法:[修飾列表符] abstract class 類名{類體}
抽象方法的定義
public abstract void 方法名();
抽象方法特點:
沒有方法體,以分好結尾,前面的修飾符列表中有abstract關鍵字
注意:
-
抽象類是無法例項化的,無法建立物件的,所以抽象類是用來被子類繼承的
-
final和abstract不能聯合使用,這兩個關鍵字是對立的
-
抽象類的子類可以是抽象類。也可以是非抽象類。
-
抽象類雖然無法例項化,但是抽象類有構造方法,這個構造方法是供子類使用的
-
抽象類中不一定有抽象方法,抽象方法必須出現在抽象類中
-
一個非抽象的類,繼承抽象類,必須將抽象類中的抽象方法進行覆蓋/重寫/實現。
注意:java語言中凡是沒有方法體的方法不一定都是抽象方法
例如:Object類中就有很多方法都沒有方法體,都是以“;”結尾的,但他們都不是抽象方法。
例如:public native int hashCode();
這個方法底層呼叫了C++寫的動態連結庫程式
前面修飾符列表中沒有:abstract。有一個native。表示呼叫JVM本地
介面的定義:[修飾符列表] interface 介面名{}
介面特點:
-
介面是完全抽象的
-
介面支援多繼承(不支援實現,介面不能實現介面,只能繼承)
-
介面中只有常量+抽象方法(JDK1.8之後接口裡面可以有預設方法(default修飾的)和靜態方法)
-
介面中所有的元素都是public修飾的
-
介面中抽象方法的public abstract可以省略
-
介面中常量的public static final可以省略
-
介面中方法不能有方法體(都是抽象方法)
-
一個非抽象的類,實現介面的時候,必須將介面中所有方法加以實現
-
一個類可以實現多個介面。類似多繼承(這種機制(java中的介面)彌補了單繼承的帶來的缺陷)
-
extends和implements可以共存,extends在前,implements在後(一個類先繼承父類再實現介面)
-
一個類實現了多個介面,多個介面中有同名的抽象方法時,子類只會實現一個抽象方法
使用介面,寫程式碼的時候,可以使用多型(父型別引用指向子型別物件)(面向介面程式設計)
例子:
1 public interface MyAnimal{ 2 void eat();//public abstract 介面會預設加上 3 } 4 5 public class CatImpl implements MyAnimal{ 6 public void eat(){ 7 8 } 9 } 10 public class Test{ 11 public static void main(String[] args){ 12 MyAnimal my = new CatImpl();//這是可以的 13 my.eat(); 14 } 15 }
注意:介面和介面之間在進行強制型別轉換的時候,沒有繼承關係,也可以強轉,編譯沒問題,但是要注意,執行的時候可能會出現ClassCastException異常
例子:
1 public interface A{} 2 public interface B{} 3 public class C implements A{} 4 public class Test{ 5 public static void main(String[] args){ 6 A a = new C(); 7 B b = (B)a;//編譯沒問題,執行有問題 8 //所以先判斷 9 if(a instanceof B){ 10 B b = (B)a; 11 } 12 } 13 } 14 public interface D{ 15 void a1(); 16 } 17 public interface E(){ 18 void a2(); 19 } 20 public interface F(){ 21 void a3(); 22 } 23 public class G implements D,E,F{ 24 public void a(){} 25 public void b(){} 26 public void c(){} 27 } 28 public class Test(){ 29 public static void main(String[] args){ 30 D d = new G(); 31 E e = new G(); 32 F f = new G(); 33 34 //這個編譯沒問題,執行也沒問題 35 E e1 = (E)d;//想呼叫其他介面中的方法,需要轉型(介面轉型) 36 e1.a2();//調a2()方法 37 //也可以一步到位轉成G 38 G g = (G)d; 39 g.a2(); 40 g.a3(); 41 } 42 }
註解:介面中的靜態方法的使用:不能通過介面實現類的物件來呼叫介面當中的靜態方法,通過介面名稱直接呼叫其中的靜態方法。
介面在開發中的作用:
類似於多型在開發中的作用 面向介面程式設計
多型:面向抽象程式設計,不要面向具體程式設計。降低程式的耦合度。提高程式的擴充套件力
介面在開發中的作用,一句話:三個字"解耦合"
介面可以解耦合,解開的是誰和誰的耦合?
任何一個介面都有呼叫者和實現者,介面可以將呼叫者和實現者解耦合,呼叫者面向介面呼叫,實現者面向介面編寫實現。
面向介面程式設計,可以降低程式的耦合度,提高程式的擴充套件力。符合OCP開發原則。
介面的使用離不開多型機制。(介面+多型才可以達到降低耦合度。)
類和類之間的關係
三個術語
描述 | 關係 |
---|---|
is a | 繼承關係 |
has a | 關聯關係 |
like a | 實現關係 |
is a:
1 //Cat is a Animal(貓是一個動物) 2 //凡是能夠滿足is a的表示“繼承關係” 3 public class Cat extends Animal{}
has a
1 //I has a Address(我有一個地址) 2 //凡是能夠滿足has a關係的表示“關聯關係” 3 public class User{ 4 Address address; 5 }
like a:
1 //Cooker like a FoodMenu(廚師像一個選單一樣)((想象你僱傭了一個私人廚師,想吃什麼給他說,他就是一個移動選單)) 2 //凡是能夠滿足like a關係的表示“實現關係” 3 //凡是能夠滿足like a關係的表示“實現關係” 4 public class Cooker implements FoodMenu{}
抽象類和介面有什麼區別?
區別 | 抽象類 | 介面 |
---|---|---|
抽象類是半抽象的 | 介面是完全抽象的 | |
抽象類中有構造方法 | 介面中沒有構造方法 | |
類和類之間只能單繼承 | 介面和介面之間支援多繼承 | |
一個抽象類只能繼承一個類(單繼承) | 一個類可以同時實現多個介面 | |