继承:
当代码中出项大量的代码复制时,意味着将来去维护这样的代码时是十分不容易的,并且这类代码不具有可扩展性,当我们要增加一种新的类型时,我们又将要去建一个新的类,又将要去增加许多相似的代码。
那么我们就要去改进这类代码,继承就这样产生了。
说到继承,那么就要讲到子类和父类的关系。
子类可以得到父类的所有函数,若是子类没有一个函数而父类有,则用父类的函数,若是子类和父类同时有同一个函数,则使用子类的。
下面就通过一个数据库的例子来解释
数据库类
package cd;
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 自动生成的方法存根
Database db = new Database();
db.add(new CD("abc", "abc", 4, 60, "。。。"));
db.add(new CD("aaa", "sss", 5, 20, "。。。"));
db.add(new DVD("abc", "abc", 60, "。。。"));
db.add(new DVD("aaa", "sss", 20, "。。。"));
db.list();
}
}
CD类
package cd;
public class CD extends item { //加了extends,CD就成了item的一个子类,这就叫继承
private String artist;
private int numofTracks;
public CD(String title, String artist, int numofTracks, int playingTime, String comment) {
super(title, playingTime, false, comment);//子类运用super(调用父类变量)来继承变量,来进入item进行初始化
// this.title = title;
this.artist = artist;
this.numofTracks = numofTracks;
// this.playingTime = playingTime;
// this.comment = comment;
}
public static void main(String[] args) {
}
// public void print() {
// System.out.println("title:" + title);
// System.out.println("artist:" + artist);
// System.out.println("numofTracks:" + numofTracks);
// System.out.println("playingTime:" + playingTime);
// System.out.println("comment:" + comment);
// System.out.println("---------------------");
//
// }
}
DVD类
package cd;
public class DVD extends item {
private String director;
public DVD(String title, String director, int playingTime, String comment) {
// //super();//如果super没有参数则会调用父类没有参数的构造函数
//如果只有this.title = title这句话,那么父类中有空的构造函数,没有super()也可以。
//但是会出现两个title,playingTime,comment
// this.title = title;
// this.director = director;
// this.playingTime = playingTime;
// this.comment = comment;
super(title, playingTime, false, comment);
this.director = director;
}
public static void main(String[] args) {
DVD dvd = new DVD("a","b",1,"..");
dvd.print();
}
public void print() {
// System.out.println("title:" + title);替换为下面的
System.out.println("title:");
super.print();//调用父类一样的print要用super
System.out.println("director:" + director);
// System.out.println("playingTime:" + playingTime);
// System.out.println("comment:" + comment);
System.out.println("---------------------");
}
}
父类item类
package cd;
public class item {
// protected String title; //protected表示自己可以访问,同一个包内的可以访问,子类也可以访问
//但是这个尽量不要用,除非没办法
private String title;
private int playingTime;
private boolean gotIt = false;
private String comment;
// public item() {
//
// }
public item(String title, int playingTime, boolean gotIt, String comment) {
super();
this.title = title;
this.playingTime = playingTime;
this.gotIt = gotIt;
this.comment = comment;
}
public static void main(String[] args) {
}
public void print() {
System.out.print(title);
}
}