浙大《面向物件程式設計--java語言》學習筆記(第四周:繼承和多型)
阿新 • • 發佈:2019-01-06
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 型別系統