当前课程知识点:“做中学”Java程序设计 > 第4章使用面向对象高级语法 > 4.1使用继承语法 > Video
在前面的时钟应用程序当中我们学会了如何在一个类当中添加属性和方法
为了保证这些数据的安全
通常需要通过访问权限控制符来限定外接对数据成员的直接访问
取而代之的呢由相应的方法进行数据的访问操作
从而实现了面向对象的的第一大特性-封装性
事实上我们的一个应用程序呢 需要由无数个不同职责的类来构成
他们协同工作才能完成某个具体业务的实现
今天的我们就来聊聊面向对象的第2大特性
继承性
这种关系那可以理解为一种is-a的关系
它体现的是一种特殊的类和类之间的关系
当两个类满足继承关系的时候
我们可以看看他是否符合这种is-a的表达
例如圆是一个图形
我们就可以表达成circle is a shape
所以圆这个类和shape这个类
他是符合继承关系的
这里的Circle是一个子类
或者也称之为派生类
相应的shape就是他的父类
有些时候也称之为超类
或者是基类
在工程当中
我们习惯使用uml工具对类的关系的进行节目下面的这张图就是circle继承
shape类图
这里的矩形代表定好的类
每个矩形通常分成三部分
第1个部分显示的是类名
第2部分的显示是类的属性
第3部分的显示类的方法
继承关系让我们用一根直线加空心箭头的线条来表达这里的箭头呢
从子类出发指向我们的父类
需要注意的是Java当中继承是单一继承
也就说每个子类
有且只能有一个父类继承有一个非常有这种功能就是让子类可以轻松的获得
父类所有的属性和方法
也就说如果你的父类当中实现了某个功能只为那可以通过继承来复用这些代码
与继承有关的一个
重要的访问权限控制服务是protected
当它作用于属性和方法的前面的时候
表明这个属性或者这个方法呢
他是可以被继承的
能够在子类当中直接访问和使用的
要将uml类图当中的系数关系用代码来实现的话
需要使用继承的语法规则
非常简单
只需要在子类的类声明部分使用extends
关键字
随后紧跟一个父类的名字
这样就可以表达
继承了关系
通常我们也将这种写法称之为显示的继承写法
那么这里就需要特别注意的是
当我们定一个类
如果你不显示的声明一个继承关系的时候
其实那他会隐含的存在一个默认的继承关系
那就是继承Object
是Java当中所有类的父类
任何那那都是直接或者间接的继承与他的
自然的
Object中定义的所有的方法
对于所有子类来讲他们都隐式的继承
这里等我没有必要介绍一下不正当中的常用方法
第1个是toString方法
这个方法的定义在object当中他的默认实现就是返回对象的hashcode
内存地址
比如你可以在Java程序当中打印出任何对行的信息
这里那我们可以学生对象为例
当我们使用system.out.println输出学生对象信息的时候其实调用的就是
对象天生自带的toString方法
这个方法那就是默认的继承于Object
他的默认实现就是打印出对象的内存当中的hash地址
hash地址是通过哈希算法生成的一个标识
就像每个对象的身份证号一样
你可以通过比较两个对象的hash地址
来判断这两个对象是否来自于内存当中的同一个对象
继承除了简单的复用父类的现有的代码功能之外
你还可以对继承方法的进行覆盖
我们称之为为override
需要注意的是只有那些非private方法
才能实现覆盖
比如使用toString输出学生的
hashCode内存地址不是我们学生信息管理系统的现实需求
我可以将其覆盖成打印学生对象的基本信息
那么我们来看下具体的操作
单击source菜单下
下面有一个override/Implement methods选项
单击该选项
在弹出的覆盖的方法当中我们看到现有的方法当中 有一个toString选项打勾选起来
我们要对他进行覆盖
单击OK
这时候就会生成一个覆盖的框架
这里来我们将它返回一个由student基本信息构成的字符串
再次运行我们的程序我们看到这时候我们的程序打印出来的就是对象的基本性
第2个重要的方法能就是equals方法从名字上你可以判断
这个方法的作用了就是判断自身的对象
和传入的参数对象
他们是否相等的一个重要方法
但是很多时候
我们需要自己去定义相等性的依据
例如
在我们学生信息管理系统当中
用户当前操作的这个学生对象
和通过数据库返回的学生对象
他们可能是内存当中的两个不同的对象
但是他们具有相同的学号
从概念上来讲
那么具有相同学号的对象应该是属于同一个对象
这里呢就需要在学生信息管理系统网中将统一学号
作为判断学生对象是否相等的一个重要依据
因此
如果要实现根据学号判的两个对象是否是同一对象不就需要覆盖
这里的equals方法
我们同样单击source菜单
选择这里的override/ implement methods方法
勾选这里的equals方法
单击OK
这样的话我们就会生成一个覆盖方法的框架
将它的内容修改成如下的内容 这里我们解释一下这些代码
首先我们先来判断
如果传入的要比较的对象和当前的对象this
是同一个对象的话
那么直接返回去true
如果要比较的对象是一个空对象没有
那么无需比较他一定是false
除了这两种情况之外也就是当前对象和要比较对象他们都存在
而且
不是同一个对象
那么这就需要进一步判断
这两个对象是不是同一个类型
这里的getClass方法它是继承自object的一个方法
这个方法的是返回类的元数据信息
也就是这个类有哪些属性有哪些方法
使用这个方法让我们可以判断这两对象的是不是属于同一个类
当传入object对象它属于Student类型时
我们可以将它进步的强制转换Student的类型
从而可以通过圆点访问法来获取他的id信息
这里的ID是一个String类型要进行两个ID是否相等判断
现在就归结为两个字符串的相等性判断
把我们的String类已经实现了相应的equals判断方法
所以这里只要将字符串的id相等行的轻判断工作
转交给我们String类的equals方法就可以了
这样当我们创建两个对象
只要他们学号相同
通过equals方法它的出来结果
这应该是相同的
我们来运行一下程序代码
看一下他的结果
最后需要额外提醒一下的是
当我们对对象的引用变量使用双等号进行相等判断时候
那么
他比较的只是两个引用变量的内存地址是否相等
而我们现在student的equals方法呢
已经覆盖成了
基于学号的值的判断
那么一个是对象的地址是否相等
一个人对象的值是否相等
他的区别的就在这里
好了今天内容 就讲到这里
你学会了吗
总结一下今天的课程
在今日课程当中我们了解了Java当中的继承关系
你需要掌握uml当中继承关系的绘制方法
了解继承当中父子关系别名
掌握进程关系当中的定义语法
还需要了解继承关系对不同的访问权限的影响
在此基础上
需要能够明白
使用equals方法实现相等性判断的主要依据
和他的原理
-1.1Java简介
--01Java简介
-1.2搭建Java开发环境
--Video
-1.3使用记事本编写Java程序
--Video
-1.4使用Eclipse开发Java程序
--Video
-1.5导入/导出Java项目
--Video
-1.6管理组织代码
--Video
-第1章初始Java--测试题
-2.1认识标识符
--Video
-2.2变量和变量类型
--Video
-2.3数据类型和类型转换
--Video
-2.4使用常量
--Video
-2.5使用注释
--Video
-2.6使用运算符进行算术运算
--Video
-第2章使用Java基本语法(1)--测试题
-2.7使用运算符进行逻辑处理
--Video
-2.8使用if进行流程控制
--Video
-2.9使用switch进行流程控制
-2.10使用循环
--Video
-2.11循环的跳出和继续
--Video
-2.12多重循环
--Video
-第2章使用Java基本语法(2)--测试题
-3.1认识类和对象
--Video
-3.2为类添加属性
--Video
-3.3为类添加方法
--Video
-3.4为类添加静态方法
--Video
-3.5递归方法
--递归方法
-3.6构造方法
--Video
-3.7重载方法
--Video
-第3章使用面向对象基础语法--测试题
-4.1使用继承语法
--Video
-4.2使用数组
--Video
-4.3使用数组类操作数组
--Video
-4.4使用抽象类
--Video
-4.5使用接口
--Video
-第4章使用面向对象高级语法--测试题
-5.1异常处理机制
--Video
-5.2捕获异常
--Video
-5.3创建自定义异常
--Video
-第5章捕获并处理异常--测试题
-6.1SWT图形界面
--Video
-6.2使用SWT布局管理-FillLayout
-6.3使用SWT布局管理-RowLayout
-6.4SWT中的事件模型
--Video
-6.5常见事件处理写法
--Video
-第6章使用SWT设计界面--测试题
-7.1微波炉模拟程序的界面制作
--Video
-7.2微波炉模拟程序的代码重构
--Video
-7.3微波炉模拟程序的事件监听
--Video
-7.4微波炉模拟程序的数字键盘
--Video
-7.6微波炉模拟程序CookTimer
--Video
-7.7微波炉模拟程序添加图像
--Video
-7.8微波炉模拟程序添加声音
--Video
-7.9微波炉模拟程序安装包制作
--Video