首页 > 编程语言 >【练习代码】6.11 java学习记录:继承与多态(实例:媒体资料库的设计)

【练习代码】6.11 java学习记录:继承与多态(实例:媒体资料库的设计)

时间:2024-06-11 23:03:35浏览次数:23  
标签:java String title DVD 6.11 多态 private CD public

设计一个媒体资料库,能存入不同类别的媒体资料,例如CD与DVD,并且能完成添加与列表等操作,需要些什么?

最基础的想法

一个代表整体库的DataBase类,内部的属性包括CD和DVD的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();
        }

    }
}

因为需要CD和DVD的Arraylist,于是创造CD类和DVD类,并设置两者的内部属性和打印出内容的方法,以DVD的代码为例:

public class DVD  {
    private String title;
    private String director;
    private int playingTime;
    private boolean gotIt;
    private String comment;

    public DVD(String title, String director, int playingTime, String comment) {
        
        this.title = title;
        this.director = director;
        this.playingTime = playingTime;
        this.comment = comment;
    }

    public void print() {
        System.out.println("DVD:" + ":" + director);

    }
}

第一次优化:继承的使用

不难想到,CD类与DVD类的构建是完全类似的,除了个别特有的数据,两个类之间的高度相似导致了代码复制现象,代码复制是代码质量不良的体现,不仅从观感上显得臃肿且赘余,更导致代码的可拓展性不佳:假设需要向媒体库中添加新的类型,难免导致大量的代码增改。

因此,我们需要合理利用继承关系,将这些类归为同一父类的子类,其中所有复用的代码都来自对于父类的继承,这样我们不仅避免了代码复制现象,在新增类型时便无需改动其他部分的代码,只需使它继承那个父类。

于是我们在这里设计一个Item类,它具有CD类与DVD类的共同的属性与方法,代码如下:

public class Item {
    private String title;
    private int playingTime;
    private boolean gotIt;
    private String comment;

    public Item() {

    }

    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.println(title);
    }
}

而CD类与DVD类修改为继承自Item,只需初始化Item类中没有的属性,并且重写Item类的print方法,使其符合自身需要,这次以CD类为例,代码如下:

public class CD extends Item {
    //private String title;
    private String artist;
    private int numOfTracks;
//    private int playingTime;
//    private boolean gotIt;
//    private String comment;

    public CD(String title, String artist, int numOfTracks, int playingTime, String comment) {
//        this.title = title;
        super(title, playingTime, false, comment);
        this.artist = artist;
        this.numOfTracks = numOfTracks;
//        this.playingTime = playingTime;
//        this.comment = comment;
    }



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

        super

        可以发现在对CD类的修改中有一处细节,由于属性仅在父类中,且访问属性设置为private,虽然子类确实继承了该属性,但是无法之间使用,因此需要利用super()访问,其使用方法及特性与关键字this类似,super指向当前对象的父类型特征,super()是当前对象构造方法中去调用自己父类的构造方法。

添加新媒体类型

完成继承关系的构造后,可以通过添加新的媒体类型来体会两者在方便程度上的显著区别——完全不需要改动DataBase中的代码,可以先看有了Item后、且Item的子类只有CD和DVD时DateBase的代码:

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

    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) {
        Database db = new Database();
        db.add(new CD("abc", "ai", 1, 20, "..."));
        db.add(new CD("c", "ai", 3, 20, "..."));
        db.add(new DVD("a", "i", 1, "..."));
        db.add(new DVD("X", "ai", 20, "..."));
        

        db.list();
    }
}

不难发现其中完全没有CD与DVD本身的出现,都是借助父类的特点——子类的对象可以赋值给父类的变量,实现与原本一致的效果;因此需要新增媒体类型时,只需完成对应类的构建,并在main函数中执行想要的操作就行,新增媒体类型VideoGame代码如下:

public class VideoGame extends Item {

    private int numberOfPlayers;

