JavaSE入门级-第六课-面向对象思想下
面向对象特性 封装
封装,指的是把相同相似的代码写在一个类文件中,属性部分私有化,方法部分公开化,属性需要提供对应的get/set方法
面向对象特性 抽象
抽象,指的是类的命名,需要结合类中的属性和方法给类起一个合理的名字,在编码过程中,这个类名就表示 数据 和 方法的集合
面向对象特性 继承
继承,指的是代码继承,一个类A继承类B,我们称A为子类,B为父类,子类继承父类拥有父类所有的属性和普通方法,构造器不能继承
战国时期,有一个地方有太行王屋两座山,方百里,高万仞,挡住了愚公一家劳作的去路,北山愚公,年且90开了个家庭会议决定移山,智者嘲笑他,呵呵,挖到死你也挖不完,愚公不屈,我死有子,子有孙,子子孙孙无穷无尽也,而山不再高怎么会挖不完呢
l 使用代码描述:需要被子子孙孙继承的有 工具 和 责任


上图中 protected 表示可以被继承的部分
所以有子类:

extends 表示继承,不需要写任何的代码
客户端调用

FishSun 没有写任何的代码也拥有这个 duty() 这个方法
继承的定义
继承指的是代码继承,子类继承父类可以拥有除构造器以外的所有代码,但不一定可以调用
继承关键字 extends
extends 译为拓展,其实继承可以理解为拓展,在不做任何操作的情况下和原来的一样,如果有做就是比原来的多
l 单继承
在java中只能支持单继承,即 A extends B 合法,A extends B,C 或
A extends B extends C 违法
l 链式继承
在java中如果需要多继承可以传递,即 A extends B, B extends C,这样 A就拥有了B,C两个类的代码
关键字 super
super,译为 上级的,存在于继承关系中,在上次的课程中我们了解到,如果用变量重复命名要区别本类和其他需要使用 this,super也是类似的功能区别 本类 和 父类一样的属性或方法
l super访问父类属性或方法

l super访问构造器
java中配合面向对象,必须子类的构造器要调用父类的构造器

所有类的父类(基类,超类)
java.lang.Object java中如果没有继承,那该类默认继承 Object
练习
l 默写面向对象继承的特性定义
l 使用继承完成需求,定义一个学生类,以及男同学和和女同学
面向对象特性 多态
多态,可以理解成为多种形态,多种状态,在java中允许使用多态,多态可以被分成两个方向,构造多态和行为多态
多态的定义
多态,指的是面向对象中同种结构或者同种行为,多种展现的效果
l 构造多态
构造多态,对象的构造上面存在多态,父类声明子类实例化,接口声明实现类实例化
常规的构造对象:

类型和构造器 是匹配的,但是如果存在 FishSun extends FishMan 那我们可以使用:

声明是父类,但是实例化却是子类的构造器,这时候f1能够访问的方法权限是父类的,但具体的运行逻辑有是子类的,如下图所示:

圈起来的表示可以访问,但是子类实例化表示实际的内容所以会被子类覆盖
l 行为多态
行为多态可以分为重载和重写
l 重(chong)载 overload:指的是在同一个类文件中,允许方法名相同,参数列表不同(包括顺序,类型)
l 重写 override:指的是在继承的条件下,子类可以覆盖从父类继承来的方法,要求方法名,参数列表一致,访问权限不能更严格
重载举例:

重写举例:
愚公的儿子可能不愿意挖山

多态的校验注解
@Override 属于java中的注解,它可以打在方法上,作用是校验背重写方法是否规范

构造器重载
在java中构造器重载是一个非常常见的操作,实现准备多种构造器,在引用调用的时候,只需要根据传入参数的不同会自动匹配构造器
练习
l 默写面向对象中多态的定义
l 我去上学校天天不迟到,尝试使用多态性描述3中上学的方式
面向对象特性小节
面向对象核心思想就是引用调用,达到代码 可拓展 可维护 可重用,它的特性有4个
l 封装:一系列代码的归集
l 抽象:合理的命名
l 继承:代码继承
l 多态:构造多态,行为多态
上下转型
java中因为存在多态的特性,因此有向上转型和向下转型
向上转型
如果A类和B类存在继承关系,假设A为父类B为子类那么有

