在 Database
类中调用 item.print()
时,调用的是 item
的实际类型的方法,而不是其引用类型的方法。
public class Database {
private ArrayList<Item> listItem = new ArrayList<>();
public void add(Item item) {
listItem.add(item);
}
public void list() {
for (Item item : listItem) {
item.print(); // 调用的是 item 的实际类型的 print 方法
}
}
public static void main(String[] args) {
Database db = new Database();
db.add(new CD("abc", "abc", 4, 60, "..."));
db.add(new DVD("xxx", "aaa", 120, "..."));
db.list(); // 输出 CD 和 DVD 的 print 方法的结果
}
}
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;
}
@Override
public void print() {
System.out.print("CD:");
super.print();
System.out.println(":" + artist);
}
}
public class DVD extends Item {
private String director;
public DVD(String title, String director, int playingTime, String comment) {
super(title, playingTime, false, comment);
this.director = director;
}
@Override
public void print() {
System.out.print("DVD:");
super.print();
System.out.println(":" + director);
}
}
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) {
this.title = title;
this.playingTime = playingTime;
this.gotIt = gotIt;
this.comment = comment;
}
public void print() {
System.out.println(title);
}
}
多态性
- 多态性:在 Java 中,多态性允许子类实例通过父类引用来调用子类的重写方法。
- 实际类型决定方法调用:在
Database
类的list
方法中,item
的引用类型是Item
,但是它的实际类型可以是CD
或DVD
。当调用item.print()
时,Java 会调用item
的实际类型(即运行时类型)的print
方法。
运行时的行为
在 Database
类的 main
方法中,以下代码:
db.add(new CD("abc", "abc", 4, 60, "..."));
db.add(new DVD("xxx", "aaa", 120, "..."));
db.list();
会执行如下步骤:
db.add(new CD(...))
将一个CD
对象添加到listItem
列表中。db.add(new DVD(...))
将一个DVD
对象添加到listItem
列表中。db.list()
会遍历listItem
列表,并调用每个Item
对象的print
方法。
由于 listItem
列表中的对象实际类型是 CD
和 DVD
,即使它们的引用类型是 Item
,实际调用的 print
方法是 CD
和 DVD
类中重写的 print
方法。
super.print()
public void print() {
System.out.print("CD:");
super.print();
System.out.println(":"+artist);
}
super.print();
的作用是调用父类 Item
中的 print
方法。这是 Java 中的一种常见技术,用于在子类的方法中调用父类的实现。
super.print();
的作用:super
关键字用于调用父类的方法。在CD
类的print
方法中,super.print();
会调用Item
类中的print
方法。- 这允许
CD
类的print
方法在输出CD:
之后,调用Item
类的print
方法来打印title
,然后继续打印artist
。
调用顺序:
System.out.print("CD:");
输出CD:
super.print();
调用Item
类中的print
方法,输出title
System.out.println(":" + artist);
输出:
和artist