导图社区 面向对象进阶
.面向对象设计中,类封装了数据,而类的成员函数作为其对外的接口,抽象地描述类,用类将数据和操作这些数据的函数放在一起,这就是面向对象设计方法的本质。
编辑于2022-09-26 20:29:57 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
面对对象进阶
分类思想
介绍
分工协作,专人干专事
例子
Student类
标准学生类,封装键盘录入的学生信息(id,name,age,birthday)
StudentDao类
Dao:(Data Access Object缩写)用于访问存储数据的数组或集合
StudentService类
用来进行业务逻辑的处理(例如:判断录入的id是否存在)
StudentController类
和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
分包思想
介绍
如果将所有的类文件都放在同一个包下,不利于管理和后期维护所以,对于不同功能的类文件,可以放在不同的包下进行管理
包
定义
本质上就是文件夹
使用package关键字定义
格式:package 包名;
一般不会手动给类定义包,使用IDEA创建即可
创建
可以创建单级包、多级包,多级包之间使用"."进行分割
多级包的定义规范:公司的网站地址翻转(去掉www)
cn.suliu.包名
命名规则
全是小写
注意事项
package语句必须是程序的第一条可执行的代码
package语句在一个java文件中只能有一个
如果没有package,默认表示无包名
类与类之间的访问
同一个包下的访问
不需要导包,直接使用即可
不同包下的访问
1.import 导包后访问
2.通过全类名(包名+类名)访问
应用场景:多个包下,出现了相同的类名称,就可以使用这种访问进行区分
注意
import,package,class三个关键字的摆放位置存在顺序关系
package必须是程序的第一条可执行的代码
import需要写在package下面
class需要在import下面
继承
介绍
继承:让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员
继承关键字:extends
优点
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提
弊端
继承是侵入性的
降低了代码的灵活性
继承关系,导致子类必须拥有父类非私有属性和方法,让子类自由的世界中多了些约束
增强了代码的耦合性
代码与代码之间存在关联都可以将其称之为"耦合”
注意
Java只支持单继承,不支持多继承,但支持多层继承
Java支持多层继承,也就是一个继承体系。对继承体系的了解与使用:查阅父类共性功能,创建子类对象使用功能
应用场景
当类与类之间,存在相同(共性)的内容,并且产生了is a的关系,就可以考虑使用继承,来优化代码
格式
格式:public class 子类名 extends 父类名{}
范例:public class Zi extends Fu{}
Fu:是父类,也被称为基类、超类
zi:是子类,也被称为派生类
继承的访问特点
成员变量访问特点
在子类方法中访问一个变量
1.子类局部范围找
2.子类成员范围找
3.父类成员范围找
注意
如果子父类中,出现了重名的成员变量,通过就近原则,会优先使用子类的如果一定要使用父类的,可以通过super关键字,进行区分
成员方法访问特点
通过子类对象访问一个方法
1.子类成员范围找
2.父类成员范围找
构造方法访问特点
因为子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。所以子类中所有的构造方法默认都会访问父类中无参的构造方法
父类初始化方式:所有的构造方法中,第一条语句默认都是:super()
如果编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最页层父类)
注意
当父类中没有空参构造方法,只有带参构造方法,会出现子类错误现象
解决方法
子类通过super,手动调用父类的带参的构造方法
子类通过this去调用本类的其他构造方法,本类其他构造方法再通过super去手动调用父类的带参的构造方法
不推荐
this(...)super(...)必须放在构造方法的第一行有效语句,并且二者不能共存
this、super
介绍
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)
方法重写
介绍
方法重写:在继承体系中,子类出现了和父类中一模一样的方法声明
参数列表、方法名、返回值一样
应用场景
当子类需要父类的功能,而功能主体子类有自己特有内容,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
注意
父类中私有方法不能被重写
父类静态方法,子类必须通过静态方法进行重写,父类非静态方法,子类也必须通过非静态方法进行重写
静态方法不能被重写!如果子类中,也存在一个方法声明一模一样的方法可以理解为,子类将父类中同名的方法,隐藏了起来,并非是方法重写!
子类重写父类方法时,访问权限必须大于等于父类
权限修饰符
修饰成员,成员包括成员变量、成员方法、构造方法
方法重写、方法重载
方法重写:在继承体系中,子类出现了和父类一模一样的方法声明(方法名,参数列表,返回值类型)
方法重载:在同一个类中,方法名相同,参数列表不同,与返回值无关.
final关键字
介绍
可以修饰类、函数、变量
特点
被final修饰的类不可以被继承。为了避免被继承,被子类覆写功能
被final修饰的方法不可以被覆写
被final修饰的变量是一个常量,只能被赋值一次,而且后面需要跟一个值,不然编译失败!既可以修饰成员变量,又可以修饰局部变量。
内部类定义在类中的局部位置上时,只能访问该局部被fianl修饰的局部变量
抽象类
介绍
抽象方法:将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法
抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
注意
抽象类不能创建对象
抽象类中有构造方法
抽象类的子类
必须重写父类中的所有抽象方法
将自己也变成抽象类
不推荐
抽象类的方法
抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类
定义格式
抽象方法
public abstract 返回值类型 方法名(参数列表);
抽象类
public abstract class 类名{}
与abstract不能共存的关键字
final
private
static
抽象类和一般类的异同点
相同点
都是用来描述事物,都可以进行属性和行为的描述
不同点
抽象类描述事物的信息不具体,一般类描述事物的信息具体
模板设计模式
介绍
模板设计模式:把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法,让使用模板的类(继承抽象类的类)去重写抽象方法实现需求
模板方法一般使用final关键字修饰
优势:模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
接口
介绍
当一个类中的所有方法都是抽象方法的时候,就可以将其定义为接口
接口也是一种引用数据类型,它比抽象类还要抽象
意义
规则的定义
现实中的USB接口
程序的扩展性
注意
接口不能实例化
接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
接口和类的关系,可单实现,也可以多实现
使用思路
如果发现一个类中所有的方法都是抽象方法,那么就可以将该类,改进为一个接口
涉及到了接口大面积更新方法,而不想去修改每一个实现类,就可以将更新的方法,定义为带有方法体的默认方法
希望默认方法调用的更加简洁,可以考虑设计为static静态方法。(需要去掉default关键字)
默认方法中出现了重复的代码,可以考虑抽取出一个私有方法。(需要去掉default关键字)
定义格式
接口用关键字interface来定义
public interface 接口名{}
接口和类之间是实现关系,通过implements关键字表示
单实现
public class 类名 implements 接口名{}
多实现
public class 类名 implements 接口名1,接口名2...{}
接口中成员的特点
成员变量
只能是常量系统会默认加入三个关键字:public static final
成员方法
JDK 7
只能是抽象方法,默认修饰符:public abstract
JDK 8
允许在接口中定义非抽象方法,但是需要使用关键字default修饰,这些方法就是默认方法,可以解决接口升级的问题
定义格式
注意
接口中的默认方法不强制重写,但也可以被子类重写,同时,重写默认方法不能加default关键字,权限一定是public
如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写
接口中允许定义static静态方法
定义格式
注意
静态方法只能通过接口名调用,不能面过实现类名或者对象名调用
public可以省略,static不能省略
JDK 9
接口中允许定义私有方法
定义格式
注意
私有方法只为接口提供服务,不需要外类访问
构造方法
没有构造方法
类与接口的关系
类和类的关系
继承关系,只能单继承,但是可以多层继承
类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
如果直接父类,和接口中出现了相同的方法声明,但是代码逻辑不一样优先使用直接父类的代码逻辑
接口和接口的关系
继承关系,可以单继承,也可以多继承
多态
介绍
多态:同一个对象,在不同时刻表现出来的不同形态
前提和体现
有继承/实现关系
有方法重写
有父类引用指向子类对象
优点
提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的任意子类对象
弊端
不能使用子类的特有功能
多态中成员访问特点
构造方法
同继承一样,子类会通过super访问父类构造方法
成员变量
编译看左边(父类),运行看左边(父类)
成员方法
编译看左边(父类),运行看右边(子类)
补充
为什么成员变量和成员方法的访问不一样呢?因为成员方法有重写,而成员变量没有
转型
分类
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
风险
介绍
如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现类型转换异常:ClassCastException
解决
关键字
instanceof
使用格式
变量名 instanceof 类型
判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
内部类
介绍
内部类:就是在一个类中定义一个类。
举例:在一个A类的内部定义一个B类,B类就被称为内部类
分类
在类的成员位置:成员内部类
介绍
成员内部类可以直接访问外部类成员,包括私有
外部类要访问成员内部类的成员,必须创建对象
创建格式
外部类名.内部类名 对象名=new 外部类对象().new 内部类对象();
修饰符修饰
private
私有成员内部类访问:在自己所在的外部类中创建对象访问
static
静态成员内部类访问格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
静态成员内部类中的静态方法:外部类名.内部类名.方法名();
在类的局部位置(方法):局部内部类
介绍
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
访问方式:只能在方法中,创建对象并访问
匿名内部类
介绍
匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)
理解:将继承或实现,方法重写,创建对象,放在了一步进行.
使用
前提:需要存在一个接口或类
格式
例子
实现了Inter接口的,一个实现类对象.
使用场景
当方法的形式参数是接口或者抽象类时,可以将匿名内部类作为实际参数进行传递
注意
当接口中存在多个方法,若使用匿名内部类的形式来调用多个方法,可以在匿名内部类前面用一个父类或父接口的引用接收,然后再调用
Lambda表达式
介绍
在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作"
面向对象思想与函数式思想
面向对象思想强调"必须通过对象的形式来做事情"
函数式思想则尽量忽略面向对象的复杂语法:"强调做什么,而不是什么形式去做"
Lambda表达式是函数式思想的体现,可以理解为是对匿名内部类的优化,只是本质上有区别
匿名内部类与Lambda表达式对比
匿名内部类
方法形式参数为空,说明调用方法时不需要传递参数
方法返回值类型为void,说明方法执行没有结果返回
方法体中的内容,是具体要做的事情
Lambda表达式
():里面没有内容,可以看成是方法形式参数为空
->:用箭头指向后面要做的事情
{}:包含一段代码称之为代码块,可以看成是方法体中的内容
区别
所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
使用限制不同
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
实现原理不同
匿名内部类:编译之后,产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
使用
前提
有一个接口
接口中有且仅有一个抽象方法
格式
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
->:由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:是我们具体要做的事情,也就是以前写的方法体内容
例子
带参数无返回值
如果如果Lambda所操作的接口中的方法,有参数,一定要在小括号中写明参数
无参数带返回值
注意:如果Lambda所操作的接口中的方法,有返回值,一定要通过return语句,将结果返回否则会出现编译错误
带参数带返回值
省略模式
规则
参数类型可以省略,但是有多个参数的情况下,不能只省略一个
如果参数有且仅有一个,那么小括号可以省略
如果代码块的语句只有一条,可以省略大括号和分号,甚至是return语句
主题