子类对象可以直接赋值给父类对象
向下转型
如果A类和B类存在继承关系,假设A为父类B为子类那么有

父类对象需要强制声明才能变成子类对象
(注意:这种转换伴随一个风险需要做判断才能保证不会出现异常)
关键字 instanceof

面向对象的技巧
l 类一定要public吗
其实这个答案是肯定的,类的本意是代码的归集,是给别人引用调用的必须做成public,有些教材中会看到 缺省的类声明 class + 类名,这纯粹就是为了节省篇幅而已
l 什么时候用static什么时候不用static呢
在做封装的时候要考虑这个属性或者是方法的共享性,如果所有对象都一样,无差别,那就是static 如果会因为对象属性值的变化而变化 就不能static,另外注意static只能访问static,译为静态
l final可以修饰类吗
可以,当final修饰类的时候表示终类,此类不能被继承,比如 java.lang.String 就是终类
l 构造器一定要public吗
不是的,构造器私有化是一个高级技巧,表示这个类没有存在对象的必要
l 实体类
在java编程中有一些类只有数据部分,我们需要使用以下规则,属性私有化,提供get/set方法,无参构造器,全参构造器,重写toString() 方法
l 工具类
在java编程中有一些类只有方法部分,我们需要使用以下规则,方法全部 static,私有化构造器,防止愚蠢的程序员去new它
代码块 和 静态代码块
类是一系列代码的归集有属性部分,方法部分,构造器部分,其实在类中还可以写代码块
l 代码块
{ // TODO } 表示一些语句的集合,可以单独存在于类体中运行在构造器之前
l 静态代码块
static{ // TODO } 表示一些语句的集合,运行在构造器之前,并且只会执行一次

客户端运行结果:

抽象类
类本身就已经是面向对象抽象思想的体现,下面我们来认识一下类的抽象,这里的抽象要理解成未实现,虚拟的,是一个美好的愿景
l 在金庸的武侠小说中有一门武功,练成之后所向披靡,称霸武林,那就是 降龙十八掌,听名字每个人都知道这门武功有18个招式,但是具体的掌法却不是每个人都懂
l 在面向对象中可以用抽象类来解决这个问题,当你需要某个方法 但是你又没有办法实现或者不想实现可以使用 抽象方法

关键字 abstract
abstract 表示抽象,可以修饰方法,可以修饰类
l 修饰方法:此方法为抽象方法,不能有方法体
l 修饰类:此类为抽象类,有抽象方法的类必须为抽象类,而且不能被实例化
抽象类的作用
子类继承父类,必须实现父类中定义的抽象方法(除非它自己也是抽象类)
l 抽象类在java中是一个非常非常强大的功能,在以后会常用
l 在软件设计的第二阶段,软件设计,需要将可能用到的方法抽象出来,这样可以表示一个规范,配合父类声明子类实例化能够达到标准的效果
练习
l 写一个类Shap表示图形,里面有一个抽象方法 getArea(),使用子类去实现这个抽象
接口
接口是一种特殊的抽象类,在java编程中有一些抽象类,只有 抽象方法 和 常量,这种类型的类我们把它称作接口
接口的定义
关键字 interface

接口的实现
关键字 implements

l 小结:类和接口其实是两个分层级的产物,一般我们说到类我们只考虑他的属性部分,说接口会考虑他的行为部分,所以有 是关于事务数据部分的抽象,接口是关于事务行为部分的抽象,当然 类 也包括接口,接口是一种特殊的类
常量接口
因为接口的特殊性,大部分会把接口作为常量的定义类型:

(注意:接口中 public static 可以缺省不写)
练习:
l 整理java关键字 this,super,static,final,abstract,extends,implements的用途
l 编写本省各个市的常量类

浙公网安备 33010602011771号