java面向对象!知识点梳理(Xmind加知识点)
java面向对象!知识点梳理(Xmind加知识点)
想要xmind原文件的小伙伴私聊我,看见秒回复哦
面向对象的思想介绍
什么是面向对象
- 一种编程时解决问题的高级编程思路
面向对象和面向过程的比较
- 面向过程: 更强调解决问题的基本步骤
- 面向对象 :强调拥有数据的主体,自底向上不断拼装
- 两者的关系: 面向对象是一种高级的编程编程思想,面向对象基于面向过程,面向过程是面向对象的基础
面向对象的好处
- 1.更符合人类的思想习惯(找类找对象来帮你解决) 2.复杂问题简单化 3.由执行执行者,变为了指挥者
面向对象的三大特征
-
- 封装 2. 继承 3. 多态
类和对象
类和对象的比较
- 类 :是对具体事务的抽取出来的结果
- 对象: 类的具体实现
什么是类
-
定义 ;一组相关属性和行为的集合
- 属性 : 对事物特征的描述,—>成员变量
- 行为 : 对事物功能的描述-----> 成员方法
对象的创建
-
格式
类名 对象名 = new 类名();
-
- 调用方法格式
- 对象名 . 方法名 ();
-
- 调用属性格式
- 对象名 . 变量名;
-
补充:创建对象的内存理解
-
- 将要创建的对象所属的类加载到方法区 (类之加载一次) 2. 在栈内存中创建该类的引用, 将来用于存储该对象地址的引用 3.在堆内存中开辟存储空间,给各个成员变量分配内存 4 .给成员变量赋初值 5. 将对象内存的地址,赋值给栈内存中的引用
-
补充
-
匿名对象
没有名字的对象
-
格式
new 类名 ();
-
使用场景
- 1, 在对象创建后只使用一次 2, 可以作为某方法的实际参数 3. 可以作为某方法的返回值
-
注意事项
- 1.匿名对象可以给成员变量赋初值,但是没有任何意义,没有引用的对象很快会被当做垃圾回收
-
-
成员变量和局部变量的比较
-
不同点
-
代码层面:
-
- 局部变量: 定义在方法中 2. 成员变量: 定义在类中,方法外
-
-
内存层面
- 空间(分配内存): 1 . 局部变量 :分配空间在栈内存 2 . 分配空间在堆内存
- 时间(生命周期): 1. 局部变量: 随着方法的调用而存在,随着方法的调用结束而消失
2. 成员变量: 随着对象的创建而存在,随着对象的消失而消失
-
初始化状态
-
- 局部变量: 没有默认的初始化值,必须先手动赋值,才能使用 2. 成员变量: 有默认初始化值 和数组默认值相同
-
-
作用域
- 1.局部变量只能作用在该方法内,在声明的该行,到最近的代码块的右大括号结束; 2 .成员变量: 从至少本类(非私有成员变量继承之后可以作用域延申到子类)
-
-
在同一个成员方法中成员变量和局部变量冲突的时候: 就近访问原则
-
封装
概述: 隐藏事物的属性和细节,对外提供公共的访问方式
为什么要封装和封装的好处
- 1.隐藏事物的实现细节 2. 提高的代码的复用性 3. 提高安全性
封装的原则
-
- 隐藏事物的属性 2 .隐藏事物实现的细节 3. 对外提供公共的访问接口
private关键字
-
可以修饰的内容
- 1 成员变量 2. 成员方法 3 .构造方法 4 . 内部类
-
修饰后的效果
- 只能在本类中访问
-
private关键字注意事项
- 封装的修饰符还有 默认修饰符 , protected ,public 每个修饰符的访问范围都不相同
属性的公共访问方法 getter 和 setter
-
格式
系快捷键可以生成
-
为什么要有getter和setter方法
- 成员变量被private修饰后,就只能在本类中被访问,get 和set 就是提供给外界的公共访问方式
this关键字
-
含义
- 用来表示当前类的对象的引用,也就是,那个来调用this所在的方法,那个就是this
-
作用
- 用来区分局部变量和成员变量重名的情况
-
补充
- 变量访问的就近原则: 当在访问变量名称的时候,会先寻找最近该变量的定义,如果找到了就用,否则去更远的地方寻找
构造方法
-
作用
- 用于给对象中的成员变量赋值,jvm虚拟自动调用
-
构造方法的特点
-
- 没有返回值类型 2 .方法名和类名必须一致 3 没有return语句,可以写return;
-
-
注意事项
- 1.构造方法是由创建对象过程中,jvm自动调用 2. 如果自己没有定义构造方法,那么系统会默认提供空参构造 3.当自己定义了构造方法,系统将不在提供 4 构造方法中一般都需要重载
-
补充:通过构造方法创建对象的内存理解
静态
为什么要有静态
- 如果某个类型的对象都具有一个相同的属性值,没必要在每个对象的空间中都声明一份这样的成员变量,浪费存储空间, 对于静态方法,如果每个对象都需要调用这个方法来实现这个功能,就可以声明成静态的,通过类名字直接调用来使用,提高了复用性
静态变量的特点
- 1.随着类的加载而加载, 2 .静态变量优先于对象存在 3. 静态变量别所有该类的对象所共享 4. 不需要创建对象通过类名直接调用
静态访问的注意事项
- 静态方法不能访问非静态的变量,方法,不能有this关键字
补充:静态变量和非静态变量的区别
-
概念上所属不同
-
- 非静态变量属于对象 2. 静态变量属于类
-
-
内存空间
-
存储位置不同
-
- 非静态的变量存储在堆内存, 2 静态变量存储在方法区
-
-
生命周期不同
- 1.非静态变量随着对象的存在而存在,随着对象的消失而消失 2. 随类的加载而加载,随着类的消失而消失
-
-
访问方式
- 1.非静态变量只能通过类名来访问.2.静态变量: 通过类名字访问或者对象名
继承
为什么要有继承
-
让类和类之间产生关系
- 提高代码的复用性
- 多态的前提
概述
-
关键字
- extends,使子类获得父类属性和方法的使用权,并不属于子类
继承的注意事项
-
- 子类不能继承父类的私有变量和方法,但是可以通过继承的公共访问接口使用, 2,子类不能继承父类的构造方法,但是必须调用
- 子类和父类必须满足, is a 原则
继承的特点
- 支持单继承,不支持多继承,支持多层继承
super关键字
-
含义: 表示当前对象父类的引用
-
补充:this和super
-
作为关键字的区别
-
含义不同
-
- super : 代表本类当对象的父类的引用 2. this : 代表本类当前对象的引用
- 代表的引用的值相同,但是他们的权限不同
-
-
访问成员变量的区别
-
- super只能访问父类的成员变量
2.this既可以访问子类成员变量,也可以访问父类成员变量,优先在外层寻找
- super只能访问父类的成员变量
-
-
访问成员方法的区别
-
- super只能访问父类的成员方法
2.this既可以访问子类成员变量,也可以访问父类成员方法,优先在外层寻找
- super只能访问父类的成员方法
-
-
作为语句访问构造方法
-
super()语句
- 访问父类的无参构造
-
this()语句
- 访问本类的无参构造
-
注意事项
-
- 必须放在构造方法的第一行(保证父类先被加载)
-
-
-
-
并且super语句和this语句不能同时出现
- 注意事项:1 super语句和this语句在调用的时候,避免递归调用 2.只能出现在构造方法的第一行
继承中成员变量的关系
-
- 如果子类中定义了和父类不同名字的变量(非私有)子类既可以访问父类变量,也可以访问本身变量 2. 如果子类中定义了和父类同名的方法,则会按照就近原则进行访问
继承中构造方法的关系
- 1.子类初始化类的数据之前,必须完成对父类的初始化 2.如果在子类的构造方法中,没有显示的调用其他任何的构造方法,系统默认在第一行使用super() 3.如果子类的构造方法手动的调用了父类的其他构造方法,那么系统将不再提供访问其他构造方法的语句 4. 构造方之间不能递归调用
继承中成员方法的关系
- 1.子类默认继承父类中的非私有方法,子类也可以定义自己的特有方法 2.字符类中出现同名方法就产生了重写
重写的注意事项
- 私有方法不能重写,如果出现重名,相当于在子类中定义了一个新方法
补充:重写和重载
-
重写
-
- 在子父类中,方法名相同,参数列表相同,与返回值类型有关(使用父类的方法定义,修改为子类的实现) 2.子类重写方法的修饰符权限要大于等于父类 3.子类重写方法抛出的异常要比父类小
-
-
重载
-
方法名相同,参数列表不相同(参数类型,参数顺序,参数个数有一个不同即可),与返回值类型无关
-
注意事项:
-
- 参数列表中与参数名无关,关注的是参数类型 .2. 与返回值类型无关 3 如果实际参数传入没有最合适的方法匹配,会退而求其次(自动,向上,就近匹配最合适的方法) 4,在调用方法的时候要避免调用匹配不明确的情况(对于每个参数都要分析那个方法是相对合适的,所有参数的权重相同都相对合适才能使用,否则编译报错)
-
-
好处作用
- 屏蔽了同种功能方法之间的参数差异,方法的调用系统根据参数自动匹配,减少了程序员的记忆负担
-
代码块
概述
- 使用大括号包起来的一段代码,放在不同的位置,有不同的名称,有不同的名称,不同的作用,有不同的执行时机
分类
-
局部代码块
-
位置
- 方法中
-
作用
- 限定变量的生命周期
-
注意事项
- 在代码块中声明的变量,出了方法快就无法使用,但是在局部代码块中,可以使用代码块外的变量
-
-
构造代码块
-
位置
- 在类中方法外
-
作用
- 用于为成员方法赋值
-
构造代码块和构造方法的执行说明
- 1.由jvm虚拟机自调用 2. 构造代码块在构造方法执行之前执行 3. 任何的构造方法在执行之前都会先执行构造代码块 4. 如果每个构造方法都会执行的内容,提取带构造代码块中
-
-
静态代码块
-
位置
- 类中方法外
-
格式
static{
代码块内容
} -
作用
- 用于给静态的成员变量赋值
-
执行特点
- 1.随着类的加载而加载 . 2. 类只会加载一次,所以静态代码块也只执行一次 3. 执行时机最早: 在于所有对象的相关内特
-
final关键字
概念
- 单词含义: 最终的,最后的,表示不能修改的
可以修饰类,方法,变量
-
修饰类
- 表示一个最终类,不能有子类 (不能被继承意味着类中的所方法都不能被修改,但是不影响当前类方法的使用) (不影响创建对象)
-
修饰方法
- 表示一个最终的方法不能被修改
-
修饰变量
- 变量就变成了常量只能被赋值一次,不能被修改
内部类
什么是内部类
- 定义在类的内部,或者类中方法中的类就是内部类
根据定义位置划分类
-
成员内部类(类中方法外)
-
普通成员内部类
-
格式
格式:
class 内部类名 {
内部类成员
} -
访问方式
-
- 内部类可以直接访问内部类成员 2. 外部类访问内部类的成员必须创建内部类对象在调用 3 在外部类之外的类访问该类内部类的格式:
-
-
在无关类中创建对象格式
外部类名.内部类名 内部类对象名 =
new 外部类名().内部类名(); -
特点
-
-
私有成员内部类
-
格式
格式:
private class 内部类名 {
内部类成员
} -
访问方式
-
- 在外部类以外不能直接访问 2. 可以在外部类定义一个访问私有成员内部类的共有方法,外界可以调用该方法,间接访问私有成员内部类 3 .外部类直接在类中创建对象访问
-
-
-
静态成员内部类
-
格式
格式:
static class 内部类名 {
内部类成员
} -
访问特点
-
1成员内部类是外部类的静态成员,可以通过内部类名直接调用 2. 静态内部类的非静态成员需要创建内部类对象之后才能调用
-
补充
- 总结:一个类是否需要需要创建对象,不取决于该类本身是否静态,而是要访问的成员是否静态
-
-
在无关类中对象创建的格式:
外部类名. 内部类名 内部类对象名 =
new 外部类名. 内部类名();
-
-
-
局部内部类(在方法中)
-
访问说明
- 方法的封装性是最强的,跟变量一样,封装在方法中的局部内部类外界无法访问到的
-
解决方案
- 在方法内部创建该局部的内部类对象并使用内部类的成员,外部类可以通过调用该方法,间接调用到该局部内部类
-
包
什么是包
- 用于分类分类存放类文件(.class)的层级文件夹
作用
- 在不同的包中,可以用相同的类名(像标记一样用包区分了)
命名
- 一般为公司域名的导致,因为域名是全球唯一的,这样类就唯一了,便于后期维护
包的声明
- 使用package关键字,声明当前的类是属于那一个包的,声明在java文件的第一行
效果
-
- 编译这个类也,就会到指定的为文件夹 2.当前的类的名字就变成了(全类名 = 包名. 类名)
运行
- 如果想要运行该Java类就要到包目录下执行命令
简化使用
-
为了不在开发中每次都写全类名,会让代码冗余,所以引入导包 使用import 关键字
-
导包格式
import 包名
权限修饰符
概念
- 用于控制册成员的访问权限的修饰符
意义
- 是封装的一种体现形式
分类
-
private
- 只能在本类中访问
-
默认权限修饰符
- 能在本包中被访问
-
protected
- 在其他包的有有继承关系的子类可以被访问
-
public
- 其他包的无关子类也可以访问
多态
概念
-
事物的多种状态
-
对象的多态性
- 同一个对象可能有,可能具有不同的名称 eg: 猫既可以叫猫,也可以叫动物
-
类型的多态性
- 同一个类型,可能有不同的子类实现 eg:动物既可以指猫,也可以指狗,
-
为什么要有多态
- 为了实现动态化,不能将原代码固化,配合反射
多态的前提
-
- 要有子父类的继承实现关系 2. 有方法的重写 3. 父类的引用指向子类的对象
多态中成员方法的访问特点
-
编译看左边,运行看右边(jvm的特定操作)
- 编译看左边,看 =号左边 是不是存在该方法的定义,存在即通过
- 运行看右边,运行的时候执行的是 =号右边子类对该方法的具体实现
多态的好处
- 1.提高了代码的可拓展性 2. 在方法的参数的列表中,可以定义父类的引用,或接口的引用,将来调用的时候,所有的子类对象或者实现该接口的对象都可以传进去做实参 3.子类的对象来源可以非常广泛,不仅仅是new出来的,还可以通过反射获取,实现在编译阶段不确定具体的子类的类型,从而达到动态灵活控制
抽象类
概念(abstract)
- 抽取像的,相同的,相似的内容出来
抽象方法
-
概念
- 只有方法的声明,没有方法的实现
抽象类
-
概念
- 可以定义抽象方法的类,就是抽象类
-
特点
-
- 抽象类和方法都必须用abstract修饰 2. 抽象方法所在类必须是抽象类, 抽象类中未必有抽象方法 3. 抽象类只能被继承后的子类实例化
- 1 抽象类的子类如果没有将父类的抽象方法全部实现,那么子类还是抽象的,还需要使用abstract修饰 2.只有将父类的抽象方法全部实现才能创建子类对象
-
注意事项
-
成员变量
- 抽象类可以定义成员变量,也可以定义常量,但是不能抽象(用于子类的继承)
-
构造方法
- 可以有,取决于该抽象类是不是有成员变量,是提供给子类调用的
-
成员方法
-
抽象方法
- 强制子类重写
-
非抽象方法
- 正常继承,提高代码复用性
-
补充
-
一个类中是不是需要构造方法
- 取决于该类是不是有成员变量需要初始化,而不是取决于这个类是不是或能不能被实例化对象,比如抽象类有构造方法是给成员变量赋值,给实现的子类构造用的
接口
概念
-
广义
- 一切定义规则的都是接口
-
狭义
- Java中定义方法命名的规则就是接口
好处
- 方法的命名规则定义出来后,方法的调用和方法的实现就分离开了,可以提升开发效率,降低代码的耦合性
特点
-
1 .接口其实是特殊的类,编译之之后也是.class文件 2. 只能声明抽象方法的声明,没有方法体(java8之后可以定义静态方法和默认方法(选择性的被子类重写)) 3. 类可以实现抽象接口中的方法
-
接口的实现类的两种前途
- 没有完全实现接口的所有方法,该类成为抽象类
- 实现全部的抽象方法,成为普通类
接口中的成员特点
-
成员变量
- 可以有,必须是常量,没有变量.默认别 public static final 修饰
-
构造方法
- 没有构造方法(没有真正意义的成员变量)
-
成员方法
-
只能是抽象方法
- 默认被 public static修饰
-
补充
-
类和类的关系
- 类和类可以子父类的继承,单继承不能对继承,支持多层继承
-
类和接口的关系
- 类实现接口,可以多实现,一个类可以实现多个接口,但是不能,多层实现
-
接口和接口的关系
- 可以继承,extends关键字,可以单继承可以多继承,可以多层继承
-
类和接口的区别(设计上讲)
- 抽象类:定义物体本身固有的属性,和行为
- 接口,定义物体通过学习,训练拓展出来的行为
匿名内部类
概念
- 所谓内部类是指可以利用内部类 ,是指可以利用内部类创建没有名称的对象,它对父类或实现的接口进行重写,达到使用知名类和接口的作用,并调用自己实现方法
存在的意义
- 为了简化代码
前提
- 匿名类继承或实现接口
格式
new 父类类名或者接口名(){
父类的重写方法或者接口的实现内容
}
本质
- 1 . 创建了一一个类的子类对象,或接口类的实现类对象 2. 更强调一种关系的写法
内部类编译之后字节码文件名字的区分
- 外部类名$1…内部类名