枚举 与 记录
作业点评
接口知识点
1、接口语法
//定义接口
public interface 接口名字{
//不能有初始化块(static和非static)
//属性 --- 默认公共静态常量
//没有构造
//行为 -- 默认为公共的抽象行为
//JDK8 -- 可以定义实现的行为,必须用default
//JDK8 -- 可以定义static方法
}
接口的使用语法一
//接口可以继承接口(多继承)
public interface 子接口 extends 父接口1,父接口2{
//子接口自动具备来自于父接口的内容
//子接口还可以定义自己的内容
}
接口的使用语法二
//类实现接口(多实现)
public class 实现类 implements 接口1,接口2{
/*
必须重写来自于接口的所有抽象方法,
否则这个类就是抽象类
*/
//还可以添加定义自己的内容
}
接口的使用语法三
//匿名内部类
//在一个方法里面直接使用接口,new出来一个它的实现类对象。
public void test(){
接口名字 变量名 = new 接口(){
//实现接口里面的抽象方法
};
method(变量名);
}
再次解释一下“匿名内部类”:
在这里的实现当中,我们new了一个接口的实现类对象,它的父类是Object。如果要说底层语法的话,类似于
public class 没有取名 extends Object implements 接口{
//实现接口里面的抽象方法
}
它的特点就是:
a、这个实现类没有取名字,所以只能new这一次;
b、这个类的定义和new对象动作是同时编写的;
c、整个定义作为一条new的语句,放在了外部类的某个方法里面,所以是内部类;
2、接口应用场景
2-1、让没有继承关系的类也能共享行为;
由于接口和继承树解绑,再加上多继承和多实现,导致接口的应用范围可以更广泛和灵活。
2-2、标识接口
通过实现某个接口,从而让这个类具有一种标识,能够允许执行某种特殊操作。
这两个场景很容易区分:
场景一的接口,里面一定会定义行为方法;
场景二的接口,往往里面是没有任何内容的。
3、抽象类与接口区别
3-1、语法
关键字 interface : abstract class
属性 公共静态常量 : 任意常量、变量
构造 没有 : 有
抽象方法 可以不写abstract : 必须写abstract
非抽象方法 必须写default : 常规定义即可
初始化块 没有 : 有
继承 多继承 : 单继承
实现 多实现 : 没有这个概念 ......
3-2、场景
抽象类也是类,所以它和子类是“一脉相承”的is-a关系;
接口和它的实现类虽然也能共享行为,但不是is-a关系,更多的是“附属添加”的关系,用like-a。
在设计的时候,“与身俱来”的行为要设计在抽象类(父类)中,“额外添加”的附属行为定义在接口当中。注意定义接口的时候满足“接口隔离原则”。
作业:
请各位做一个总结,交DOC文档。要求按字母顺序,把我们目前学过的所有关键字解释一遍。要求,解释的内容越详细越好。
- abstract 抽象 作为可选修饰符存在,可以修饰类、方法(构造不行);
- byte 基本数据类型 字节型 空间1个字节 整数
- boolean 基本数据类型 布尔型 空间不确定 值只能是true 或 false
- break 流程中断语句,可以中断循环(只中断一层),还可以中断switch
- class 类声明的关键字
- case switch当中的分支
- char 基本数据类型 字符型 空间2个字节 底层存放的是整数(字符的编码)
- continue 循环中专用的流程控制语句,作用是结束本次循环进入下一次
- default 两个作用 switch语句中代表默认分支;接口当中代表默认行为(实现了的行为)
- double 基本数据类型 双精度实数 空间8个字节
- do 在后验循环do-while循环中,作为循环代码块的起始关键字
- else 分支语句中代表“否则”分支的关键字
- extends 继承 类继承类(单) 接口继承接口(多)
- float 基本数据类型 单精度实数 空间4个字节
- final 可选修饰符 可以修饰类、变量(属性和局部变量)、方法。含义是“最终的,不变的”。所以修饰的类不能被继承;修饰的变量称为常量;修饰的方法不能被重写
- for 一种循环关键字,for循环用于明确知道循环次数的场景,for后面的"()"中有三个表达式,用";"隔开,表达式可以不写,但是分号必须写
- false 布尔类型的一个值,代表假
- goto 这个是Java中的保留字,所谓保留字就是把它占用了,但是还没有在语言当中应用
- if 分支语句中的“如果”,后面的"()"中填写判断条件(boolean类型的结果)
- int 基本数据类型 整型 空间4个字节
- import 导入包的关键字 一个类在默认的情况下只有在本类所有在包里面可以被默认认知,如果非本类所在的包都需要用import语句导入这个类。另外,先人提供的类只有java.lang包中的类不用impoort导入
- interface 接口类型的关键字
- implements 实现 类实现接口(多实现)
- instanceof 一种运算符 用于判断一个对象实例是否属于某个类型 得到true或false
- long 基本数据类型 长整型 空间8个字节
- new 调用构造方法产生对象的关键字
- null 空 引用数据类型变量的默认值,代表该变量不指向任何对象
- public 访问修饰符 公共 可以修饰自定义类型、属性、构造、行为
- private 访问修饰符 私有 可以修饰自定义类型、属性、构造、行为
- protected 访问修饰符 受保护的 可以修饰自定义类型、属性、构造、行为
- package 申明当前类型属于哪个包的关键字,在整片Java文件代码的最上方。 一个类的全名(限定名)是 “包名.类名”
- return 结束方法的关键 让执行流程返回方法调用处 只是当这个方法结束的时候需要返回值,那么它的后面才必须接一个值。
- short 基本数据类型 短整型 空间2个字节
- static 可选修饰符 静态 可以修饰内部类,属性,行为,初始化 。用static修饰的内容具有两个特征:与对象无关,属于类级别;类加载期有特殊操作。
- super 在子类中表示父类的关键字。“super.” 和 “super()”
- switch 分支语句的关键字,主要做多分支判断中表达式等于某几个固定值的情况。
- this 在子类中代表当前对象,有"this."和“this()”两种用法
- true boolean类型的一个固定值,代表真
- void 专用于定义方法没有返回值的返回类型
- var 声明变量类型时可以使用的统一关键字,由它声明的变量会根据后年的赋值语句,决定该变量类型到底是什么。
- while 两种循环的关键字 后面都是接"()",里面书写循环是否执行的判定条件,为真则进入循环,为假退出循环
- yield switch当中把某个分支的结果作为整个switch表达式的结果
枚举(enum) -- 掌握基本概念和语法
所谓枚举 -- 是一种取值范围固定在某个指定集当中的数据类型。
定义的语法:
public enum 枚举类型名{
值选项1,值选项2,....,值选项n;
}
注意点:
1、这里的值选项是标识符,不是字符串;
2、这里的值选项是有顺序的;
3、值选项不能重复。
使用的语法:
枚举类型 变量 = 枚举类型.值选项;
枚举的本质
枚举其实是一个语法糖,在本质它是一个自动继承于Enum类的子类。
Enum类来自于java.lang包,是一个抽象类。Enum拥有的属性行为,所有的枚举类型都拥有。
属性:
name -- 选项名字 String
ordinal -- 选项的序号 int
这两个属性都是私有的常量,也就是说外部不可访问,同时一旦产生Enum对象以后其值也不能修改。
非static方法:
name() -- 返回选项的名字
ordinal() -- 返回选项的序号
compareTo() -- 比较两个枚举对象的大小,返回的是它们的序号差
另外凡是来自于Object类的方法,它都有。包括:
equals() -- 判断两个枚举对象是否相等
toString() -- 返回枚举的字符串描述,其实重写后就是返回的name
static方法:
values() -- 以数组的形式返回这个枚举类里面有哪些选项。
- enum枚举就是类类型;
- 父类是Enum是一个抽象类,来自于java.lang包;
- 常用方法:
compareTo()
equals()
values()
枚举的高阶使用
1、在自定义的enum类型中可以增加属性;
2、在自定义的enum类型中可以增加行为;
3、在自定义的enum类型中可以重写从Enum中继承而来的方法
4、在自定义的enum类型中可以增加构造(完成自我阅读学习)。
记录(record) -- 了解
在JDK14当中,提供了一种新的类型叫做record(记录)。它是专门用来定义一种特殊类的“简化语法”。
什么样的特殊类呢?
专门用来存放属性值,且每个属性的值一旦确立不能修改。这种类的预设场景是在做数据传输的时候。 用传统语法做这种类的设计,写起来比较麻烦。因此专门设计了record类型的语法。
定义语法:
//这里()里面既可以称之为参数,也可以称为属性
public record 名字(书写上参数){
}
然后它自动生成带参构造,自动生成final属性,自动生成与属性名保持一致的get方法,自动重写toString()
record的本质
也是语法糖,它也是类类型,它父类是来自于java.lang.Record的抽象类。