文档章节

三.Java的多态性

短短的歼击机
 短短的歼击机
发布于 2013/12/26 00:50
字数 1063
阅读 24
收藏 0

3.1 多态性的含义


通过类型转换,把一个对象当作它的基类对象对待。 
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
测试例子:

[java] view plaincopy

  1. public class Game  

  2. {  

  3.     public void play()  

  4.     {  

  5.     }  

  6. }  

  7.   

  8.   

  9. class Football extends Game  

  10. {  

  11.     @Override  

  12.     public void play()  

  13.     {  

  14.         System.out.println("踢足球");  

  15.         super.play();  

  16.     }  

  17. }  

  18. //...Basketball  

  19. //...Tennis  

调用:

[java] view plaincopy

  1. Game football = new Football();  

  2. Game basketball = new Basketball();  

  3. Game tennis = new Tennis();  

  4. football.play();  

  5. basketball.play();  

  6. tennis.play();  


输出:
踢足球
打篮球
打网球


可以看出football,basketball,tennis都是Game类型的,而且他们都调用play()这个方法,但是有不用的输出,这就是多态性,
由于多态性,一个父类的引用变量可以指向不同的子类对象,并且在运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法。
在java中,多态性是依靠动态绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法。
所以一个父类的引用变量可以指向不同的子类对象,并且在运行时根据所指向对象的实际类型执行相应的子类方法。
正是如此,所以上例中的对象对同样的消息(paly()方法),做出不同的响应。


动态分为2中:
(1) 编译时多态:编译时动态重载
(2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖


3.2 重写Overriding和重载Overloading



方法的重写和重载是Java多态性的不同表现。


重写Overriding
重写是父类与子类之间多态性的一种表现,子类定义的方法与父类中的方法拥有相同的名称和参数,这就是重写,也成为覆盖。
重载Overloading
重载是一个类中多态性的一种表现,即一个类中可以有同名的方法,只要他们的参数不同。


注意:
* 子类方法不能缩小父类方法的访问权限
  * 子类方法不能抛出比父类方法更多的异常
  * 子类可以定义和父类的静态方法同名的静态方法,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
  * 父类的非静态方法不能被子类覆盖为静态方法
  * 父类的私有(private)方法不能被子类覆盖
  * 父类的非抽象方法可以被覆盖为抽象方法


3.3 向上转型和向下转型



(1)向上转型:
通过将子类对象赋值给父类对象引用变量来实现动态方法调用。也就是向上转型,向上转型是自动的。
如:
Game football = new Football();


(2)向下转型:
向下转型不是自动的,需要强制转换。
Game game = new Football();
Football football = (Football) game;//向下转型
football.play();
因为game的实际类型是Football,所以这样的向下转型是安全的。
而如果:
Game game = new Game();
Football football = (Football) game;
则会报错ClassCastException,父类是不能强制转换为子类的,因为子类有的方法父类可能没有。
简单点说,足球是一个运动项目,但是运动项目不等于就是足球。


为什么需要向下转型?

[java] view plaincopy

  1. public class Game  

  2. {  

  3. }  

  4.   

  5.   

  6. class Football extends Game  

  7. {  

  8.     public void play()  

  9.     {  

  10.         System.out.println("踢足球");  

  11.     }  

  12. }  




假如这样调用:
Game game = new Football();
game.play();
错误:The method play() is undefined for the type Game
play()在Game这个类中并没有定义,因为game是Game类型的。


3.4 Java中强制的多态



强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。
2.0 + 2.0
将两个double的操作数相加;Java中特别声明了这种用法。
2.0 + 2
将double和int的操作数相加。Java中没有明确定义这种运算。编译器隐式的将第二个操作数转换为double型,并作double型的加法。
2.0 + "2"
将double与一个String相加。Java中同样没有定义这样的操作。所以,编译器将 double转换成String类型,并将他们做串联。


© 著作权归作者所有

短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
小谈Java Enum的多态性

Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态? 不过还是先看看“现象”吧: Java代码 public enum Fruit { APPLE, PEAR, PEACH, OR...

关西大汉弹琵琶
2015/05/30
229
0
I'm not me? —— 多态的另一个例子

按:我感觉我出了一个还不错的面试题~ 代码如下: SuperClass.java SubClass.java Client.java Client 的几个输出语句的输出结果写在代码注释中了。其中,需要特别注意的是:s.a != s.getA...

Iridium
2018/11/25
81
2
Java面向对象概述及三大特征(封装,继承和多态)

一、面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计。面向对象程序的最小单元是类,类代...

编辑之路
01/10
43
0
Java程序员从笨鸟到菜鸟之(三)面向对象之封装,继承,多态(下)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 上接:Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上) 五:再谈继承 继承是一种联结类的层...

长平狐
2012/11/12
138
0
作为一个java程序员这些技能你都知道吗?

一、Java特点 1、 面向对象 尽管受到其前辈的影响,但Java没被设计成兼容其他语言源代码的程序。这允许Java开发组自由地从零开始。这样做的一个结果是,Java语言可以更直接、更易用、更实际的...

java高级架构牛人
2018/05/23
39
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部