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 类型系统