导图社区 java面向对象思维导图
这是一篇关于java面向对象的思维导图。该思维导图比较系统全面地归纳总结了关于这一部分的知识点,非常清晰易懂。
编辑于2021-09-10 08:21:58面向对象
对象
对象是实际存在该类事物的一个个体 因而也称实例(instace)
子类父类对象内存结构
super是标识符
内存中只有纯粹意义的子类对象
对象关联
子主题
主题
类
类是对现实世界事物的描述, 是抽象的 概念上的定义
类的5个成员
1.属性 (field)
2.方法 (method)
3.构造器 (constructor)
4.语句块 (block)
5.内部类 (Inner class)
访问权限控制
什么是封装
子主题
继承 extends
单继承
java只能单继承
继承权和使用权
子类拥有从父类继承的所有成员
但子类不能直接使用父类的私有成员
目的在于保护:封装
特有成员
方法覆盖
定义
父类子类重写父类的方法
目的
父类的方法不能满足需要 子类需要重新实现这个功能
父类不知道自己会被谁继承 无法在父类中将属性和方法写全
覆盖的要求
1. 方法签名一致
返回值类型
方法名
参数列表(类型, 个数, 顺序)
2. 子类重写方法不能比被重写方法有更严格的访问权限
3. 覆盖和被覆盖的方法必须同时为非static的
4. 子类方法抛出的异常不能大于父类被重写方法的异常
内部与外部视角
@Override注解
写给JVM的注释,没有达成覆盖会报编译错误
在python中是装饰器
语法相似但完全不同 python中是可执行的代码
标注
子主题
static
super
功能
1. 访问父类中定义的属性
2. 调用父类中定义的成员方法
3.可用于在子类构造方法中调用父类构造器
用法举例
尤其当子类出现同名成员时,可以用super进行区分
super的追溯不仅限于直接父类
super
构造器
特征
作用
缺省构造器
无构造器的缺点
重载
<init>
new 和 构造器 的关系
连换调用
第一行
先父后子
内部类
多态
子类对象可以当作父类对象来用就是多态
子主题
样式表
子主题
与关键字相关的内容
子主题
重点内容
子主题
不必展开说 但 有意义的概念
两种编程思维
面向过程
面向对象
关键字汇总
数据类型关键字
class
interface
byte
short
int
long
float
double
char
boolean
void
数据类型值关键字
true
false
null
流程控制关键字
if
else
switch
case
default
while
do
for
break
continue
return
权限控制关键字
private
protected
public
定义类,函数,变量修饰符关键字
abstract
final
static
synchronized
类和类之间关系关键字
extends
implements
定义建立实例 判断实例的关键字
new
this
super
instanceof
异常处理关键字
try
catch
finally
throw
throws
包的关键字
package
import
其它
native
strictfp
transient
volatile
assert
面向对象
对象
对象是实际存在该类事物的一个个体 因而也称实例(instace)
对象的创建过程 8个
1. 在永久区中检查要创建的对象的所属的类是否已经加载
2. 如果不存在,由类加载器(ClassLoader)来负责加载类模板
3. 如果存在,则不加载,保证类模板只有一份
4. 依据类模板中所有的属性的定义在GC去中开辟一块内存空间
5. JVM再把此空间全部写0, 结果就是所有属性自动拥有了缺省值0
6. 执行显式赋值
7. 执行构造方法
8. 返回对象首地址
概要
子类对象的内存占用
super是标识符
内存中只有纯粹意义的子类对象
对象关联
定义
一个对象拥有另外一个类的对象, 目的是在本对象中方便的使用另一个对象
步骤
1. 对象拥有属性
2. 我想拥有这个对象
3. 我把这个对象作为我的属性即可
可组成
链表
二叉树
匿名对象
定义
不定义对象的句柄,直接调用这个对象的方法
例子:new Person().shout()
特点:用完就变垃圾
2个场景
一个对象只需要进行一次方法调用
将匿名对象作为实参传递给一个方法调用
单例模式
定义
在整个软件系统中,对某个类只能存在一个对象实例,并让该类只能产生一个对象
2种范式
饿汉式单例
定义
类加载的时候就创建了对象
实现步骤
封死new(私有化构造器)
声明私有静态引用 指向 唯一对象(显式赋值)
声明公共静态方法 用户获取对象地址
懒汉式单例
定义
用户第一次调用对象时才创建对象
实现步骤
封死new(私有化构造器)
声明私有静态引用
声明公共静态方法 第一次调用时创建对象 用户获取对象地址
两种范式的对比
场景
对象小 创建过程简单 选饿汉模式
对象大 创建过程复杂 选懒汉模式(后台加载)
线程
饿汉模式线程安全
懒汉模式线程不安全 但是可以解决
接口
定义
不同类不同种事物共同的行为抽象定义
接口的规范
接口不能有构造器
接口中的属性都是全局最终常量(public static final)不写编译器也会为你加上
接口中的方法 全部都是公共抽象方法 public static 没有的话编译器会加上
接口的用法
具体类要实现接口的所有抽象方法
可以使用接口来实现多态
类不能继承接口 接口也不能继承类 接口不能实现类
接口是可以多重继承的
抽象类不必实现接口的所有方法
接口和抽象类之间的关系
代理模式
定义
为其他对象提供一种代理以控制对这个对象的访问
场景
使用者无法直接创建被代理对象
对于被代理类有升级的需求, 但是不可以修改被代理类
面向切面编程AOP
代理对象调用的被代理对象的那个方法叫做切面
类
类是对现实世界事物的描述, 是抽象的 概念上的定义
继承 extends
单继承
一个子类只能继承一个父类
多层继承
a是b的子类 b是c的子类
继承权和使用权
子类拥有从父类继承的所有成员
但子类不能直接使用父类的私有成员
目的在于保护:封装
特有成员
子类拓展了父类的成员,但父类中没有的
方法覆盖
定义
父类子类重写父类的方法
目的
父类的方法不能满足需要 子类需要重新实现这个功能
父类不知道自己会被谁继承 无法在父类中将属性和方法写全
覆盖的要求
1. 方法签名一致
返回值类型
方法名
参数列表(类型, 个数, 顺序)
2. 子类重写方法不能比被重写方法有更严格的访问权限
3. 覆盖和被覆盖的方法必须同时为非static的
4. 子类方法抛出的异常不能大于父类被重写方法的异常
内部与外部视角
@Override注解
写给JVM的注释,没有达成覆盖会报编译错误
在python中是装饰器
语法相似但完全不同 python中是可执行的代码
静态 static
定义
static静态的
静态与非静态
非静态的东西叫做对象属性/对象方法
静态的东西叫做类属性/类方法
静态属性
静态属性对于本类的属性来说是公有的
静态方法
功能和特点
被static修饰的变量对于本类的对象来说是共有的
static是和类相关的
类属性的内存分析
static方法的使用
类.限定名调用
通过对象调用
静态方法中没有this 因为这个静态方法中没有调用者对象
super
3种功能
访问父类中定义的属性
调用父类中定义的成员方法
可用于在子类构造方法中调用父类构造器
用法举例
尤其当子类出现同名成员时,可以用super进行区分
super的追溯不仅限于直接父类
super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
this
2种功能
this.xxx , this.yyy() 访问对象的成员, 包括属性和方法
this(...)连环调用其他构造器
2个场景
在构造器中, this表示正在创建的对象
在普通方法中 this表示此方法的调用者对象
构造器
特征
具有与类相同的名称
它不声明返回值类型(void)也不能有
不能static final synchronized abstract native修饰 不能有return语句返回值
它只能调用一次
缺省构造器
如果类中没有写构造器,编译器会自动添加一个无参构造器
子类构造器与父类构造器
子类中的所有构造器默认会自动调用父类的无参构造器
先父后子 父类构造器是先于子类构造器执行的
如果在父类给了有参构造器没给无参构造器,就会报错
<init>
代码中的构造器最终会被编译器转为<init>
重载
构造器可以有多个
this或者super必须在第一行 目的是为了直接或间接调用父类构造器
this和super不能同时出现在同一构造器中
抽象类与抽象方法 abstract
抽象方法
只有方法声明 没有方法体的方法,绝对不能执行
抽象类定义
具体类:对现实世界一种实体的抽象定义
抽象类:对现实世界某一类的多种不同实体的统一抽象定义
abstract
abstract可以用来修饰方法和类 但当类中有方法为abstract时 类必须为抽象类
抽象类的使用
抽象类不能被实例化
子类继承抽象类时,必须重写所有的抽象方法
模板方法设计模式
定义
抽象类作为多个子类的通用模板, 子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式
解决的问题
当功能一部分是确定的,一部分实现是不确定的。可以把不确定的部分暴露出去 让子类去实现
JavaBean
三个条件
类是公共的,大家都能用
有一个无参的公共构造器,创建对象简单
有属性,且有对应的get set方法,让一个对象携带大量的数据
native
native的意思是本地方法 其本质方法不是java语言实现的,可能是c或c++写的
语句块
非static
定义
没有static修饰的语句块是非静态初始化块
特点
会被整合进构造器,是构造器的一部分
作用是对对象进行初始化 一样也是只能执行一次
非静态块的执行总是优于构造器
不管哪个构造器要执行,非静态块总要执行
非static
static 静态初始化块
定义
用static修饰的语句块是静态初始化块
特点
有一个方法名<clinit>
类模板加载时自动执行一次,且只有一次
<client>整合
静态初始化块从上向下整合
显式赋值与语句块平级
非法向前访问
静态初始化块后的类模板中声明了一个变量 此时编译器不知道 你是否继承了某个父类,保险起见会警告
但是子类不继承父类的静态属性 只是将其当作全局变量使用 这取决于权限控制
static
final
定义
最终的,终极的
作用
final标记的类不能被继承
final标记的方法不能被重写
final标记的量被称为常量
规范
在JAVA中 常量名应当大写
空final量
在构造过程中,final量必须进行一次赋值,且不能赋值多次
静态空final量的赋值机会
显式赋值
static语句块
对象空final量的赋值机会
显式赋值
非static语句块
构造器
内部类
成员内部类
声明在类中方法外的内部类
嵌套类
定义
static修饰的, 没有强烈依赖 从级别上来讲它和外部类同 级别 只不过是位置在外部类里面
使用
只是使用位置的变化 没有发生对象关联
普通内部类
定义
没有static修饰的, 隶属于 外部类对象的
使用
普通内部类不允许普通静态变量
JDK8中不行
普通内部类允许特殊的静态成员变量(final)
内部类和外部类如果有同名成员 使用时必须加限定
在测试类中若要创建内部类对象需让外部类对象参与进来
用途
内部类可以使用外部类的所有成员,所以实际上是内部类关联了外部类对象 它可以代替对象关联 但最好不要这样用
局部内部类
声明在方法中的内部类
普通局部内部类
定义
普通局部内部类
定义在方法中 随着栈的消亡而消亡
匿名内部类 (超重点)
定义
没有类名 只能实例化一次 用完即废
规范
匿名内部类不能定义任何静态成员、方法和类。只能创建内部类的一个实例
一个匿名内部类一定是在new的后面,用起隐含实现一个接口或继承一个类
特点
自身没有类名 不能本态引用 只能多态引用
使用场景
没必要大张旗鼓写一个子类了
一锤子买卖,匿名内部类是绝对的单例
访问权限控制
什么是封装
封装就是成员私有化. 别的类只能通过方法来访问属性 这样我们就能在方法中做手脚 从而来保护对象的属性
不一定必须private才算封装,public外的权限都能封装 区别在于封装性强弱
类的5个成员
1.属性 (field)
2.方法 (method)
3.构造器 (constructor)
4.语句块 (block)
5.内部类 (Inner class)
工厂模式
定义
用调用方法的方式来创建对象,单例模式是其中之一
使用场景
1. 当一个类不知道它所必须创建的对象的类的时候
2. 当一个类希望由它的子类来指定它所创建的对象的时候
3. 当类创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
多态
定义
子类对象可以当作父类对象来用
前提
多态的前提是继承
父类之所以能够引用子类对象是因为子类继承了父类所有成员
本态引用
子类对象的地址赋值于子类类型的引用变量
多态引用
子类对象的地址赋值于父类类型的引用变量
副作用
多态引用时 子类特有成员无法访问了
造型有风险 必须先判断 编译不报错 运行会出错
instanceof
应用
多态数组
虚方法调用
定义
编译器检查父类类型引用 但实际上调用了子类方法
前提
继承 和 重写
造型 对象类型转换(casting)
定义
使用强转符号将 一个子类转为父类引用 一个父类转为子类引用 关键在于内存中的对象
造型有风险 必须先判断
Object类
定义
Object是所有子类的最顶层的父类 设计它的目的就是为了多态
四个主要方法
public Object() 构造方法
public boolean equals(Object obj) 对象内容比较 this对象和 obj对象
public int hashCode() 获取对象的Hash码
equals和hashcode必须同时重写
public String toString() 对象打印时调用
成员变量不具备多态性 只看引用变量所属的类 有多态性的是方法
样式表 按优先级排列
重点
重点内容
关键字
与关键字相关的内容
概念
概念
内存
内存
补充
补充性知识点
关键字汇总
数据类型关键字
class
interface
byte
short
int
long
float
double
char
boolean
void
数据类型值关键字
true
false
null
流程控制关键字
if
else
switch
case
default
while
do
for
break
continue
return
权限控制关键字
private
protected
public
定义类,函数,变量修饰符关键字
abstract
final
static
synchronized
类和类之间关系关键字
extends
implements
定义建立实例 判断实例的关键字
new
this
super
instanceof
异常处理关键字
try
catch
finally
throw
throws
包的关键字
package
import
其它
native
strictfp
transient
volatile
assert