Java回炉学习(四)
1. 枚举类
- 构造器私有化
- 本类内部创建一组对象[四个 春夏秋冬]
- 对外暴露对象[通过对象添加public final static修饰符底层优化]
- 提供get方法,不提供set方法
2. enum关键字实现枚举
- 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类
- 传统的public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成SPRING(“春天”, “温暖”), 这里必须知道,它调用的是哪个构造器.
- 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
- 当有多个枚举对象时,使用,间隔,最后有一个分号结尾
- 枚举对象必须放在枚举类的行首.
3. enum常用方法
- toString:Enum 类已经重写过了,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息
- name:返回当前对象名(常量名),子类中不能重写
- ordinal:返回当前对象的位置号,默认从 0 开始
- values:返回当前枚举类中所有的常量
- valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
- compareTo:比较两个枚举常量,比较的就是编号!
4. 注解的理解
- 注解(Annotation)也被称为元数据,用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
- 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
- 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等忽略警告等
- 三个基本的 Annotation:
- @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
- @SuppressWarnings: 抑制编译器警告
5. @Override使用说明
- **@Override表示指定重写父类的方法(从编译层面验证) **,如果父类没有fly方法,则会报错
- 如果不写@Override注解,而父类仍有public void fly(){},仍然构成重写
- @Override只能修饰方法,不能修饰其它类,包,属性等等
- 查看@Override注解源码为@ Target(ElementType.METHOD),说明只能修饰方法
- @Target是修饰注解的注解,称为元注解, 记住这个概念.
6. @Deprecated的说明
- 用于表示某个程序元素(类,方法等)已过时
- 可以修饰方法,类,宇段,包,参数等等
- @Target(value= {CONSTRUCTOR, FIELD, LOCAL VARIABLE, METHOD,PACKAGE, PARAMETER, TYPE})
- @Deprecated的作用可以做到新旧版本的兼容和过渡.
- @Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。
- 被它修饰的Annotation将具有继承性如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解
7. 常见运行时异常
- NullPointerException 空指针异常
- ArithmeticException 数学运算异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ClassCastException 类型转换异常
- NumberFormatException 数字格式不正确异常
8. 常见编译异常
- try-catch-finally 程序员在代码中捕获发生的异常,自行处理
- throws 将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
9. try-catch方式处理异常
- 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则使用如下代码- finally { }
- 可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception 在后,NullPointerException 在前),如果发生异常,只会匹配一个catch
- 可以进行try-finally 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一-段代码,不管是否发生异常,都必须执行某个业务逻辑
- 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally, 最后还需要执行finally里面的语句!
10 .throws异常处理
- 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
- 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
- 对于编译异常,程序中必须处理,比如try-catch或者throws
- 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
- 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
- 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
11. 自定义异常
-
当程序中出现了某些"错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
-
自定义异常类继承Exception或RuntimeException,若继承Exception则属于编译异常,若继承RuntimeException,则属于运行异常
-
throw和throws的区别