- 自定义类实现枚举
- 不需要提供set方法,因为枚举对象值通常为只读
- 对枚举对象/属性使用final+static共同修饰,实现底层优化
- 枚举对象名通常使用全部大写,满足常量的命名规范
- 枚举对象根据需要,也可以有多个属性
- 构造器私有化
- enum实现枚举
- 使用关键字enum替代class
public static final Season SPRING = new Season("春天", "温暖");
直接使用 SPRING(“春天”, “温暖”); 解读 常量名(实参列表)- 如果有多个常量(对象),用
,
隔开 - 枚举对象必须在枚举类的行首
final class Season extends java.lang.Enum<Season> {
public static final Season SPRING;
public static final Season SUMMER;
public static Season[] values();
public static Season valueOf(java.lang.String);
static {};
}
- 枚举类默认继承Enum类,类使用final修饰
- 使用无参构造器创建枚举对象时,实参列表和小括号都可以忽略。
- 枚举类常用方法
- toString:Enum类返回的是当前对象名,子类可以重写,用于返回对象的属性信息
- name:返回当前对象名,子类不能重写
- ordinal:返回当前对象的位置号,默认从0开始
- values:返回当前枚举类中的所有常量对象
- valueOf:将字符串转换为枚举对象,要求字符串必须为已有的常量名,否则报异常
- compareTo:比较的是ordinal的值
- enum细节
- 使用enum关键字后不能继承其他类,因为会隐式继承Enum,而java是单继承机制
- 可以实现接口:enum 类名 implements 接口1, 接口2 {}
- 注解
- 被称为元数据,用于修饰解释 包、类、方法、属性、构造器、局部变量等信息
- 不影响程序逻辑,但可以被编译或运行,相当于嵌入代码中的补充信息
- JavaSE中,用于标记过时的功能,忽略警告等。JavaEE中用来配置应用程序等任何切面,代替Java EE中旧版所遗留的冗余代码和XML配置等。
- @Override注解:编译器去检查是否真的重写了父类的方法,语法校验
- @interface不是接口的关键字,是注解类,jdk5.0加入的
- @Target是修饰注解的注解,称为元注解
- @Deprecated 修饰某个元素,表示已经过时,但是仍可以使用,用来做版本过渡
- @SuppressWarnings抑制警告,具体警告类型看链接
- 元注解(修饰注解的注解)
- Retention //指定注解的作用范围,SOURCE,CLASS,RUNTIME
- Target //指定注解可以在哪些地方使用
- Documented指定注解是否在javadoc中体现
定义为Documented的注解必须设置Retention值为RUNTIME - Inherited //子类会继承父类注解 ,被Inherited修饰的注解,其子类将自动具有该注解。

- 异常分为两大类:
- Error:java虚拟机无法解决的问题。JVM系统内部错误、资源耗尽等
- Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。
- 异常体系图

- 运行时异常,编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。
- 编译时异常,是编译器要求必须处置的异常
- 两种异常方式:try-catch-finally和throws,若没有显示使用try-catch-finally方式,默认使用throws扔出异常。
- 异常细节
- 异常如果发生,则异常后面的代码块不会执行,直接进入catch块
- 异常没有发生,则顺序执行try的代码块,不会进入到catch
- 希望不管是否发生异常,都执行某段代码,则使用finally代码块
- 可以使用多个catch语句捕获异常,子类异常写在前面,父类异常写在后面。
- 可以直接使用try-finally,相当于没有捕获异常。
- jdk5之前手动装箱拆箱,jdk5之后自动装箱拆箱。自动装箱底层调用的是valueOf方法
- 自动装箱,底层使用的是Integer.valueOf(n1);自动拆箱,底层调用n1.intValue()
- 三元运算符是一个整体。
Object obj1 = true?new Integer(1):new Double(2.0);
由于三元运算符是一个整体所以会继承优先级最高的,所以输出1.0 - 包装类和String类的转换
包装类 -> String
Integer i = 100;
// 方式1
String s = i + "";
// 方式2
String s = i.toString();
// 方式3
String s = String.valueOf(i);
-----------------------
String -> 包装类
String s = "12345";
// 方式1
Integer i = Integer.parseInt(s);
// 方式2
Integer i = new Integer(s);
- Integer i = 1; // -128到127返回的是数组里的值,对象是同一个。
- 只要有基本类型,比较的就是值的大小。

- String细节
- String实现了Serializable,可以串行化,意味着可以网络传输;
- 实现了Comparable,说明String对象可以比较;
- 字符串常量对象是用双引号括起的字符序列。
- 字符使用unicode编码,一个字符占两个字节
- String类是final类,不能被继承。
- String中有属性private final char value[];用于存放字符串内容,赋值之后不可以修改。不可以修改的是value的地址,但是单个字符内容可以变化。
- 两种创建String对象的区别
String s = "hsp";
String s = new String("hsp");
- b.intern()//返回的是常量池的地址
- String a = “hello” + “abc”;//编译器优化,创建了一个对象,相当于String a = “helloabc”😭字符串常量相加,看的是池)
- String c = a + b;解读(变量相加,是在堆中)
String a = "hello";
String b = "abc";
String c = a + b;
- 尽量看源码学习!