1. 程式人生 > >浙大《面向物件程式設計--java語言》學習筆記(第四周:繼承和多型)

浙大《面向物件程式設計--java語言》學習筆記(第四周:繼承和多型)

4.1 繼承

這裡我們有三個檔案

首先是Database.java

 

package dome;

import java.util.ArrayList;

public class Database {
	private ArrayList<CD> listCD = new ArrayList<CD>();
	private ArrayList<DVD> listDVD = new ArrayList<DVD>();
	
	public void add(CD cd) {
		listCD.add(cd);
	}
	
	public void add(DVD dvd) {
		listDVD.add(dvd);
	}
	
	public void list() {
		for(CD cd: listCD) {
			cd.print();
		}
		for(DVD dvd: listDVD) {
			dvd.print();
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Database db = new Database();
		db.add(new CD("abc", "abc", 4, 60, "..."));
		db.add(new CD("def", "def", 4, 60, "..."));
		db.add(new DVD("xxx", "aaa", 60, "..."));
		db.list();
	}

}

然後是CD.java

package dome;

public class CD {
	private String title;
	private String artist;
	private int numofTracks;
	private int playingTime;
	private boolean gotIt = false;
	private String comment;
	

	public CD(String title, String artist, int numofTracks, int playingTime, String comment) {
		super();
		this.title = title;
		this.artist = artist;
		this.numofTracks = numofTracks;
		this.playingTime = playingTime;
		this.comment = comment;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	public void print() {
		// TODO Auto-generated method stub
		System.out.println("CD:"+title+":"+artist);
	}

}

再然後是DVD.java

package dome;

public class DVD {
	private String title;
	private String director;
	private int playingTime;
	private boolean gotIt = false;
	private String comment;
	
	
	public DVD(String title, String director, int playingTime, String comment) {
		super();
		this.title = title;
		this.director = director;
		this.playingTime = playingTime;
		this.comment = comment;
	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}


	public void print() {
		// TODO Auto-generated method stub
		System.out.println("DVD:"+ title+":"+director);		
	}

}

上面這個程式,本來是沒有問題的。不過我們很容易發現DVD和CD這兩個類十分相似,重複的程式碼很多,也因此,我們考慮應用“繼承”去改進這個程式。

 

父類的所有東西,在子類中都是存在的。

父類中的所有東西,在子類中都是“可能”可以用的

4.2 子類父類關係

 

結果是: 當我們去構造一個子類的物件的時候,它首先要確保,它父類所擁有的那些成員變數,得到恰當的初始化。這裡的“恰當的初始化”,包含兩件事情:第一,定義初始化。第二,構造器。總是父類的成員變數得到恰當的初始化,再進行自己的。

如果子類裡沒有寫明super(),那麼子類回去找父類中的無參建構函式。如果寫明瞭super(xxx),那麼將回去找相應的父類的建構函式。

 

總結一下:

父類所有的東西,子類都繼承到了。

但是如果一個東西是private,那麼子類不能碰。但是子類可以通過父類裡的函式,去碰父類裡的這個private的

如果說,當父類和子類中,有著同名變數時。那麼對父類,這個變數指的就是父類中這個。對於子類,這個變數就是指的子類中這個,這兩個變數沒有任何關係。

這裡的話,我們有4個程式

Database.java

package dome;

import java.util.ArrayList;

public class Database {
//	private ArrayList<CD> listCD = new ArrayList<CD>();
//	private ArrayList<DVD> listDVD = new ArrayList<DVD>();
	private ArrayList<Item> listItem = new ArrayList<Item>();
	
//	public void add(CD cd) {
//		listCD.add(cd);
//	}
//	
//	public void add(DVD dvd) {
//		listDVD.add(dvd);
//	}
	
	public void add(Item item) {
		listItem.add(item);
	}
	
	public void list() {
//		for(CD cd: listCD) {
//			cd.print();
//		}
//		for(DVD dvd: listDVD) {
//			dvd.print();
//		}
		for(Item item: listItem) {
			item.print();
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Database db = new Database();
		db.add(new CD("abc", "abc", 4, 60, "..."));
		db.add(new CD("def", "def", 4, 60, "..."));
		db.add(new DVD("xxx", "aaa", 60, "..."));
		db.list();
	}

}

Item.java

package dome;

public class Item {
	private String title;
	private int playingTime;
	private boolean gotIt = false;
	private String comment;
	
	public Item(String title, int playingTime, boolean gotIt, String comment) {
		super();
		this.title = title;
		this.playingTime = playingTime;
		this.gotIt = gotIt;
		this.comment = comment;
	}
	
	public void setTitle(String title) {
		this.title = title;
	}

	public Item() {
		
	}
	
	public void print() {
		// TODO Auto-generated method stub
		System.out.print(this.title);
	}

}

CD.java

package dome;

public class CD extends Item{
	private String artist;
	private int numofTracks;


	public CD(String title, String artist, int numofTracks, int playingTime, String comment) {
		super(title,playingTime,false,comment);
		this.artist = artist;
		this.numofTracks = numofTracks;

	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CD cd = new CD("abc", "abc", 4, 60, "...");
		cd.print();
	}

	public void print() {
		// TODO Auto-generated method stub
//		System.out.println("CD:"+title+":"+artist);
	}

}

DVD. java

package dome;

public class DVD extends Item{
	private String director;

	
	public DVD(String title, String director, int playingTime, String comment) {
//		super(title);
		super(title,playingTime,false,comment);
		setTitle("Unchained Melody");
		this.director = director;

	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DVD dvd = new DVD("a", " 傑瑞·扎克", 4,  "...");
		dvd.print();
	}


	public void print() {
		// TODO Auto-generated method stub
		System.out.print("DVD:");	
		super.print();
		System.out.print(" "+director);
	}

}

4.3多型變數和向上造型

 

 子類的物件總是可以安全的交給父類

 

 

接下來解釋“向上造型”

int a = (int)10.2 這裡時強制型別轉換

而item = (Item)DVD 這裡是造型。

 

 

4.4 多型

 4.5 型別系統