Java基礎學習小記--多態,java小記--多態
題外話:總結了多年的學習心得,不得不說,睡眠是一個學習者的必需品!所謂“早起毀一天”不是沒有道理哪,特別對Coders來說,有幾天不是加班到夜裡。好吧,我承認對於初學Java的我,昨日頭腦頓路,Java的繼承與多態,看得我是有點小懵逼。其實大致是懂了,不過到了具體應用中,特別是比較復雜的繼承和調用關系的時候些許迷路。好了,話不多說,明日再把繼承和多態來個總結,今日先對多態來個小記。
-------------------------------------------------------------------------------------------------------------------
現在我們要做這麼一個媒體庫,用來存放CD和DVD。可以往媒體庫裡添加CD和DVD,還可以列出來媒體庫裡所有的CD和DVD。
我們用到了繼承的概念:CD是一個對象,DVD也是。兩者又有很多相似的地方,比方說都有名字,播放時間,評論,等等,為了以後便於管理和調試,我們做了一個父類叫Item,它下面有兩個子類:CD,DVD。
然後我們還需要做一個類(對象)來管理它們,這個對象有一個ArrayList的成員變量當作媒體庫,有一個add函數用來添加CD或DVD,還得有個list函數用來列出媒體庫裡的所有東西。我們給這個類起名Database。
這樣我們就要做以下四個java源文件:

源碼:

![]()
1 package dome;
2
3 import java.util.ArrayList;
4
5 public class Database {
6
7 private ArrayList<Item> listItem = new ArrayList<Item>();
8
9 public void add(Item item) {
10 listItem.add(item);
11 }
12
13 public void list() {
14 for(Item item:listItem) {
15 item.print();
16 }
17 }
18
19 public static void main(String[] args) {
20 Database db = new Database();
21 db.add(new CD("黑夢",600,true,"Classic Album","窦唯",10));
22 db.add(new DVD("功夫",900,false,"Let's do this!","周星馳"));
23 db.add(new CD("Wall",700,false,"Psychedelic Rock","PinkFloyd",15));
24 db.list();
25 }
26
27 }
Database.java

![]()
1 package dome;
2
3 public class Item {
4
5 private String title;
6 private int playTime;
7 private boolean gotIt = false;
8 private String comment;
9
10 public Item(String title, int playTime, boolean gotIt, String comment) {
11 super();
12 this.title = title;
13 this.playTime = playTime;
14 this.gotIt = gotIt;
15 this.comment = comment;
16 }
17
18 public void print() {
19 System.out.print(title+":"+playTime+":"+gotIt+":"+comment);
20 }
21
22 }
Item.java

![]()
1 package dome;
2
3 public class CD extends Item {
4
5 private String artist;
6 private int numofTracks;
7
8 public CD(String title, int playTime, boolean gotIt, String comment, String artist, int numofTracks) {
9 super(title, playTime, gotIt, comment);
10 this.artist = artist;
11 this.numofTracks = numofTracks;
12 }
13
14 public void print() {
15 System.out.print("CD:");
16 super.print();
17 System.out.println(":"+artist+":"+numofTracks);
18 }
19
20 }
CD.java

![]()
1 package dome;
2
3 public class DVD extends Item {
4
5 private String director;
6
7 public DVD(String title, int playTime, boolean gotIt, String comment, String director) {
8 super(title, playTime, gotIt, comment);
9 this.director = director;
10 }
11
12 public void print() {
13 System.out.print("DVD:");
14 super.print();
15 System.out.println(":"+director);
16 }
17
18 }
DVD.java
運行:

這裡有兩個概念:
多態變量:在這裡可以說是,一個父類下面有兩個子類,在Database裡第9行:Item item,定義了一個對象變量item,這個item是Item類,這個item還只是一個變量,是一個對象的管理者,但還沒有具體要去管的那個對象。在main函數裡可以去給item賦一個CD,也可以給他賦DVD,所以這個item變量是要根據程序運行的時候才能知道他要管理的那個對象是什麼。這個item就是多態變量。
向上造型:想上造型是指拿一個子類的對象給父類的對象變量,或者說拿一個子類的對象當父類的對象來用,如Database裡db.add一樣,我們可以拿一個CD或DVD給item這個Item類對象變量。向上造型總是安全的。
-------------------------------------------------------------------------------------------------------------------
然後是多態:
在Database運行的過程中,第15行,有句item.print

我們可以看到這是在調用Item裡的print函數,不過我們從程序運行結果來看仿佛不是這麼回事,運行結果顯示明明是調用CD.print();和DVD.print();的結果。
Item.print():

CD.print():

DVD.print():

這就要用多態去解釋:首先當子類和父類裡有相同名稱的函數時,子類裡的函數會去覆蓋(override)從父類那裡繼承來的那個同名函數,於是從父類來的那個函數就會隱藏起來不起作用。然後Database第15行裡的item會去看它管理的是什麼它自己的Item類還是他的子類,如果是它的子類,那麼這個print函數就會用它子類那裡的print函數。
