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

那些年一起学过的面向对象之:4 面向对象的三大特征:封装、继承、多态

 
阅读更多

面向对象的三大特征

  • 封装(Encapsulation)

封装,可以望文生义,即将东西封装起来,不让别人知道,当然,自己可以知道,指定信得过的人也可以知道。

封装将数据和行为封装起来,并对对象的使用者隐藏了数据的实现方式。

其实,一个对象就是封装了数据和操作这些数据的代码的逻辑实体。

在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。这就为对象内部数据提供了保护的作用,防止被意外修改。

好处:

1提高重用性(封装)

2提高可靠性(隐藏)

3方便对象的使用者使用(隐藏了复杂性)

  • 继承

现实世界中,很多东西都不是相互孤立的,它们往往具有相同的特征,也存在差异。

上图反应了人类的派生关系。最高层往往具有最普遍的特征,越往下层越具体,并且下层包含上层的特征。

在程序设计中,这种关系叫做继承。一个类从另外一个类派生出来,派生类继承了父类的所有特性,并且可以添加自己的特性。通过继承所创建的新类叫做子类(或派生类),被继承的类叫做父类(或基类、超类),继承的过程是从一般到具体的过程。

继承是is-a的关系,是一种用于表示特殊与一般的关系。

在考虑使用继承时,如果两个类的关系是“is-a”的关系,即说“XXX是XXX”成立的话,继承关系就成立了。如:说“男人是人”,说得通吧;要是说“王八是人”,看人家不!@&#%#¥。

在面向对象中,继承是非常优秀的语言机制,有如下优点:

1提高代码的重用性;

2代码共享,减少创建类的工作量,因为,每个子类都拥有父类的属性和方法;

3提高代码的可扩展性;

4子类可以形似父类,又可以异于父类。

当然,也有缺点:

1继承是入侵的。只要继承,就必须拥有父类的所有属性和方法;

2降低了代码的灵活性。子类必须拥有父类的所有属性和方法,让子类的自由世界多了约束。试想,要是“老爹”是个品行不正,是个酒鬼,“儿子”被坑大了。

3增强了耦合性。当父类被修改时,必须考虑子类的修改,可能导致大片的代码需要重构。

  • 多态(polymorphisn)

所谓多态,就是父类型的引用可以指向子类型的对象(或接口类型的引用可以指向实现该接口的类的实例)

如:

//动物
public class Animal {
//动物都会
public void cry() {
System.out.println("(动物叫)");
}
}
//狗,继承于动物
public class Dog extends Animal {
//狗有它自己的叫法
@Override
public void cry() {
System.out.println("汪汪");
}
}
public class Test {
public static void main(String[] args) {
//Dog dog = new Dog();
//dog.cry();
Animal animal = new Dog();//父类型的引用可以指向子类型的对象
animal.cry();//输出:汪汪
}
}

  

实现多态,有二种方式:覆盖、重载。

覆盖:是指子类重新定义父类的方法。

重载:是指方法名相同,参数列表不同。

可以这么理解:

覆盖,不但不用祖宗那套功夫,而且还自己创一套新的代替祖宗那套;

重载,你是你,我还是我。

覆盖,为纵向关系;重载,为横向关系。

接下来应该注意了。

1其实,重载的概念并不属于“面向对象编程”,重载的实现是编译器根据函数不同的参数列表,对同名函数的名称进行修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如有2个同名函数function func(p:integer):integer和function func(p:string):integer,那么编译器做过修饰后的函数名称可能是int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住是静态)。也就是说,它们的地址在编译期就绑定了(早绑定)。因此,重载和多态无关!

2真正和多态相关的是“覆盖”。当子类重新定义了父类的函数后,父类指针根据赋给它的不同的子类指针,动态(记住是动态)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。

3结论:

a重载只是一种语言特性,与多态无关,与面向对象也无关。引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”

b多态是晚绑定;

c多态是一种运行期行为,不是编译器的行为;

