-
一. 面向对象的基本概念(封装,继承,多态)
-
面向对象是一种以人类天生的归纳总结能力为基础进行软件设计与开发的开发方法。
-
开发方法:结构化、面向对象(规模大、角色多)。
-
自定义数据类型,使用归类能力将这个类型描述“清楚”。
-
寻找一类事物的特征:
-
-
-
-
明确共性(所有个体都具备的特征)
-
排除不相关(与系统无关)
-
-
-
-
-
-
1.类的抽象和类的成员
-
对一类事物寻找到特征后,形成对于类的明确概念
-
特征一定是名词或者动词
-
名词类的特征“属性”---成员变量
-
动词类的特征“方法”---成员方法
-
-
2.类与对象
-
经过“抽象”得到的是描述某类实物的类型
-
类是对象的模板,对象是类的实例化
-
一个实例就是一个 个体
-
-
3.构造方法(构造器)
-
用于对象的实例化操作,通过构造方法在堆中开辟内存,产生实例
-
构造方法的名字必须与类名一致
-
构造方法没有返回值设定(不设置返回值)
-
如果没有显示的编写构造方法,系统会安排一个默认的无参数构造方法,如果显示的编写构造方法,系统不再安排默认的无参构造方法
-
构造方法允许重载
-
-
4.this关键字
-
表示类当前的引用:区分同名属性和局部变量
-
哪一个实例触发了实例,this就是哪个实例
-
this():写在第一句,表示在构造方法中调用其他构造方法
-
-
5.内存模型
-
二.继承
-
1.继承的现实意义
-
同类事务中一般性与特殊性的关系
-
一般性的事物类--->父类/超类(super class)
-
特殊性的事物类--->子类(subclass)
-
可以理解为一般事务类包含特殊事务类
-
-
2.java中继承的的实现和特点关
-
extends 关键字:
-
1.子类继承父类后,子类获得父类中定义的所有特征(属性、行为、私有属性行为:但没权利使用)
-
子类可以扩展自己独特的特征。
-
2.单继承:一个父类允许有多个子类,一个子类只能有一个直接父类,可以有多个间接父类。
-
3. java.lang.Object 类 :如果一个类没有指定父类,默认以Object为父类
-
-
-
-
如果一个类写明父类,他不在直接继承Object类,会间接继承
-
---->Object类是所有类的父类
-
---->Object类代表“引用数据类型”
-
-
-
-
-
-
3.继承的内存模型
-
创建一个子类实例时,隐式的在内存中会创建一个隶属于该子类实例的父类实例
-
-
4.继承关系中构造方法的调用
-
核心:子类必须在构造方法的第一句通过super()调用父类的构造方法
-
super(): 子类实例中寄生的父类实例
-
-
-
通过super先构建出寄生的父类实例,再构建自己的实例
-
两者结合得到完整的子类实例的内存空间
-
-
-
-
如果子类的构造方法没有在第一句显式调用super()
-
默认调用父类的无参
-
如果父类没有有无参构造方法,子类必须显式调用
-
-
5.引用数据类型的类型转换规则
-
前提:引用数据类型之间转换必须发生有继承关系的两个类型之间
-
上塑造型(子类的实例--->父类对象)自动转换
-
将一个子类个体,当做普通个体来看待,忽视特殊性的一般性
-
下溯造型(父类对象--->子类对象)强制转换:
-
通过 instanceof:判断对象是否为class的实例
-
-
-
三. 多态
-
1. 方法的重写
-
Override, 方法的覆盖, 运行时多态
-
重载(Overload)与重写(Override)的区别?
-
意义:子类与父类之间,不同子类之间,在同一个行为上有不同的实现
-
代码:子类需要重新实现(重写)父类的某个行为(方法)
-
子类的重写方法必须与父类的方法同名,同参,同返回值类型
-
子类重写方法的访问权限不能低于父类方法
-
2. 多态的实现和现实意义
-
一种参数可以适配多种类型,实现不同类型同一种行为的调用
-
开闭原则:程序对扩展开放,对修改关闭。
-
实现多态的条件
-
(1)为多态支持的类型抽取共同的父类 --- 构建继承体系
-
(2)共同行为在父类中定义,子类进行重写 --- 通过重写实现不同类的实现细节
-
(3) 构建多态方法,它的参数是使用父类类型 --- 利用上溯造型支持不同类型的传入
-
(4) 多态方法内调用重写方法 --- 实现多态的效果
-
多态的优点:实现了开闭原则,在扩展新的类型时,多态方法不用修改
-
3. 实现多态过程中遇到的问题
-
问题1: 抽取的父类是一种概念,没有实物。
-
父类不是具象化的东西,本身是抽象的
-
在程序上,不应该有父类的实例化
-
问题2:父类中定义的共同行为,在父类中无法编写细节
-
问题3:在扩展新的类型时,可能忘记重写父类的行为
-
4. 抽象关键字abstract
-
抽象关键字用来修饰类和方法
-
抽象类:不能实例化,解决问题1
-
抽象方法:不需要给出方法的实现,只需方法定义即可,解决了问题2
-
子类继承父类后,必须实现(强制重写)父类中所有抽象方法,解决了问题3
-
现实意义: 一些概念性的父类,一些只能给出定义不能给出实现的行为。
-
抽象类:
-
(1) 抽象类不能实例化,允许有构造方法(给子类使用)
-
(2) 抽象类在继承体系中处于父类的位置
-
(3) 抽象类中允许有属性,构造方法,普通方法,抽象方法
-
抽象方法
-
(1) 抽象方法没有方法体{},只有方法定义
-
(2) 抽象方法必须定义在抽象类或接口中,不能定义在普通的类中
-
(3) 一个普通的类继承了抽象类后,必须实现其中所有的抽象方法
-
5. 接口interface
-
类的关键字是class,接口的关键字是interface。
-
接口的特点:
-
(1) 不能实例化
-
(2) 允许做为对象类型,通过“子类”去实例化
-
(3) 接口中只能声明常量,公有抽象方法,Lamda表达式
-
(4) 一个Java类只能继承一个直接的父类,可以同时“实现”多个接口
-
(5)一个接口可以多继承其他接口
-
接口的意义:
-
(1) 对Java单继承的补充
-
(2) 接口是对某种行为(某种能力)的描述
-
public class 子类 extends 父类 implements 接口A, 接口B, ...
-
public class 子类 implements 接口A, 接口B, ...
-
如果一个父类能被设计成接口,那就不设计成类。
-
四. 封装
-
1. 面向对象的封装
-
(1) package级别的封装
-
方式1:MVC模式:代码分层模式,按照代码功能将代码分为三个大层次
-
Model 模型层
-
DAO 数据持久层 --- 用于程序数据的持久化
-
Java与数据库DBMS交互的代码(JDBC)
-
减钱() 加钱()
-
Service 业务层 --- 处理业务逻辑,同时处理事务
-
转账(){
-
减钱
-
加钱
-
}
-
Control 控制层 --- 处理数据流转,视图(UI)的切换
-
View 视图层 --- 实现了用户操作界面(UI)
-
com.neusoft.dao
-
com.neusoft.service
-
com.neusoft.control
-
com.neusoft.view
-
方式2:按照业务逻辑进行分包
-
模块:高内聚,低耦合
-
基础模块 com.neusoft.base
-
薪酬模块 com.neusoft.salary
-
时间模块 com.neusoft.time
-
员工关系模块 com.neusoft.relation
-
方式3:方式1+方式2
-
project --- 主工程
-
com.neusoft.base -- 微服务工程
-
com.neusoft.base.dao
-
com.neusoft.base.service
-
....
-
com.neusoft.salary -- 微服务工程
-
com.neusoft.base.dao
-
(2) 类级别的封装
-
1.将一些业务流程中产生的零散数据,封装成类
-
regist(name, age, password, email, tel, ....)
-
统称为pojo类
-
属性来源于view层 VO类
-
RegistVO类 name, age, password, email, tel, ....
-
regist(RegistVO vo)
-
属性来源于持久化 PO类
-
映射数据库表 emp表 -> EmpPO类 empno,ename...
-
2. 四种访问权限(访问权限修饰符)
-
由低到高
-
类的内部 同一包下 不同包子类 任意类
-
私有 private OK NG NG NG
-
默认 无关键字 OK OK NG NG
-
保护 protected OK OK OK NG
-
公有 public OK OK OK OK
-
四种权限可以修饰属性,方法
-
默认权限和公有权限可以修饰类
-
思考1: 构造方法的权限设置为private
-
不让类的外部随意创建该类的实例,控制实例的数量
-
思考2: 父类中的某个方法,它的权限是protected
-
3. 访问器方法(set方法与get方法)
-
提供读写权限分离
-
set 写权限
-
get 读权限
-
4. 静态关键字 static
-
静态属性:所有实例,共享唯一一个静态属性的内存空间
-
现实意义:静态属性表示这个属性不属于某个具体的实例
-
而是属于“类”,静态属性也被称为“类属性”
-
通常建议直接通过“类名.静态属性名”进行调用
-
静态方法:只能访问同类的其他静态资源,不能访问非静态资源
-
反过来:普通方法允许直接调用静态内容
-
类加载至元空间的三种情况
-
(1) 创建了该类的实例
-
(2) 调用了该类的静态属性或静态方法
-
(3) 通过Java反射机制,手工加载该类(Class.forName("类名"))
-
(1)(2)(3)哪一个第一个执行,哪一个触发类加载
-
类在程序生命周期内只加载一次
-
静态代码块(静态块)
-
与属性和方法是同一级别的
-
static{
-
}
-
写在静态块中的代码,在“类加载”时,自动触发执行
-
为静态属性进行复杂的初始化操作
-
静态代码块也只能访问和操作静态内容,不能操作非静态内容
-
5. 最终关键字 final
-
可以修饰类,属性,方法
-
最终类 final class:不能被继承,不允许有子类
-
String Math
-
最终属性/局部变量: 赋值不可更改,称为”常量“
-
”常量“命名通常是全大写
-
最终方法: 不能被重写
-
思考1: abstract和final能否同时修饰类或方法?
-
不能,
-
原因:abstract要求类被子类继承,方法被子类重写
-
final 阻止类被继承,阻止方法被重写
-
两者冲突
-
思考2:声明常量时经常使用static+final这种组合?
-
final表示数据是常量不可修改
-
static约束数据只有一个,类名.直接调用
-
6. 设计模式 - 单例模式
-
(1) 饿汉式单例
-
(2) 懒汉式单例
-
synchronized 同步