一,枚举
1.定义枚举
(1)格式:修饰符 enum 枚举类名{枚举值1,枚举值2...}
(2)注意事项:枚举值书写规范是全部字母大写
2.使用枚举:枚举类名.枚举值
3.枚举的作用:一般用来表示只有几个固定值的类,例如性别类,只有男和女两个值
4.枚举的本质
(1)枚举的本质是一个特殊的最终类,不可以被继承
(2)枚举值就是枚举类的对象
(3)枚举类继承了java.Enum类
5.拓展
(1)枚举类用的是多例设计模式
(2)使用枚举类可以很简单的实现单例设计模式,在枚举类里只设置一个对象即可
二,泛型
1.泛型的本质:定义类,接口,方法时,同时声明一个或者多个表示未知类型的变量,这些表示未知类型的变量被称为泛型
2.泛型的作用:在编译阶段可以避免出现一些非法数据,也可以避免强制类型转换及其可能出现的异常
3.注意事项
(1)泛型擦除:泛型只存在于编译阶段,编译后的字节码文件不存在泛型
(2)泛型只能用于引用类型
(3)泛型没有多态
4.泛型的应用
(1)自定义泛型类:修饰符 class 类名 <类型变量,类型变量...>{}
(2)自定义泛型接口:修饰符 interface 接口名 <类型变量,类型变量...>{}
(3)自定义泛型方法:修饰符 <类型变量,类型变量....> 返回值类型 方法名(形参列表){}
5.泛型限定
(1)泛型通配符<?>:表示任何类型
(2)泛型上限<? extends 数据类型>:表示指定数据类型或者它的子类
(3)泛型下限<? super 数据类型>:表示指定数据类型或者它的父类
三,异常
1.异常的本质:异常就是代表程序出现的问题
2.异常的代表Exception
(1)运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时可能会出现的异常
(2)编译时异常:非RuntimeException及其子类,编译阶段会出现错误提醒,运行时可能会出现的异常
3.异常的处理
(1)声明处理异常:在方法上使用throw关键字,可以将方法内部出现的异常跑出去给调用者处理
(2)捕获异常:直接捕获程序出现的异常
4.finally关键字:正常情况下,finally代码块中的代码永远会执行
5.异常产生的原理:产生异常,就会创建异常对象,封装异常信息,然后通过throw抛出异常
四,常用的API
1.Object类中的
(1)toString()
①基本作用:返回对象的字符串类型
②存在的意义:让子类重写,以便返回子类对象的内容
③注意事项:
Ⅰ:如果开发中打印对象的时候不希望打印的是地址值,需要重写toString方法
Ⅱ:开发中,打印对象一般希望打印的是该对象的所有属性值
(2)equals
①基本作用:默认是比较两个对象的地址值是否相等
②存在的意义:让子类重写,以便于比较对象的内容是否相同
③注意事项:
Ⅰ:Object类中的equals方法默认比较的是两个对象的地址值
Ⅱ:在开发中,如果两个同类型的对象所有属性值相同,往往认为这个是两个相同的对象
(3)clone:复制出一个一模一样的对象出来
①浅克隆:拷贝出的新对象,与原对象的数据一模一样(引用类型拷贝的只是地址)
②深克隆
Ⅰ:对象中的基本类型直接拷贝
Ⅱ:对象中的字符串数据拷贝的还是地址值
Ⅲ:对象中包含的其他对象,不会拷贝地址值,而是创建一个新的对象
2.Objects中的equals:Objects中也有equals方法,可以避免空指针异常,更加安全
3.包装类
(1)装箱和拆箱
①自动装箱:基本数据类型可以自动转换成包装类型
②自动拆箱:包装类型可以自动转换成基本数据类型
(2)基本类型与字符串的转换
①基本类型转换成字符串:基本类型数据+”“
②字符串转换成基本类型:public static int parseInt(String s)
4.StringBuilder/StringBuffer
(1)本质:代表的是可变字符串对象,相当于一个容器,它里面封装的字符串是可变的,就是用来操作字符串的
(2)好处:比String更适合做字符串的修改操作,效果会更好,代码也会更简洁
(3)不同:StringBuilder是线程不安全的 StringBuffer是线程安全的
(4)注意:如果操作字符串较少,或者不需要操作,以及定义字符串时,则用String
5.Stringjoiner
(1)本质:和StringBuilder/StringBuffer,代表的是可变字符串对象
(2)好处:不仅能提高字符串的操作效率,并且在有些场景中使用它操作字符串,代码会更简洁,适合拼接字符串内容
(3)弊端:add方法只能拼接实现类的对象