    public VideoGame(String title, int playingTime, boolean gotIt, String comment,int number) {
        super(title, playingTime, gotIt, comment);
        numberOfPlayers = number;
    }

    @Override
    public void print() {
        System.out.print("VideoGame:");
        super.print();
    }
}

        @Override

        对于@Override,这是一个告诉编译器的,下方所写是在覆盖父类的对应方法的标志。

        值得注意的是,通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象的所属类的函数。

运行效果

符合预期:

标签:java,String,title,DVD,6.11,多态,private,CD,public
From: https://blog.csdn.net/m0_68184427/article/details/139609439

相关文章

  • JAVA开发 PDF文件生成表格,表格根据内容自动调整高度
    1、展示效果2、相关功能实现JAVA开发使用ApachePDFBox库生成PDF文件,绘制表格3、实现代码importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.pdmodel.PDPage;importorg.apache.pdfbox.pdmodel.PDPageContentStream;importorg.apache.pdfbo......
  • 2024最强Java面试八股
    Java基础八股文(背诵版)Java语言具有哪些特点?Java为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性。Java利用Java虚拟机运行字节码,无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译,编译后的程序可在其它平台运行。Java为解释型......
  • 使用 Flink SQL 读取本地csv文件(Java实现)
    data.csv内容:1,Tom,152,Lily,133,Mike,214,John,205,Emma,186,Sophia,197,David,228,James,169,Olivia,1710,Robert,2311,Emily,1412,Daniel,2513,Amelia,24代码:packagecom.auguigu.demo;importorg.apache.flink.streaming.api.datastream.DataStream;impo......
  • 第五章:多态、抽象类、虚函数、虚函数表
    一、虚函数:1.1虚函数的概念:被virtual修饰的类成员函数称为虚函数。通过重写虚函数,可以实现多态。        1.2如何重写虚函数:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表类型完全相同),称子类的虚函数重......
  • 线程介绍及其Java如何用Thread 类创建线程和操作线程方法
    目录一、进程和线程1.1进程特征2.2线程特征2.3区别二、利用Thread类创建线程2.1通过创建Thread子类,重写run()方法2.2通过实现Runnable接口,重写run()方法2.3.Callable接口+FutureTask创建线程2.3三种方法区别1.通过创建Thread子类,重写run()方法2.通过实......
  • 基本数据类型 String,null 和 undefined,运算符,流程控制,JavaScript之数组,数组常用
    Ⅰ基本数据类型String【一】String类型String类型就是字符串类型【二】定义变量【1】常规变量var变量名="变量值";//一般用这种var变量名='变量值';不支持三引号【2】可以先声明不赋值先用varb;再对变量b赋值varb='6';【三】字符串的格式化输出语法......
  • 神奇的JavaScript弱等价类型转换
    JavaScript语言特性-类型转换JavaScript这门语言的类型系统从来没有它表面看起来的那样和善,虽然比起Java、C#等一众强类型语言,它的弱类型使用起来似乎是如此便利,但正因为它极高的自由度,所以才会衍生出令人摸不着头脑的荒诞行为。举个例子,虽然我们都知道一个包含内容的字符串会......
  • 继承/多继承/菱形继承/虚继承/多态
    以下是一个简单的比喻,将多态概念与生活中的实际情况相联系:比喻:动物园的讲解员和动物表演想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。在这个场景中,我们可以将动物比作是不同的类,而每......
  • 探索Java的奥秘:网络编程、反射与注解的深度解析
    Java,作为一门功能强大的编程语言,在网络编程、反射和注解方面提供了丰富的支持和灵活的应用。本文将深入探讨这些概念,并通过实际例子来加深理解。一、Java网络编程1.1网络编程基础网络编程是Java语言的一大亮点,它允许我们创建能够通过网络进行通信的程序。Java提供了java......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript美食网站(零食)
    HTML+CSS+JS【美食网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......