浙大《面向对象程序设计--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 类型系统

猜你喜欢

转载自blog.csdn.net/garrulousabyss/article/details/85668924
今日推荐