4.1继承(2)

我们把用来做基础派生其它类的那个类叫做父类、超类或者基类,而派生出来的新类叫做子类。Java用关键字extends表示这种继承/派生关系:

class ThisClass extends SuperClass { 
    //…
}

继承表达了一种is-a关系,就是说,子类的对象可以被看作是父类的对象。比如鸡是从鸟派生出来的,因此任何一只都可以被称作是一只鸟。但是反过来不行,有些鸟是鸡,但并不是所有的鸟都是鸡。如果你设计的继承关系,导致当你试图把一个子类的对象看作是父类的对象时显然很不合逻辑,比如你让鸡类从水果类得到继承,然后你试图说:这只本鸡是一种水果,所以这本鸡煲就像水果色拉。这显然不合逻辑,如果出现这样的问题,那就说明你的类的关系的设计是不正确的。Java的继承只允许单继承,即一个类只能有一个父类。

关键字:extends 父类有什么,子类就继承什么


4.2子类父类关系

父类成员访问属性在父类中的含义在子类中的含义
public对所有人开放对所有人开放
protected只有包内其它类、自己和子类可以访问只有包内其它类、自己和子类可以访问
缺省只有包内其它类可以访问如果子类与父类在同一个包内:只有包内其它类可以访问

否则:相当于private,不能访问

private只有自己可以访问不能访问

父类的私有的成员函数在子类不能直接访问,但可以通过调用函数

代码修改:

Database.java:

package demo;

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>();
//	private void add(CD cd) {
//		listCD.add(cd);
//	}
//	
//	private void add(DVD dvd) {
//		listDVD.add(dvd);
//	}
	private 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();
	}

}

CD.java:

package demo;

public class CD extends Item {
//	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(title,playingTime,false,comment);
		this.artist = artist;
		this.numofTracks = numofTracks;
	}

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

	public void print() {
		System.out.print("CD"+":");
		super.print();
		System.out.println(":"+artist);
	}

}

DVD.java:

package demo;

public class DVD extends Item{
//	private String title;
	private String director;
//	private int playingTime;
//	private boolean gotIt=false;
//	private String comment;
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	public DVD(String title, String director, int playingTime, String comment) {
		super(title,playingTime,false,comment);
		this.director = director;
	}
	public void print() {
		// TODO Auto-generated method stub
		System.out.print("DVD"+":");
		super.print();
		System.out.println(":"+director);
	}

}

Item.java:

package demo;

public class Item {
	protected 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 print() {
		System.out.print(title);
	}

}