d不要把重载理解为多态,重载是编译时就确定的;

e构成多态的条件:继承、重写、父类引用子类的对象。

4那么,多态的作用是什么呢?

我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用。多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

分享到:
评论

相关推荐

    Java技术及其应用 02 面向对象结构(共106页).ppt

    Java是真正面向对象的编程语言 面向对象编程主要体现下列三个特性: ◇封装性 (Encapsulation) ... 学习面向对象编程首先就要学习怎样通过抽象得到类,即怎样将某些数据以及和数据有关的操作封装在一起。

    PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)

    面象对向的三大特点:封装性、继承性、多态性 首先简单理解一下抽象:我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象一、封装...

    JAVA面向对象详细资料

    17 面向对象语言的三大特性:封装,继承,多态 20 18 什么是封装?封装在哪? 20 18.1 封装的好处? 20 19 访问修饰符 20 20 面向对象的特性-继承 21 20.1 继承的关键字:extends 21 20.2 继承的语法格式: 21 20.3 ...

    面向对象编程(封装、多态)Python版(Demo详解)

    面向对象三大特性:封装、继承、多态 封装的意义: ①将属性和方法放到一起做为一个整体,然后通过实例化对象来处理; ②隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了; ③对类的属性和方法增加 访问...

    java面向对象核心知识点,独门大法

    里面包含了java面向对象的核心知识点(封装+继承+多态+反射+jdbc..)还有一些其它的内容,都是很清晰的写出,对于新手小白的学习,是非常友好的,内容很丰富。每一个知识点的讲解,都会包含语法,语法个数如何定义,...

    软件工程-理论与实践(许家珆)习题答案

    面向对象的开发方法包括面向对象的分析、面向对象的设计和面向对象的程序设计。( √) 7. 软件危机的主要表现是软件的需求量迅速增加,软件价格上升。(×) 8. 软件工具的作用是为了延长软件产品的寿命。(×) 9. ...

    【绝密教程】动力节点2018最新Java夜校视频教程

    2. 课程包含: JDK安装、开发环境搭建,java编程基础知识,分支语句、循环语句、封装、继承、多态等并配备相应练习题,希望对大家有所帮助。7 f" T9 c- j9 S7 K 动力节点针对java夜校班视频服务特色:" p* ^$ y+ m+ ...

    疯狂JAVA讲义

    2.1.4 面向对象的基本特征 28 2.2 UML(统一建模语言)介绍 29 2.2.1 用例图 30 2.2.2 类图 31 2.2.3 组件图 33 2.2.4 部署图 33 2.2.5 顺序图 34 2.2.6 活动图 34 2.2.7 状态机图 36 2.3 Java的面向对象...

    毕业设计订餐系统源码-columbus-2018-summer:哥伦布-2018-夏季

    面向对象的介绍 构建类 - 方法和属性 单元测试/TDD (Junit)* 就业服务: 集合概述 (*Iterables/Iterators) 列表 地图 就业服务: 在班上: 作业:复习 依赖注入/Spring 测试双打 (Mockito)* 继承与多态 封装 使用 ...

    js 学习笔记(三)

    一种面向对象语言需要向开发者提供四种基本能力: (1) 封装——把相关的信息(无论数据或方法)存储在对象中的能力。 (2) 聚集——把一个对象存储在另一个对象内的能力。 (3) 继承——由另一个类(或多个类)得来类...

    asp.net知识库

    与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库...

    C#微软培训资料

    第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 ...

    传智播客扫地僧视频讲义源码

    20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_...

    PHP3程序设计

    第10章 面向对象 154 10.1 了解类的知识 154 10.1.1 继承 155 10.1.2 抽象 155 10.1.3 多态 156 10.1.4 封装 157 10.2 对象和PHP 157 10.2.1 使用命名参数 158 10.2.2 使用继承 160 10.2.3 存取类属性 160 10.2.4 多...

Global site tag (gtag.js) - Google Analytics