Java基础学习小记--多态
题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓“早起毁一天”不是没有道理哪,特别对Coders来说,有几天不是加班到夜里。好吧,我承认对于初学Java的我,昨日头脑顿路,Java的继承与多态,看得我是有点小懵逼。其实大致是懂了,不过到了具体应用中,特别是比较复杂的继承和调用关系的时候些许迷路。好了,话不多说,明日再把继承和多态来个总结,今日先对多态来个小记。
-------------------------------------------------------------------------------------------------------------------
现在我们要做这么一个媒体库,用来存放CD和DVD。可以往媒体库里添加CD和DVD,还可以列出来媒体库里所有的CD和DVD。
我们用到了继承的概念:CD是一个对象,DVD也是。两者又有很多相似的地方,比方说都有名字,播放时间,评论,等等,为了以后便于管理和调试,我们做了一个父类叫Item,它下面有两个子类:CD,DVD。
然后我们还需要做一个类(对象)来管理它们,这个对象有一个ArrayList的成员变量当作媒体库,有一个add函数用来添加CD或DVD,还得有个list函数用来列出媒体库里的所有东西。我们给这个类起名Database。
这样我们就要做以下四个java源文件:

源码:
package dome;
import java.util.ArrayList;
public class Database {
private ArrayList<Item> listItem = new ArrayList<Item>();
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函数。

Java基础学习小记--多态的更多相关文章
- [转帖]java基础学习总结——多态(动态绑定)
https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态
- java基础学习总结——多态(动态绑定)
一.面向对象最核心的机制——动态绑定,也叫多态
- Java基础学习篇---------多态
一.多态性的理解 1.向上转型:子类为父类对象实例化,调用的一定是子类覆写的方法,他们之间找的是共性 2.向下转型:子类扩充了父类的某些功能,而父类中没有该功能,他们之间找的是特性 案例: Numbe ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- 转载-java基础学习汇总
共2页: 1 2 下一页 Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3 Java基础学习总结——Java对象的序列化和 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习(2)
Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
随机推荐
- ROC曲线与AUC值
本文根据以下文章整理而成,链接: (1)http://blog.csdn.net/ice110956/article/details/20288239 (2)http://blog.csdn.net/ ...
- StringUtils 的用法
1.public static boolean isEmpty(String str) 判断某字符串是否为empty,标准是 null == str 或 str.length() == 0 2.pub ...
- @@IDENTITY与SCOPE_IDENTITY()
在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值.如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. ...
- JS的IE和Firefox兼容性
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox 0.px的问题 obj.style.left = ”100px”; obj.style.top ...
- Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件
为了响应touch事件,需要设置OnMapTouchListener 示例: private void initMapEventsListener() { mapWidget.setOnMapTouc ...
- 机器学习&数据挖掘笔记_24(PGM练习八:结构学习)
前言: 本次实验包含了2部分:贝叶斯模型参数的学习以及贝叶斯模型结构的学习,在前面的博文PGM练习七:CRF中参数的学习 中我们已经知道怎样学习马尔科夫模型(CRF)的参数,那个实验采用的是优化方法, ...
- 使用 CSS3 动画实现的 3D 图片过渡特效
这是一个基于 CSS3 动画实现的图片过渡效果,共有 Flip.Rotation.Multi-flip.Cube.Unfold 等6种效果,它们将证明 CSS3 Transform 和 Transit ...
- Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编 对于许多在windows 上调试代码的人而言, Intel IA32格式的汇编代码可能并不陌生,因为种 ...
- C#指定时间和当前时间的相差的月份、天数
DateTime 类型有时间的 年月日时分秒等属性,但是获取两个DateTime的 相差月份,就需要自己写了: public static int GetSubMonth(DateTime speci ...
- html/css/js小技巧实例
一些学习中碰到的小技巧 让div自动撑起来: .clearfix:after{ content: "."; clear: both; display: block; visibil ...