zoukankan      html  css  js  c++  java
  • Java基础学习小记--多态

    题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓“早起毁一天”不是没有道理哪,特别对Coders来说,有几天不是加班到夜里。好吧,我承认对于初学Java的我,昨日头脑顿路,Java的继承与多态,看得我是有点小懵逼。其实大致是懂了,不过到了具体应用中,特别是比较复杂的继承和调用关系的时候些许迷路。好了,话不多说,明日再把继承和多态来个总结,今日先对多态来个小记。

    -------------------------------------------------------------------------------------------------------------------

    现在我们要做这么一个媒体库,用来存放CD和DVD。可以往媒体库里添加CD和DVD,还可以列出来媒体库里所有的CD和DVD。

    我们用到了继承的概念:CD是一个对象,DVD也是。两者又有很多相似的地方,比方说都有名字,播放时间,评论,等等,为了以后便于管理和调试,我们做了一个父类叫Item,它下面有两个子类:CD,DVD。

    然后我们还需要做一个类(对象)来管理它们,这个对象有一个ArrayList的成员变量当作媒体库,有一个add函数用来添加CD或DVD,还得有个list函数用来列出媒体库里的所有东西。我们给这个类起名Database。

    这样我们就要做以下四个java源文件:

    源码:

     1 package dome;
     2 
     3 import java.util.ArrayList;
     4 
     5 public class Database {
     6     
     7     private ArrayList<Item> listItem = new ArrayList<Item>();
     8     
     9     public void add(Item item) {
    10         listItem.add(item);
    11     }
    12     
    13     public void list() {
    14         for(Item item:listItem) {
    15             item.print();
    16         }
    17     }
    18     
    19     public static void main(String[] args) {
    20         Database db = new Database();
    21         db.add(new CD("黑梦",600,true,"Classic Album","窦唯",10));
    22         db.add(new DVD("功夫",900,false,"Let's do this!","周星驰"));
    23         db.add(new CD("Wall",700,false,"Psychedelic Rock","PinkFloyd",15));
    24         db.list();
    25     }
    26     
    27 }
    Database.java
     1 package dome;
     2 
     3 public class Item {
     4 
     5     private String title;
     6     private int playTime;
     7     private boolean gotIt = false;
     8     private String comment;
     9     
    10     public Item(String title, int playTime, boolean gotIt, String comment) {
    11         super();
    12         this.title = title;
    13         this.playTime = playTime;
    14         this.gotIt = gotIt;
    15         this.comment = comment;
    16     }
    17     
    18     public void print() {
    19         System.out.print(title+":"+playTime+":"+gotIt+":"+comment);
    20     }
    21     
    22 }
    Item.java
     1 package dome;
     2 
     3 public class CD extends Item {
     4 
     5     private String artist;
     6     private int numofTracks;
     7     
     8     public CD(String title, int playTime, boolean gotIt, String comment, String artist, int numofTracks) {
     9         super(title, playTime, gotIt, comment);
    10         this.artist = artist;
    11         this.numofTracks = numofTracks;
    12     }
    13     
    14     public void print() {
    15         System.out.print("CD:");
    16         super.print();
    17         System.out.println(":"+artist+":"+numofTracks);
    18     }
    19     
    20 }
    CD.java
     1 package dome;
     2 
     3 public class DVD extends Item {
     4     
     5     private String director;
     6 
     7     public DVD(String title, int playTime, boolean gotIt, String comment, String director) {
     8         super(title, playTime, gotIt, comment);
     9         this.director = director;
    10     }
    11     
    12     public void print() {
    13         System.out.print("DVD:");
    14         super.print();
    15         System.out.println(":"+director);
    16     }
    17     
    18 }
    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函数。

  • 相关阅读:
    redis的坑
    引入easyui的404问题
    添加 @ResponseBody出现错误的问题
    星期,时间
    activiti的坑
    使用shiro遇到的问题
    IS应用程序池的查看与配置【转载】
    JS判断值是否是数字
    如何在EJS中将变量呈现为HTML?
    My97DatePicker日期控件的下载及使用方法
  • 原文地址:https://www.cnblogs.com/xingyazhao/p/5936377.html
Copyright © 2011-2022 走看看