- 浏览: 312413 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
opalescent_:
学习了。。
java笔试题的整理和解答扩展(String专题) -
yixiao258964:
谢谢,找了好久Reverse Enginee,都说在datab ...
PowerDesigner Reverse Engineer from database-mysql -
javaAlpha:
介绍的真全啊
Java编程那些事儿86——文件操作之File类使用
Java编程那些事儿63—多态性
郑州游戏学院 陈跃峰
出自:http://blog.csdn.net/mailbomb
8.5.3 多态性
多态性是面向对象技术中最灵活的特性,主要是增强项目的可扩展性,提高代码的可维护性。
多态性依赖继承特性,可以把多态理解为继承性的扩展或者深入。
在这里把多态性分为两方面来进行介绍,对象类型的多态和对象方法的多态。
为了方便后续的讲解,首先给出一个继承结构的示例。
//文件名:SuperClass.java
public class SuperClass{
public void test(){
System.out.println(“SuperClass”);
}
}
// 文件名:SubbClass1.java
public class SubbClass1 extends SuperClass{
public void test(){
System.out.println(“SubbClass1”);
}
}
// 文件名:SubbClass2.java
public class SubbClass2 extends SuperClass{
public void test(){
System.out.println(“SubbClass2”);
}
}
在该示例代码中,SubbClass1和SubbClass2是SuperClass的子类,并且在子类的内部都覆盖父类中的test方法。由于这三个类中都书写构造方法,则按照默认构造方法的约定,每个类中都会被自动添加一个默认的构造方法。
8.5.3.1 对象类型的多态
对象类型的多态是指声明对象的类型不是对象的真正类型,而对象的真正类型由创建对象时调用的构造方法进行决定。例外,按照继承性的说明,子类的对象也是父类类型的对象,可以进行直接赋值。
例如如下代码:
SuperClass sc = new SubbClass1();
这里声明了一个SuperClass类型的对象sc,然后使用SuperClass的子类SubbClass1的构造方法进行创建,因为子类类型的对象也是父类类型的对象,所以创建出来的对象可以直接赋值给父类类型的对象sc。除了对象的赋值以外,另外一个更重要的知识是sc对象虽然使用SuperClass声明的类型,但是内部存储的却是SubbClass1类型的对象。这个可以Java语言的中instanceof运算符进行判断。
instanceof是一个运算符,其作用是判断一个对象是否是某个类类型的对象,如果成立则表达式的值为true,否则为false。语法格式如下:
对象名 instanceof 类名
需要注意的是:这里的类名必须和声明对象时的类之间存储继承关系,否则将出现语法错误。
测试类型的代码如下:
/**<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
* 测试对象类型的多态
*/
public class TestObjectType {
public static void main(String[] args) {
SuperClass sc = new SubbClass1();
boolean b = sc instanceof SuperClass;
boolean b1 = sc instanceof SubbClass1;
System.out.println(b);
System.out.println(b1);
}
}
该测试程序的输出结果是:
true
true
由程序运行结果可以看出,sc既是SuperClass类型的对象,也是SubbClass1类型的对象,而SubbClass1的类型被隐藏起来了,这就是对象的多态。其实sc对象不仅仅在类型上是SubbClass1类型的,其存储的内容也是SubbClass1的内容,具体参看后面介绍的对象方法的多态。
对象类型的多态有很多的用途,极大的方便了对象的存储和传递,使代码很方便的进行扩展,对于已有代码不产生影响。下面介绍两个基本的使用。
1. 对象的存储
在存储一系列不同子类的对象时,可以使用父类的结构来进行声明,这样可以方便数据的存储,例如需要存储多个SubbClass1和SubbClass2的对象时,则可以声明一个SuperClass类型的数组进行存储,示例代码如下:
SuperClass sc[] = new SuperClass[3];
sc[0] = new SubbClass1();
sc[1] = new SubbClass2();
sc[2] = new SubbClass1();
则这里的数组sc,可以存储各个类型子类的对象,而数组中每个元素的值都是存储的对应子类的对象,而只是在名义上的类型(语法上的类型)是SuperClass类型的,这样将方便程序的控制,当增加新的子类类型时,已有的代码不需要进行改造就可以自动适应新的子类的结构。
例如新增了一个SuperClass的子类SubbClass3,则该数组的代码可以修改成如下:
SuperClass sc[] = new SuperClass[3];
sc[0] = new SubbClass1();
sc[1] = new SubbClass2();
sc[2] = new SubbClass3();
其它的代码都需要进行修改,就可以适应新的结构,这是多态性最主要的用途。
2. 对象的传递
在方法的传入参数传递,以及返回值处理方面都从对象类型的多态中受益。在向方法中传入参数时,如果该方法需要处理各个子类的对象,则只需要书写一个接受父类类型对象的方法即可。例如:
public void testObjectTypeMethod(SuperClass sc){}
则该在调用该方法时,可以传入SuperClass的对象,也可以传入其子类的对象,如果传入的是子类的对象,则子类对象中的内容不会丢失。例如调用的示例代码如下:
SuperClass sc = new SuperClass();
SubbClass1 sc1 = new SubbClass1();
SubbClass2 sc2 = new SubbClass2();
testObjectTypeMethod(sc);
testObjectTypeMethod(sc1);
testObjectTypeMethod(sc2);
这里说明的只是调用时的语法结构,这样的特性将使我们只需要书写一个方法,就可以处理所有子类的对象,简化代码的书写,降低代码的重复,从而降低维护的难度。
另外,方法的返回值也可以利用到该特性,例如如下方法:
public SuperClass testObjectTypeMethod2(){}
则在该方法的内部,既可以返回SuperClass类型的对象,也可以返回其子类的对象,也能简化代码的书写,便于代码的阅读和维护。
关于对象类型的多态,就简单的说明这么多,具体在项目中如何进行使用,还需要一定的技巧和方法。
8.5.3.2 对象方法的多态
对象方法的多态基于方法的覆盖,也就是该对象调用的方法具体是子类的方法还是父类的方法,由创建对象时使用的构造方法决定,而不是由声明对象时声明的类型决定。
示例代码如下:
/**
* 测试对象方法的多态
*/
public class TestObjectMethod {
public static void main(String[] args) {
SuperClass sc = new SuperClass();
SubbClass1 sc1 = new SubbClass1();
SubbClass2 sc2 = new SubbClass2();
SuperClass sc3 = new SubbClass1();
testObjectTypeMethod(sc);
testObjectTypeMethod(sc1);
testObjectTypeMethod(sc2);
testObjectTypeMethod(sc3);
}
public static void testObjectTypeMethod(SuperClass sc){
sc.test(); //调用被覆盖的方法
}
}
该代码的执行结果如下:
SuperClass
SubbClass1
SubbClass2
SubbClass1
则从代码的执行结果看,虽然testObjectTypeMethod方法接收的是SuperClass类型的对象,但是传入子类对象时,子类对象的内容没有丢失,所以在调用test方法时,还是调用的对应对象中对应的test方法。
这样就在功能上实现了对象的传递,从而保留了对象的内容,极大的方便了代码的扩展性。
但是,由于Java在执行程序时,在程序运行的过程中,需要判断对象调用的具体是父类的方法还是子类的方法,所以程序的执行速度会稍微有所降低。
发表评论
-
Java编程那些事儿37—for语句语法
2008-06-17 11:53 727Java编程那些事儿37—for语句语法 郑州游戏学院 陈跃 ... -
Java编程那些事儿38—break和continue语句
2008-06-18 15:01 779Java编程那些事儿38—break和continue语句 ... -
Java编程那些事儿39—流程控制综合示例1
2008-06-19 12:30 793Java编程那些事儿39—流程控制综合示例1 郑州游戏学院陈 ... -
Java编程那些事儿40—流程控制综合示例2
2008-06-19 20:23 887Java编程那些事儿40—流程控制综合示例2 郑州游戏学院陈 ... -
Java编程那些事儿41—流程控制综合示例3
2008-06-20 18:06 699<meta http-equiv="Conte ... -
Java编程那些事儿42—流程控制综合练习
2008-06-20 22:13 806Java编程那些事儿42—流程控制综合练习 郑州游戏学院 陈 ... -
Java编程那些事儿57—面向对象基础
2008-07-28 14:15 772Java编程那些事儿57—面向对象基础 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿58—类(一)
2008-07-29 11:05 709Java编程那些事儿58—类(一) 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿59——类(二)
2008-08-04 23:36 693Java编程那些事儿59——类(二) 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿60——对象
2008-08-18 23:49 628Java编程那些事儿60—— ... -
Java编程那些事儿61—面向对象设计方法和面向对象特性(一)
2008-08-29 21:42 753Java编程那些事儿61—面向对象设计方法 郑州游戏学院 陈 ... -
Java编程那些事儿62——继承(二)
2008-09-08 12:11 815Java编程那些事儿62——继承(二) 郑州游戏学院 ... -
Java编程那些事儿64——访问控制符、修饰符和其它关键字
2008-10-14 14:12 795<meta http-equiv="Conte ... -
Java编程那些事儿65——static修饰符
2008-10-23 15:46 821Java编程那些事儿65——static修饰符 郑州游戏学院 ... -
Java编程那些事儿66——final修饰符
2008-11-11 17:19 727Java编程那些事儿66——f ... -
Java编程那些事儿67——this和super
2008-11-12 12:25 965Java编程那些事儿67——this和super 陈跃峰 ... -
Java编程那些事儿68——抽象类和接口(一)
2008-12-22 11:31 751Java编程那些事儿68—— ... -
Java编程那些事儿69——抽象类和接口(二)
2008-12-27 16:25 978Java编程那些事儿69——抽象类和接口(二) 陈跃峰 ... -
Java编程那些事儿70——抽象类和接口(三)
2009-01-05 14:20 1189Java编程那些事儿70—— ... -
Java编程那些事儿71——内部类简介
2009-01-06 09:32 771Java编程那些事儿71—— ...
相关推荐
java类和对象继承多态性 java类和对象继承多态性是java语言中的一种基本机制,它允许开发者创建一个新的类,并继承已有的类的属性和行为。这种机制可以提高代码的复用性和维护性。 继承是java语言中的一种机制,...
《Java编程那些事儿》是陈跃峰先生的一本关于Java编程技术的著作,虽然在网络上可能难以找到完整的电子版,但通过你提供的文件名列表,我们可以梳理出一系列关键知识点,这些都是学习Java编程过程中不可或缺的部分。...
【Java编程教程】详解Java 多态性 Java 作为一门面向对象的编程语言,其核心特性之一就是多态性。多态性使得程序在设计上具有更高的灵活性和可扩展性,允许我们以多种方式执行相同的操作。多态性这个概念来源于希腊...
Java多态性是面向对象编程中的一个重要特性,它允许我们使用父类引用指向子类对象,从而实现一种灵活的代码设计。在这个“java多态性练习”中,我们将深入探讨多态性的概念、抽象类(abstract class)以及它们在实际...
Java多态性是面向对象编程的基本特征之一,它允许子类继承父类,并对父类的方法进行重写或重载,以实现更多的灵活性和可扩展性。在Java中,多态性的体现主要有两种形式:方法的重载和方法的重写。 方法的重载是指在...
JAVA面向对象编程第四章继承性和多态性课件 本节课程主要讲解Java面向对象编程的第四章内容,即继承性和多态性。继承性是面向对象编程的基本特性之一,指的是子类可以继承父类的成员变量和成员方法,实现代码的重用...
Java是一种广泛使用的面向对象编程语言,其面向对象的特性之一就是多态性。多态性是面向对象编程的重要概念,它允许我们使用一个接口来表示多种类型的数据,从而增加了代码的灵活性和可重用性。在Java中,多态性的...
多态性是 Java 面向对象编程的重要特性,通过继承和接口可以实现多态性。通过多态性,我们可以以统一的方式处理不同类型的对象,提高代码的灵活性和可扩展性。在本文中,我们详细介绍了多态性的概念、继承和接口实现...
Java通过重写(Override)和重载(Overload)实现多态性。 6. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块捕获和处理运行时错误,保证程序的健壮性。 7. **集合框架**:Java集合框架包括...
Java 面向对象程序设计多态性 Java 面向对象程序设计中,多态性是指同一种方法可以有多种不同的实现方式,且这些实现方式可以在运行时动态地确定。这种特性使得 Java 语言具有更好的灵活性和可扩展性。 多态性的...
多态性是面向对象编程中的一个核心概念,它允许我们使用父类类型的引用指向子类的对象,然后调用在父类和子类中同名的方法时,实际调用的是子类的方法。在Java中,多态性主要通过继承和接口实现。 1. 继承(IS-A...
Java多态性是面向对象编程中的一个重要概念,它在Java中起到了关键的作用,使得程序更加灵活,可扩展性更强。本实验将深入探讨Java多态性的核心原理与应用。 首先,我们要理解多态性的基本含义。多态性...
在Python编程中,继承和多态性是面向对象编程(OOP)的两个核心概念。继承允许我们基于现有的类创建新的类,而多态性则允许不同的对象对同一消息做出响应。本文将详细介绍如何在Python中实现继承和多态性,并通过...
多态性是面向对象编程中的一个重要特性,它使得一个接口或方法能够适用于多种类型的数据。在Java中,多态性主要通过方法重载(overloading)、方法重写(overriding)以及动态绑定来实现。 #### 二、面向对象编程三...
4. **类与对象**:理解面向对象编程的基本概念,如类的定义、对象的创建、封装、继承和多态性。学习如何编写和使用构造函数,以及访问修饰符(public, private, protected)。 5. **数组**:了解一维和多维数组的...
这些章节可能会讲述类、对象、封装、继承和多态性。理解这些概念对于创建可维护和可扩展的代码至关重要。 `Chapter09.pdf`和`Chapter10.pdf`可能会深入到更复杂的主题,如异常处理(Exception Handling),这是处理...
你可以从中学习如何设计和实现类,理解对象间的关系,以及如何利用接口实现多态性。 3. **异常处理**:Java的异常处理机制在源码中也会有所体现,例如try-catch-finally结构,以及自定义异常的创建和抛出。 4. **...
Java的多态性是面向对象编程的一个核心特性,它允许程序在不关心具体类型的情况下处理对象。在Java中,多态性主要体现在两个方面:方法的重写(Overriding)和方法的重载(Overloading)。本文将深入探讨Java多态性...