Java面向对象三大特征:封装、继承、多态
一、封装
封装这个词听起来好象是将什么东西包裹起来不要别人看见一样,就好象是把东西装进箱子里面,这样别人就不知道箱子里面装的是什么东西了。其实 JAVA 中的封装这个概念也就和这个是差不多的意思。封装是 JAVA 面向对象特点的表现,封装是一种信息隐蔽技术。它有两个含义:
- 即把对象的全部属性和全部服务结合在一起, 形成一个不可分割的独立单位;
- 尽可能隐藏对象的内部结构。
也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了。
1.1、封装的功能
- 隐藏对象的实现细节
- 迫使用户去使用一个界面访问数据
- 使代码更好维护
封装迫使用户通过方法访问数据,从而能保护对象的数据不被误修改, 还能使对象的重用变得更简单。 数据隐藏通常指的就是封装。 它将对象的外部界面与对象的实现区分开来, 隐藏实现细节。 迫使用户去使用外部界面, 即使实现细节改变, 还可通过界面承担其功能而保留原样,确保调用它的代码还继续工作。封装使代码维护更简单。
可以举个非常形象的例子:比如一台电冰箱,你知道上面按钮的作用,会操作按钮达到自己的目标就行,你不用去管它到底是怎么实现的。可能你按一下电源开头,电冰箱就开始工作了,在你看来这是一个很简单的动作,但对于内部细节来说,可能要先检测是否漏电、电压是否正常、雪种是否充足,然后才开始打开各个开头。当然实际的细节可能会更复杂。这也就是为什么用户不需要知道内部细节,而只需掌握一个开头的开启就够了。回想一下,咱们上面说的封装不就是这个意思吗?
二、继承
2.1、is a 关系——子对象
在面向对象世界里面,常常要创建某对象(如:一个职员对象) ,然后需要一个该基本对象的更专业化的版本, 比如, 可能需要一个经理的对象。显然经理实际上是一个职员, 经理和职员具有 is a 的关系,经理只是一个带有附加特征的职员(经理也是一个职员)。因此,需要有一种办法从现有对象来创建一个新对象。这个方式就是继承。
“继承”是面向对象软件技术当中的一个概念。如果一个对象 A 继承自另一个对象 B,就把这个 A 称为"B 的子对象",而把 B 称为"A 的父对象"。继承可以使得子对象具有父对象的各种属性和方法,而不需要再次编写相同的代码(这样可以达到代码重复利用的目的)。子对象继承父对象的同时,可以重新定义某些属性,并重写某些方法,即覆盖父对象的原有属性和方法,使其获得与父对象不同的功能。直白点说就是子类可以复用父类的方法和属性,也可以自己再定义,这是非常灵活的。
- 继承后的基本运行顺序:初始化子类必须要先初始化它的父类(虚拟机自动完成,不需要人工干预),因为在子类的构造方法中会隐含的调用父类的构造方法;(当然你也可以手动地调用super();)
- 单继承性:一个类只能继承一个父类,它不能同时继承两个父类。
- 构造方法不能被继承
- 关键字super:可以被子类用来引用自己的父类,比如父类的方法或属性都是可以访问的。子类通过super访问的方法或属性不一定非得在它的父类中定义,也可以是它父类的父类,它是具有追溯性的,一直向上查询直到找到为止。
2.2、方法的覆盖
在父子类中如果子类的某个方法和父类一样,这里的一样指的是方法名称、参数列表、返回类型和父类中一样,那这个子类中的方法就是覆盖方法。
到底运行哪一个方法?
<span style="font-size: 16px;">父类 b = new 子类(); b.getT1();</span>
在上面的代码中,你觉得b调用的是父类的getT1()方法还是子类中的getT1()方法,是不是很难想明白呢?
事实上你得到的是与变量运行时相关的行为,而不是与变量编译时类型相关的行为。这是面向对象一个很重要的特征,它也是多态性的一个特征,并通常被称作虚拟方法调用或者动态绑定或者后期绑定。你只要记住编译时看数据类型,运行时就看实际的对象类型,一句话,new谁就调用谁的方法。
方法覆盖的原则
- 返回类型、方法名称、参数列表必须与它所覆盖的方法相同;
- 覆盖方法不能比它覆盖的方法的访问性差(访问权限不允许缩小);
- 覆盖方法不能比它覆盖的方法抛出更多的异常。
2.3、方法的重载
在同一个方法中(包含父类),如果出现了方法名称相同,而参数列表不同的情况就叫做重载。其中参数列表的类型、顺序、个数必须不同,方法的返回类型可以相同也可以不相同,方法名称必须相同。
和类的成员方法一样,构造方法可以被重载。例如
- <span style="font-size: 16px;">public class A
- {
- public A()
- {
- //无参的构造方法
- }
- public A(int i)
- {
- //有参的构造方法
- }
- }</span>
三、多态
同一行为的多种不同表达,或者同一行为的多种不同实现就叫做多态。还是用刚才经理和职员这个例子来举例:人事部门需要对公司所有职员统一制作胸卡(一般也就是门禁卡,进出公司证明身份使用) ,制作的师傅说,只要告诉我一个人员的信息,就可以制作出一份胸卡,简化一下就是:一位职员的信息对应一份胸卡。这个时候,对胸卡制作的师傅而言,所有的人都是职员,无谓是经理还是普通职员。也就是说,对于传递职员信息这样一个行为, 存在多种不同的实现, 既可以传递经理的信息,也可以传递普通职员的信息。这就是多态的表现。
再举一个例子:比如我们说“笔”这个对象,它就有很多不同的表达或实现,比如有钢笔、铅笔、圆珠笔等等。那么我说“请给我一支笔” ,你给我钢笔、铅笔或者圆珠笔都可以,这里的“笔”这个对象就具备多态。
注意:方法是没有多态一说的,严格的说多态是类的特性。但是也有对方法说多态的,比如上面讲到的方法的覆盖称为动态多态,方法的重载称为静态多态。
3.1、多态与类型
一个对象只有一个格式,是在构造它的时候指定的。但既然变量能够指向不同格式的对象,那么变量就是多态性的。也就是说一个对象只有一种形式,但一个变量却有多种不同的形式。Java实际上允许父类类型的引用变量指向一个子类的对象。例如:
- <span style="font-size: 16px;">Employee e = new Manager();</span>
编译器会认为e变量是一个Employee,而不是一个Manager,所以用e.department = "tool";(非法的编译时会报错),为什么呢?因为在编译的时候,变量e是一个Employee类型,编译器并不会去管运行时e所指向的具体对象是一个Manager还是Employee类型。那如果就是想访问怎么办呢?简单,强制类型转换即可:
- <span style="font-size: 16px;">Employee e = new Manager();
- Manager m = (Manager)e;
- m.department = "开发部"; //这就合法了,编译器也不会报错了。</span>
3.2、instanceOf运算符
用来判断某个实例变量是否属性某个类的类型
- <span style="font-size: 16px;">if (a instanceOf b)
- {
- System.out.println("true");
- }
- else
- {
- System.out.println("false");
- }</span>
3.3、多态对象类型转换
向上自动造型:子类转换成父类类型可以直接赋值完成,向下强制造型:父类转换成子类类型需要强制转换,如上面提到的Manager m = (Manager)e;。
3.4、动态绑定
方法调用和方法体在运行时刻的连接就称之为动态绑定(也叫后期绑定或运行期绑定)。因为在编译的时候并不知道对象的类型,但方法调用有自己的机制,通过在对象中安插某些特殊类型的信息,就能够正确的找到方法主体。
Java中绑定的所有方法都采用后期绑定技术,除非一个方法已经被声明成final。我们并不去决定是否进行后期绑定的动作,因为这些是它自动完成的。
Java面向对象三大特征:封装、继承、多态相关推荐
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java面向对象三大特性(封装继承多态)解释及案例
文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...
- python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]
✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...
- OC面向对象的三大特征(封装 继承 多态)习题2 复合
复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...
- 三大特征 封装 继承 多态
''' 1.面向对象与面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点:扩展性 ...
- Java面向对象三大特性之继承多态的预习笔记,are you ready? 面对疾风吧!
文章目录 继承(extends) super关键字 方法重写 instanceof关键字 abstract关键字 接口(interface) 多态 继承(extends) AextendsB A继承了 ...
- c++局部对象是什么_面向对象三大特征: 封装
今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...
- Java面向对象三大特征---继承
系列文章目录 Java面向对象三大特征-多态 Java面向对象三大特征-封装 文章目录 系列文章目录 前言 一.概念 二.举例说明 三.语句格式 三.为何要使用继承 四.super与this关键字 五 ...
最新文章
- 瑞数动态安全:做一个牵着黑客鼻子走的移动靶心
- android studio gradle 自动更新,android studio gradle 两种更新方法更新
- SpringBoot使用Websocket
- CentOS 6 5安装Erlang/OTP 17 0
- 大数据学习笔记31:Java程序访问高可用Hadoop集群
- nginx rtmp HLS直播
- php定义一个学生类_3分钟短文 | PHP获取函数参数名,和类定义的常量,都要反射...
- 专访企业QQ SaaS团队,谈企业级LNMP架构设计
- jsp java ldquo_添加jsp · yayaangel/java201521123103 - Gitee.com
- Mysql事务,并发问题,锁机制
- 光谱共焦的干涉测量原理及厚度测量模式
- 城镇化进程中的粮食生产问题
- 关于IDEA的一些常用的快捷键整合,赶紧进来KK......
- Rockchip RK3588 kernel dts解析之显示模块
- tp6分页显示首页和尾页
- 怎样配置炒股用的计算机,炒股专用电脑配置
- 北邮计算机学院复试分数线,2018年北京邮电大学复试分数线
- ubuntu18.04自带的输入法数字键选择出现数字而不是中文
- Windows API 关于控件的自绘——文本颜色、背景颜色、字体
- python3 学习之路1
热门文章
- koa-multer报错Unexpected field
- java gb2312 utf-8_java utf-8 gb2312
- 用devc++表白_【交大表白墙】表白ZRC,若臣小哥哥要开心啊,不开心的时候想一想你还有这么一个匿名小迷妹,心情会不会好一点呢...
- C# xlsx转csv
- 全国计算机高新技术考试证书有什么作用?
- 一、软件工程概述(1.1计算机软件1.2软件工程)
- 计算机软件工程专业的需要考什么证书?
- ARCGIS之征地坐标xls和报备坐标txt格式批量导出工具(定制开发版)
- JS中数组与对象的互相转换
- HTAP系统架构实践总结