天天看點

繼承和多态

  學習目标

  1.了解繼承的目的

  2.了解繼承和多态的關系

  3.知道如何重新定義方法

  4.認識java.lang.Object

  5.簡單介紹垃圾回收機制

一、繼承

    子類繼承(Inherit)父類,避免重複的行為定義,不過并非為了重複定義就濫用繼承,濫用繼承會導緻程式維護問題。

    1.繼承共同行為

      在一款遊戲中所有的角色共同擁有角色等級角色名稱角色血量等則可以定義一個角色類實作來實作共有的方法。每種角色通過extends關鍵字來繼承。  

繼承和多态
繼承和多态

1 package Learn;
 2 
 3 public class SwordMan extends role {
 4     public void fight(){
 5         System.out.println("揮劍攻擊");
 6     }
 7 
 8 }
 9 package Learn;
10 
11 public class role {
12     private String name;
13     private int level;
14     private int blood;
15     public String getName() {
16         return name;
17     }
18     public void setName(String name) {
19         this.name = name;
20     }
21     public int getLevel() {
22         return level;
23     }
24     public void setLevel(int level) {
25         this.level = level;
26     }
27     public int getBlood() {
28         return blood;
29     }
30     public void setBlood(int blood) {
31         this.blood = blood;
32     }
33     
34 
35 }      

View Code

    2.多态與is-a

      子類和父類是由is-a的關系由上面的例子可以發現swordman是一種role

繼承和多态
繼承和多态
1     role r1=new SwordMan();
2         SwordMan s1=(SwordMan) r1;//部強制轉換編譯會錯誤
3         SwordMan s2=new SwordMan();
4         role r2=s2;      

      多态的作用是什麼呢。不用一種一種的去實作顯示血量的方法,在測試統計等等方面的作用是非常的實用的。

繼承和多态
繼承和多态
1 package Learn;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         role[] r=new role[]{new SwordMan(),new SwordMan(),new SuperWomen(),new SuperWomen()};
 6         for (int i=0;i<3;i++) {
 7             ShowBlood(r[i]);
 8         }
 9     }
10     public static void ShowBlood(role r){
11         System.out.println(r.toString()+""+r.getBlood());
12     }
13 }      

     3.重新定義行為

      role中有fight的方法但是每個不同的role SuperWomen或SwordMan中實作的内容不同。子類可以重新定義fight的方法

繼承和多态
繼承和多态
1 package Learn;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         role[] r=new role[]{new SwordMan(),new SwordMan(),new SuperWomen(),new SuperWomen()};
 6         for (int i=0;i<4;i++) {
 7             Showfight(r[i]);
 8         }
 9     }
10     public static  void Showfight(role r){
11         r.fight();
12     }
13 }
14 
15 package Learn;
16 
17 public class SwordMan extends role {
18     public void fight(){
19         System.out.println("揮劍攻擊");
20     }
21 
22 }
23 
24 package Learn;
25 
26 public class SuperWomen extends role {
27     public  void fight(){
28         System.out.println("我是超級女王我可以出擊");
29     }
30     
31 
32 }
33 
34 package Learn;
35 
36 public class role {
37     private String name;
38     private int level;
39     private int blood;
40     public void fight(){}
41     public String getName() {
42         return name;
43     }
44     public void setName(String name) {
45         this.name = name;
46     }
47     public int getLevel() {
48         return level;
49     }
50     public void setLevel(int level) {
51         this.level = level;
52     }
53     public int getBlood() {
54         return blood;
55     }
56     public void setBlood(int blood) {
57         this.blood = blood;
58     }
59     
60 
61 }      

結果:

揮劍攻擊

我是超級女王我可以出擊

   3.1重新定義的細節

    子類重新定義了方法之後想要取得父類的方法可以在調用的方法之前加上super關鍵字。super關鍵字調用的方法不能定義為private,重新定義的方法是對于父類的權

    限隻能擴大不能縮小。重新定義是除了可以定義權限較大的關鍵字除外,其他部分必須與父類中一緻。static屬于類擁有,如果子類定義了相同的static成員,該成員屬

    于子類所有而不是重新定義。

  3.2 構造函數

  如果類有繼承的關系,建立子類執行個體值後,會先進行父類定義的初始化流程,在進行子類的初始化流程。,也就是建立子類執行個體之後,會先執行父類的構造方法在執行子

  類的構造方法。。如果子類中的構造方法中沒有指定父類構造方法會預設調用父類的無參數構造函數。

4.認識Java.lang.object

   任何類追溯至最上層的父類一定是Java.lang.Object。者有一個好處就是如果有需求是使用數組收集各種的對象,那就可以通過Object[]來收集。

   Object[] objs={"monica",new Date();new role()}.所有對象都繼承了Object類是以Object所有的方法都可以被重新定義,toString(),equals()等等。

5.關于垃圾收集

   無法再使用的某個對象,該對象便是隻會消耗記憶體的垃圾。JVM有垃圾收集(Garbage Collection,GC)機制,收集到的垃圾對象所占的記憶體空間,會被

   垃圾收集齊釋放。

   some[] somes={new some(),new some(),new some()}

   some=null;

    則所有參考的對象被回收。