1. 程式人生 > 其它 >2017年-2020年按月計算節假日與工作日

2017年-2020年按月計算節假日與工作日

抽象類

概念:類和類之間有共同的特徵,將這些共同特徵的類再進一步抽象形成了抽象類

註解:由於類本身是不存在的,所以抽象類無法建立物件(無法例項化),抽象類和抽象類實際上可能還會有共同特徵還可以進一步再抽象,抽象類也屬於引用資料型別

抽象類的定義

語法:[修飾列表符] abstract class 類名{類體}

抽象方法的定義

public abstract void 方法名();

抽象方法特點:

沒有方法體,以分好結尾,前面的修飾符列表中有abstract關鍵字

注意:

  1. 抽象類是無法例項化的,無法建立物件的,所以抽象類是用來被子類繼承的

  2. final和abstract不能聯合使用,這兩個關鍵字是對立的

  3. 抽象類的子類可以是抽象類。也可以是非抽象類。

  4. 抽象類雖然無法例項化,但是抽象類有構造方法,這個構造方法是供子類使用的

  5. 抽象類中不一定有抽象方法,抽象方法必須出現在抽象類中

  6. 一個非抽象的類,繼承抽象類,必須將抽象類中的抽象方法進行覆蓋/重寫/實現。

注意:java語言中凡是沒有方法體的方法不一定都是抽象方法

例如:Object類中就有很多方法都沒有方法體,都是以“;”結尾的,但他們都不是抽象方法。

例如:public native int hashCode();

這個方法底層呼叫了C++寫的動態連結庫程式

前面修飾符列表中沒有:abstract。有一個native。表示呼叫JVM本地

介面

介面是一種“引用資料型別”。特殊的抽象類

介面的定義:[修飾符列表] interface 介面名{}

介面特點:

  1. 介面是完全抽象的

  2. 介面支援多繼承(不支援實現,介面不能實現介面,只能繼承)

  3. 介面中只有常量+抽象方法(JDK1.8之後接口裡面可以有預設方法(default修飾的)和靜態方法)

  4. 介面中所有的元素都是public修飾的

  5. 介面中抽象方法的public abstract可以省略

  6. 介面中常量的public static final可以省略

  7. 介面中方法不能有方法體(都是抽象方法)

  8. 一個非抽象的類,實現介面的時候,必須將介面中所有方法加以實現

  9. 一個類可以實現多個介面。類似多繼承(這種機制(java中的介面)彌補了單繼承的帶來的缺陷)

  10. extends和implements可以共存,extends在前,implements在後(一個類先繼承父類再實現介面)

  11. 一個類實現了多個介面,多個介面中有同名的抽象方法時,子類只會實現一個抽象方法

使用介面,寫程式碼的時候,可以使用多型(父型別引用指向子型別物件)(面向介面程式設計)

例子:

 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{}

抽象類和介面有什麼區別?

區別抽象類介面
抽象類是半抽象的 介面是完全抽象的
抽象類中有構造方法 介面中沒有構造方法
類和類之間只能單繼承 介面和介面之間支援多繼承
一個抽象類只能繼承一個類(單繼承) 一個類可以同時實現多個介面
介面中只允許出現常量和抽象方法(JDK1.8後可以出現靜態方法和預設方法)