Java关键字、枚举、记录

223 阅读9分钟

枚举 与 记录

作业点评

接口知识点

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文档。要求按字母顺序,把我们目前学过的所有关键字解释一遍。要求,解释的内容越详细越好。

  1. abstract 抽象 作为可选修饰符存在,可以修饰类、方法(构造不行);
  2. byte 基本数据类型 字节型 空间1个字节 整数
  3. boolean 基本数据类型 布尔型 空间不确定 值只能是true 或 false
  4. break 流程中断语句,可以中断循环(只中断一层),还可以中断switch
  5. class 类声明的关键字
  6. case switch当中的分支
  7. char 基本数据类型 字符型 空间2个字节 底层存放的是整数(字符的编码)
  8. continue 循环中专用的流程控制语句,作用是结束本次循环进入下一次
  9. default 两个作用 switch语句中代表默认分支;接口当中代表默认行为(实现了的行为)
  10. double 基本数据类型 双精度实数 空间8个字节
  11. do 在后验循环do-while循环中,作为循环代码块的起始关键字
  12. else 分支语句中代表“否则”分支的关键字
  13. extends 继承 类继承类(单) 接口继承接口(多)
  14. float 基本数据类型 单精度实数 空间4个字节
  15. final 可选修饰符 可以修饰类、变量(属性和局部变量)、方法。含义是“最终的,不变的”。所以修饰的类不能被继承;修饰的变量称为常量;修饰的方法不能被重写
  16. for 一种循环关键字,for循环用于明确知道循环次数的场景,for后面的"()"中有三个表达式,用";"隔开,表达式可以不写,但是分号必须写
  17. false 布尔类型的一个值,代表假
  18. goto 这个是Java中的保留字,所谓保留字就是把它占用了,但是还没有在语言当中应用
  19. if 分支语句中的“如果”,后面的"()"中填写判断条件(boolean类型的结果)
  20. int 基本数据类型 整型 空间4个字节
  21. import 导入包的关键字 一个类在默认的情况下只有在本类所有在包里面可以被默认认知,如果非本类所在的包都需要用import语句导入这个类。另外,先人提供的类只有java.lang包中的类不用impoort导入
  22. interface 接口类型的关键字
  23. implements 实现 类实现接口(多实现)
  24. instanceof 一种运算符 用于判断一个对象实例是否属于某个类型 得到true或false
  25. long 基本数据类型 长整型 空间8个字节
  26. new 调用构造方法产生对象的关键字
  27. null 空 引用数据类型变量的默认值,代表该变量不指向任何对象
  28. public 访问修饰符 公共 可以修饰自定义类型、属性、构造、行为
  29. private 访问修饰符 私有 可以修饰自定义类型、属性、构造、行为
  30. protected 访问修饰符 受保护的 可以修饰自定义类型、属性、构造、行为
  31. package 申明当前类型属于哪个包的关键字,在整片Java文件代码的最上方。 一个类的全名(限定名)是 “包名.类名”
  32. return 结束方法的关键 让执行流程返回方法调用处 只是当这个方法结束的时候需要返回值,那么它的后面才必须接一个值。
  33. short 基本数据类型 短整型 空间2个字节
  34. static 可选修饰符 静态 可以修饰内部类,属性,行为,初始化 。用static修饰的内容具有两个特征:与对象无关,属于类级别;类加载期有特殊操作。
  35. super 在子类中表示父类的关键字。“super.” 和 “super()”
  36. switch 分支语句的关键字,主要做多分支判断中表达式等于某几个固定值的情况。
  37. this 在子类中代表当前对象,有"this."和“this()”两种用法
  38. true boolean类型的一个固定值,代表真
  39. void 专用于定义方法没有返回值的返回类型
  40. var 声明变量类型时可以使用的统一关键字,由它声明的变量会根据后年的赋值语句,决定该变量类型到底是什么。
  41. while 两种循环的关键字 后面都是接"()",里面书写循环是否执行的判定条件,为真则进入循环,为假退出循环
  42. 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() -- 以数组的形式返回这个枚举类里面有哪些选项。

  1. enum枚举就是类类型;
  2. 父类是Enum是一个抽象类,来自于java.lang包;
  3. 常用方法:

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的抽象类。