`

009 面向对象之多态

 
阅读更多

面向对象之多态

 

 

在Java中,对象变量是多态的。一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象。


以多态的形式来传递参数,增强了参数类型的灵活性。


现在假设有一个类Aclass,由它派生了一个子类Bclass,那么,我们可以将子类Bclass的对象赋给父类变量:
Aclass a = new Bclass();


这其实体现了Java中的所谓“替换原则(substitution principle)”:无论何时,只要程序需要一个父类对象,那么就可以用一个子类对象来替代它。


多态带来的一个明显的好处就是:以多态的形式来传递参数,增强了参数类型的灵活性


例如,我们需要在学校管理系统的某个类(假设为CalClass)中定义一个方法来根据学生或老师的年龄来计算相应的出生年代(此处“Teacher”类和“Stucent”类均为“Person”类的子类),可以这样来定义这个方法:
public class CalClass{
 … …
 public int calTeacherBirthYear(Teacher t){
  // 根据参数t的年龄来计算教师的出生年代
 }
 public int calStudentBirthYear(Student s){
  // 根据参数s的年龄来计算学生的出生年代
 }
}
如果使用多态的概念,我们只要定义一个方法来计算就可以了:
public class CalClass{
 .. …
 public int calPersonBirthYear(Person p) {
  // 根据参数p的年龄来计算出生年代
 }
}


如果需要计算某个学生的出生年代,只需要将这个学生对应的对象当作参数传递给这个方法,如果需要计算某个老师的出生年代,只需要将这个老师对应的对象当作参数传递给这个方法。


在使用多态来传递参数的时候,有一个问题需要注意:一个对象只能有一种确切的数据类型,如果将一个变量声明为父类的引用类型,那么,即使它引用的对象是某个子类的对象,编译器也只是将这个对象当作是父类型对象,因此,若一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。


比如,我们用Person来声明一个变量,然后再将这个变量指向Teacher,这个时候,就不能用这个变量来调用子类Teacher特有的方法或属性了:
 Person p;
 p = new Teacher();
 p.setDepartment(“数学教研室”);//错误


除了父类和子类之间的这种多态机制外,接口和实现它的类之间也可以象父类和子类一样实现多态机制,只需要简单的将接口看成实现它的类的“父类”即可

 

 

1. 多态(Polymorphism):我们可以这样表达:子类是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的对象。<PolyTest.java>

2. 当使用多态方式调用方法时,首先检查父类中是否存在被调用的方法,如果没有则编译错误;如果有,再去调用并执行子类的方法,注意,父类的方法并不被执行。

理解:如果一个父类型的引用指向子类型的对象,那么用这个引用只能调用父类中存在的方法。因为,在编译时,程序会先去父类中寻找相应的方法。<PolyTest.java>

3. 一共有两种类型的强制类型转换:

a) 向上类型转换(upcast):比如说将Cat类型转换为Animal类型,即将子类型转换为父类型。对于向上类型转换,不需要显式指定。

b) 向下类型转换(downcast):比如将Animal类型转换为Cat类型。即将父类型转换为子类型。对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。

理解:

1、父类引用指向子类对象时,此引用若想调用子类中有但父类中没有的方法,可以通过把父类引用向下类型转化来完成。

2、子类上层类型的引用最多可以被强制向下转化他所指向的对象的类型,在引用类型和子类对象之间的类型都可以强制转化。不能转化为跟子类对象同级的其他对象类型。

c)向下类型转化的作用

由于指向子类对象的父类引用不能调用子类独有的方法,因此通过向下类型转化为子类后就可以调用了。

d)向上类型转换的作用

[ PolyTest3.java]

 

多态是一种运行中的行为,在编译阶段Java是不知道其实际行为的。

[PolyTest5.java]

 

e)多态的好处

比较程序:[ PolyTest6.java][PolyTest7.java]

 

一个随机取数据程序:

 

分享到:
评论

相关推荐

    JAVA面向对象之多态.pdf

    JAVA面向对象之多态.pdf

    C#面向对象编程-多态习题[整理].pdf

    C#面向对象编程-多态习题[整理].pdf

    Java 面向对象三大特性之多态

    面向对象编程是Java的核心特性,其中封装、继承和多态是三大基石。在这个主题中,我们将专注于"多态"这一特性,它是Java编程灵活性和可扩展性的重要体现。 多态(Polymorphism)在希腊语中意为“多种形态”,在编程...

    C++面向对象之多态的实现和应用详解

    本文主要给大家介绍的是关于C++面向对象之多态的实现和应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 多态 大家应该都听过C++三大特性之一多态,那么什么多态呢?多态有什么用...

    PHP面向对象-接口、多态

    一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。 所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。 简单的说,一个类拥有其父类、和已实现接口的身份。

    新技术培训 培训讲义8_面向对象之多态.doc

    在面向对象编程中,多态指的是一个对象可以表现出多种形态,这意味着一个类的对象不仅可以表现为它本身,还可以表现为它的父类或者它实现的接口类型。通过这种方式,我们可以编写更加通用的代码,而不必关心具体对象...

    计算机后端-PHP视频教程. php之面向对象29 多态(选学).wmv

    计算机后端-PHP视频教程. php之面向对象29 多态(选学).wmv

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析

    2024面向对象高级多态接口HM

    ### 2024面向对象高级多态接口HM #### 一、多态 ##### 1.1 多态概述 多态是面向对象编程语言中的一个重要特性,它允许使用一个接口代表不同的类的行为。多态的核心在于继承与实现机制,并且依赖于方法的重写。在...

    动物练习.NET面向对象继承多态

    在.NET框架中,面向对象编程(Object-Oriented Programming,OOP)是一种强大的软件开发范式,它基于类和对象的概念,以及封装、继承、多态等核心特性。本实践项目名为“动物练习”,旨在通过模拟不同类型的动物来...

    JAVA面向对象-多态(完结)

    JAVA面向对象---多态(完结)

    面向对象——多态实验报告.doc

    面向对象编程是Java的核心特性之一,它通过封装、继承和多态等概念来构建复杂的软件系统。本实验报告主要探讨了多态性这一关键概念,通过设计一系列类及其子类来实现具体的功能。 首先,实验设计了一个名为`Person`...

    C语言实现对象编程之多态代码.rar

    C语言实现对象编程之多态代码.rar 在C语言中还可以实现更深入的面向对象编程多态特性。例如:使用接口(interface)包含多个指向函数的指针,这样就可以实现操作的"多态性"。 在面向对象语言C++的实现上,使用了虚...

    面向对象练习之三--多态 (抽象方法和虚方法)

    在面向对象编程中,抽象方法和虚方法常常一起出现,它们共同构成了多态的基础。抽象类通常包含抽象方法,定义了一个通用的接口,而虚方法则允许子类对这些接口进行具体实现。通过这样的设计,我们可以创建出强大的...

    Java 面向对象(继承、多态).ppt

    面向对象的概念 掌握类的继承、方法重写、super关键字的使用、final关键字 熟悉面向对象继承和多态的概念

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析

    Python面向对象之多态原理与用法案例分析

    本文实例讲述了Python面向对象之多态原理与用法。分享给大家供大家参考,具体如下: 目标 多态 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 实现代码的重用,相同...

    实验-面向对象编程多态( java).docx

    面向对象编程中的多态性是Java等面向对象语言的核心特性之一。通过本次实验,我们可以深入理解多态的概念以及它在实际编程中的应用。实验的主要目标是建立一个抽象类`Shape`,并创建两个子类`J_Circle`和`J_Square`...

Global site tag (gtag.js) - Google Analytics