我们用到了继承的概念:cd是一个对象,dvd也是。两者又有很多相似的地方,比方说都有名字,播放时间,评论,等等,为了以后便于管理和调试,我们做了一个父类叫item,它下面有两个子类:cd,dvd。
然后我们还需要做一个类(对象)来管理它们,这个对象有一个arraylist的成员变量当作媒体库,有一个add函数用来添加cd或dvd,还得有个list函数用来列出媒体库里的所有东西。我们给这个类起名database。
这样我们就要做以下四个java源文件:
源码:
package dome; import java.util.arraylist; public class database { private arraylist listitem = new arraylist(); public void add(item item) { listitem.add(item); } public void list() { for(item item:listitem) { item.print(); } } public static void main(string[] args) { database db = new database(); db.add(new cd(黑梦,600,true,classic album,窦唯,10)); db.add(new dvd(功夫,900,false,let's do this!,周星驰)); db.add(new cd(wall,700,false,psychedelic rock,pinkfloyd,15)); db.list(); } } database.java
package dome; public class item { private string title; private int playtime; private boolean gotit = false; private string comment; public item(string title, int playtime, boolean gotit, string comment) { super(); this.title = title; this.playtime = playtime; this.gotit = gotit; this.comment = comment; } public void print() { system.out.print(title+:+playtime+:+gotit+:+comment); } } item.java
package dome; public class cd extends item { private string artist; private int numoftracks; public cd(string title, int playtime, boolean gotit, string comment, string artist, int numoftracks) { super(title, playtime, gotit, comment); this.artist = artist; this.numoftracks = numoftracks; } public void print() { system.out.print(cd:); super.print(); system.out.println(:+artist+:+numoftracks); } } cd.java
package dome; public class dvd extends item { private string director; public dvd(string title, int playtime, boolean gotit, string comment, string director) { super(title, playtime, gotit, comment); this.director = director; } public void print() { system.out.print(dvd:); super.print(); system.out.println(:+director); } } dvd.java
运行:
这里有两个概念:
多态变量:在这里可以说是,一个父类下面有两个子类,在database里第9行:item item,定义了一个对象变量item,这个item是item类,这个item还只是一个变量,是一个对象的管理者,但还没有具体要去管的那个对象。在main函数里可以去给item赋一个cd,也可以给他赋dvd,所以这个item变量是要根据程序运行的时候才能知道他要管理的那个对象是什么。这个item就是多态变量。
向上造型:想上造型是指拿一个子类的对象给父类的对象变量,或者说拿一个子类的对象当父类的对象来用,如database里db.add一样,我们可以拿一个cd或dvd给item这个item类对象变量。向上造型总是安全的。
-------------------------------------------------------------------------------------------------------------------
然后是多态:
在database运行的过程中,第15行,有句item.print
我们可以看到这是在调用item里的print函数,不过我们从程序运行结果来看仿佛不是这么回事,运行结果显示明明是调用cd.print();和dvd.print();的结果。
item.print():
cd.print():
dvd.print():
这就要用多态去解释:首先当子类和父类里有相同名称的函数时,子类里的函数会去覆盖(override)从父类那里继承来的那个同名函数,于是从父类来的那个函数就会隐藏起来不起作用。然后database第15行里的item会去看它管理的是什么它自己的item类还是他的子类,如果是它的子类,那么这个print函数就会用它子类那里的print函数。
