转载于 http://blog.csdn.net/hwalan/archive/2006/05/25/755251.aspx
众所周知,面向对象的三个基本特征是封装、继承和多态。
笔者所理解的封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。
在java中能使用private、protected、public三种修饰符或不用(即默认defalut)对外部对象访问该对象的属性和行为进行限
制。
笔者认为继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。这非常类似大自然中的物种遗传。
封装和继承一般比较容易理解,而多态则不容理解,很容易理解错或者混淆概念。下面主要谈一谈笔者对多态的理解。
谈到多态,就需要先提到一些词汇,诸如重载、过载、覆盖、重写等等。笔者不对这些词汇的含义进行分析,而且对多态中的内容,每个人都会有自己的理
解,而且也都有各自的习惯叫法,正所谓仁者见仁,智者见智。因为笔者在工作和学习中主要是使用java,因此笔者更倾向于使用java中的固定用法,即
overriding(覆盖)和overload(过载)。多态则是体现在overriding(覆盖)上,而overload(过载)则不属于面向对象
中多态的范畴,因为overload(过载)概念在非面向对象中也存在。
overload(过载)是指可以编写相同名称但不同形式的函数,C语言中也有这种特性,而C语言是面向过程不是面向对象的。overload(过
载)要求不同形式的同名函数必须有不相同的参数列表,不同的参数列表包括参数的类型不一致、参数个数不一致、不同类型的参数的顺序不一致。而如果参数列表
相同仅仅是函数返回值类型不一致则是非法的,因为编译器可能无法判断应该使用哪个返回类型的函数。请看以下示例:
有以下两个函数原型:
int count();
double count();
程序中可以有以下几种方式调用:
1. int iCount = count();
2. double dCount = count();
3. count();
在上面的1和2的调用示例中,编译器似乎能够判断出应该调用的函数从而做出正确的选择,然而很显然,对于3的调用编译器就无能为力了,而3的写法是完全合法并且实际上也会经常用到。
overriding(覆盖)是笔者所认为的面向对象中的多态,因为overriding(覆盖)是与继承紧密联系,是面向对象所特有的。多态是指
父对象中的同一个行为能在其多个子对象中有不同的表现。也就是说子对象可以使用重写父对象中的行为,使其拥有不同于父对象和其它子对象的表现,这就是
overriding(覆盖)。这种特性非常类似大自然遗传中的变异,变异使得大自然变得丰富多彩,而多态使面向对象富有魔力。下面通过一个具体示例来体
会一下多态的魔力。
有一个父类A:
public class A {
public void methodA() {
System.out.println("This is Parent of A.");
}
}
父类A有以下三个子类:
public class B1 {
public void methodA() {
System.out.println("This is Children of B1.");
}
}
public class B2 {
public void methodA() {
System.out.println("This is Children of B2.");
}
}
public class B3 {
}
上面的子类B!和B2都重写了父类A的方法methodA,而B3则没有。下面我们用实际的调用语句看一看。
1. A a1 = new A();
2. A a2 = new B1();
3. A a3 = new B2();
4. A a4 = new B3();
5. a1.methodA();
6. a2.methodA();
7. a3.methodA();
8. a4.methodA();
以上语句的运行结果会如下:
This is Parent of A.
This is Children of B1.
This is Children of B2.
This is Parent of A.
从上面的运行结果可以看到,第五行是指向父类对象实例的引用调用方法methodA,执行也是父类的方法;第六、七行虽然是用类A的对象引用调用方法
methodA,但是由于对象引用是指向相应的子类对象的实例,程序正确执行了子类的方法,并没有产生歧义;第八行是指向子类对象B3的实例的引用调用方
法methodA,而由于子类B3没有对方法methodA进行overriding(覆盖),也就是直接继承了父类的行为,所以执行结果与第五行一样。
从这里我们能够轻易体会到多态的魔力。
这一次先写到这里,暂且作为抛砖引玉,不妥之处还望大家指正。
分享到:
相关推荐
### 浅析Java设计模式【1】——观察者 #### 概念与基本原理 观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象之间的依赖关系,其中一个对象(称为被观察者或主题)的状态发生变化时,所有依赖于它...
### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...
### 浅谈Java面向对象与引用 在Java学习过程中,对于面向对象的理解和引用机制的掌握是至关重要的。本文将围绕这两个概念进行深入探讨,并针对初学者常见的疑惑点进行解答。 #### Java面向对象基础 Java是一种...
C语言是一种典型的面向过程编程语言,它以函数作为程序的基本构成单位,程序的执行是从头到尾顺序执行的,一个函数接着另一个函数,除非遇到跳转语句。C语言强调的是算法和数据结构的分离。在C语言中,开发者需要...
### 浅析Java设计模式【2】——适配器 #### 概念解析 适配器模式是一种常用的设计模式,其核心在于“适配”二字,即如何将一个类的接口转换成客户希望的另一个接口。该模式使得原本由于接口不兼容而不能一起工作的...
浅析新业态——社交电商(微商)行业.pdf
1. 对象Object:Object对象是JavaScript的基本对象,在任何其它JavaScript对象中都包含有Object对象,在所有其它对象中它的方法和属性都是可用的。Object对象的一个重要属性是prototype,prototype属性是用来返回...
1. **数据类型的不同**:Java中,变量要么是基本数据类型,要么是对象的引用;C++除了基本数据类型,还支持自定义类型如结构体、枚举和联合体,以及C语言中的指针操作。 2. **方法定义方式**:Java中的方法都嵌入在...
66174(修改) 浅析网络炒作——以郭美美的网络“炫富”为例.zip
66174(修改) 浅析网络炒作——以郭美美的网络“炫富”为例.doc
策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法独立于使用它的客户而变化。 #### 1.2 使用场景 策略模式适用于以下几种情况: - 多个类只有在...
传统方式对JavaScript的应用基本上是基于过程模型的,若在JavaScript中利用面向对象的思想进行代码编写,将会使得代码具有良好的结构和逻辑性,更便于管理和维护。本文让读者看到JavaScript如何实现面向对象编程并...
《Linux强弱符号的定义与区别》—— 程序的基本编译流程
Java声音技术浅析 在Java世界里,多媒体技术的集成一直是开发者关注的焦点,其中声音技术尤为关键。本文将深入探讨Java对声音处理的支持,包括Applet中的声音播放、Java应用程序中的声音处理以及JavaX中Sound包的...
《浅析网络炒作——以郭美美的网络“炫富”为例》 网络炒作,作为互联网时代的一种新型传播现象,已经成为社会舆论关注的焦点。本文主要针对网络炒作这一话题进行深入探讨,以郭美美的网络“炫富”事件为例,解析其...
Java程序在JVM(Java Virtual Machine,Java虚拟机)上运行,JVM作为一个平台无关的执行环境,负责Java程序的内存管理和执行。理解Java内存分配原理有助于优化程序性能,避免内存泄露等问题。 在JVM中,内存主要...
GCC编译流程:从源代码到可执行程序——浅析编译原理 GCC编译流程是从源代码到可执行程序的整个过程,可以分为四个阶段:预处理、编译、汇编和链接。下面将对这些阶段进行详细介绍: 1. 预处理阶段: 在预处理...
例如,如果定义一个CHAR(10)的列,即使只插入了三个字符'abc',数据库仍会将其扩展到10个字符,并在后面填充七个空格。这在DUMP函数的输出中可以清晰看到,DUMP(CHAR_COL, 16)返回的Len字段为10,表示总长度,其中...
这篇名为“66174(修改)浅析网络炒作——以郭美美的网络‘炫富’为例”的论文,深入探讨了互联网上的舆论制造和炒作现象,以郭美美事件作为具体的案例。郭美美事件是中国网络历史上一个极具争议性的事件,引发了...
而人力资源管理则涵盖了招聘、培训、绩效评估、薪酬福利、激励制度等多个方面,旨在吸引、发展和保留优秀的员工,以实现企业的战略目标。人力资源管理的职能包括规划、获取、开发、维护和利用,目标则是提高员工的...