`
fuquan
  • 浏览: 27307 次
文章分类
社区版块
存档分类
最新评论

三.Java的多态性

 
阅读更多

3.1 多态性的含义


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

public class Game
{
	public void play()
	{
	}
}


class Football extends Game
{
	@Override
	public void play()
	{
		System.out.println("踢足球");
		super.play();
	}
}
//...Basketball
//...Tennis
调用:
Game football = new Football();
Game basketball = new Basketball();
Game tennis = new Tennis();
football.play();
basketball.play();
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,父类是不能强制转换为子类的,因为子类有的方法父类可能没有。
简单点说,足球是一个运动项目,但是运动项目不等于就是足球。


为什么需要向下转型?
public class Game
{
}


class Football extends Game
{
	public void play()
	{
		System.out.println("踢足球");
	}
}



假如这样调用:
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类型,并将他们做串联。





  



分享到:
评论

相关推荐

    实验二:java多态性.rar

    实验二:java多态性.rar实验二:java多态性.rar

    java多态性详解——父类引用子类对象.pdf

    多态性是 Java 面向对象编程的三个特征之一,另外两个是封装和继承。多态性是指通过方法的重写、重载和动态连接来实现的。在 Java 中,多态性是为了解决单继承问题而引入的概念。 第一点,多态性可以通过父类类型的...

    java多态性.pdf

    Java 的多态性是面向对象编程的三个特征之一,另外两个是封装和继承。多态性是指同一个方法可以根据不同的对象而有不同的行为,或者说同一个方法可以根据不同的对象而有不同的实现。 Java 之所以引入多态的概念,是...

    Java多态性浅析.pdf

    Java多态性浅析.pdf

    java类和对象继承多态性

    java类和对象继承多态性 是JAVA的基础学习课件,有利于提高

    Java多态性的实现.pdf

    Java多态性的实现.pdf

    java多态性

    java中多态性的体现与使用 方法的重写

    编程语言java多态性.pdf

    编程语言java多态性.pdf

    Java多态性探悉()

    Java多态性探悉 .......推荐。、。

    Java多态性实验报告

    Java多态性实验报告 1、编写一个名为“复数”的类,包含复数的实部和虚部(数据成员),以及复数之间的基本算术运算:加、减(方法成员),并要求复数加减运算,程序运行中能对给定的复数进行运算,并打印运算的结果...

    Java多态性实验报告Java多态性实验报告

    Java多态性实验报告 1、编写一个名为“复数”的类,包含复数的实部和虚部(数据成员),以及复数之间的基本算术运算:加、减(方法成员),并要求复数加减运算,程序运行中能对给定的复数进行运算,并打印运算的结果....

    优质java课件 java程序设计教程(第6版)09.多态性(共41页).ppt

    【完整课程列表】 ...优质java课件 java程序设计教程(第6版)01.计算机系统概述(共42页).ppt 优质java课件 java程序设计教程(第...多态性(共41页).ppt 优质java课件 java程序设计教程(第6版)10.异常(共56页).ppt

    java多态性练习

    关于java多态性和abstract修饰的使用 一个具体的实例 简单易懂

    Java(多态性).avi

    Java(多态性).avi

    java多态性讲解

    可以更清楚的了解java,帮助你认识java的多态性

    Java基础知识:多态性

    Java 基础知识:多态性 Java 语言是一种面向对象的编程语言,多态性是其核心特性之一。多态性是指同一个方法在不同对象上具有不同的行为。通过多态性,我们可以编写出灵活、可扩展的代码,提高代码的可维护性和可...

    Java多态性之隐式重载的应用分析.pdf

    Java多态性之隐式重载的应用分析.pdf

    【Java编程教程】详解Java 多态性.pdf

    Java 中的多态性是一个概念,我们可以通过它以不同的方式执行单个操作。多态性源自两个希腊词:poly 和 morphs。“poly”这个词意味着许多,“morphs”意味着形式。所以多态性意味着多种形式。

    JAVA面向对象编程第四章继承性和多态性 课件.ppt

    JAVA面向对象编程第四章继承性和多态性课件 本节课程主要讲解Java面向对象编程的第四章内容,即继承性和多态性。继承性是面向对象编程的基本特性之一,指的是子类可以继承父类的成员变量和成员方法,实现代码的重用...

    对象多态性

    对于JAVA多态性的理解是非常好的帮助,多态性是JAVA中常用的性质

Global site tag (gtag.js) - Google Analytics