Java的多态性

发布于:2024-06-02 ⋅ 阅读:(42) ⋅ 点赞:(0)

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);
    }
}

多态性

  1. 多态性:在 Java 中,多态性允许子类实例通过父类引用来调用子类的重写方法
  2. 实际类型决定方法调用:在 Database 类的 list 方法中,item 的引用类型是 Item,但是它的实际类型可以是 CDDVD。当调用 item.print() 时,Java 会调用 item 的实际类型(即运行时类型)的 print 方法。

运行时的行为

Database 类的 main 方法中,以下代码:

db.add(new CD("abc", "abc", 4, 60, "..."));
db.add(new DVD("xxx", "aaa", 120, "..."));
db.list();

会执行如下步骤:

  1. db.add(new CD(...)) 将一个 CD 对象添加到 listItem 列表中。
  2. db.add(new DVD(...)) 将一个 DVD 对象添加到 listItem 列表中。
  3. db.list() 会遍历 listItem 列表,并调用每个 Item 对象的 print 方法。

由于 listItem 列表中的对象实际类型是 CDDVD,即使它们的引用类型是 Item,实际调用的 print 方法是 CDDVD 类中重写的 print 方法。

super.print()

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

super.print(); 的作用是调用父类 Item 中的 print 方法。这是 Java 中的一种常见技术,用于在子类的方法中调用父类的实现

  1. super.print(); 的作用

    • super 关键字用于调用父类的方法。在 CD 类的 print 方法中,super.print(); 会调用 Item 类中的 print 方法。
    • 这允许 CD 类的 print 方法在输出 CD: 之后,调用 Item 类的 print 方法来打印 title,然后继续打印 artist
  2. 调用顺序

    • System.out.print("CD:"); 输出 CD:
    • super.print(); 调用 Item 类中的 print 方法,输出 title
    • System.out.println(":" + artist); 输出 :artist


网站公告

今日签到

点亮在社区的每一天
去签到