java基础笔记07-枚举、异常

  1. 自定义类实现枚举
  • 不需要提供set方法,因为枚举对象值通常为只读
  • 对枚举对象/属性使用final+static共同修饰,实现底层优化
  • 枚举对象名通常使用全部大写,满足常量的命名规范
  • 枚举对象根据需要,也可以有多个属性
  • 构造器私有化
  1. 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修饰
  • 使用无参构造器创建枚举对象时,实参列表和小括号都可以忽略。
  1. 枚举类常用方法
  • toString:Enum类返回的是当前对象名,子类可以重写,用于返回对象的属性信息
  • name:返回当前对象名,子类不能重写
  • ordinal:返回当前对象的位置号,默认从0开始
  • values:返回当前枚举类中的所有常量对象
  • valueOf:将字符串转换为枚举对象,要求字符串必须为已有的常量名,否则报异常
  • compareTo:比较的是ordinal的值
  1. enum细节
  • 使用enum关键字后不能继承其他类,因为会隐式继承Enum,而java是单继承机制
  • 可以实现接口:enum 类名 implements 接口1, 接口2 {}
  1. 注解
  • 被称为元数据,用于修饰解释 包、类、方法、属性、构造器、局部变量等信息
  • 不影响程序逻辑,但可以被编译或运行,相当于嵌入代码中的补充信息
  • JavaSE中,用于标记过时的功能,忽略警告等。JavaEE中用来配置应用程序等任何切面,代替Java EE中旧版所遗留的冗余代码和XML配置等。
  • @Override注解:编译器去检查是否真的重写了父类的方法,语法校验
  • @interface不是接口的关键字,是注解类,jdk5.0加入的
  • @Target是修饰注解的注解,称为元注解
  • @Deprecated 修饰某个元素,表示已经过时,但是仍可以使用,用来做版本过渡
  • @SuppressWarnings抑制警告,具体警告类型看链接
  1. 元注解(修饰注解的注解)
  • Retention //指定注解的作用范围,SOURCE,CLASS,RUNTIME
  • Target //指定注解可以在哪些地方使用
  • Documented指定注解是否在javadoc中体现
    定义为Documented的注解必须设置Retention值为RUNTIME
  • Inherited //子类会继承父类注解 ,被Inherited修饰的注解,其子类将自动具有该注解。retention取值
  1. 异常分为两大类:
  • Error:java虚拟机无法解决的问题。JVM系统内部错误、资源耗尽等
  • Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。
    • Exception分为运行时异常和编译时异常
  1. 异常体系图
    异常体系
  • 运行时异常,编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。
  • 编译时异常,是编译器要求必须处置的异常
  1. 两种异常方式:try-catch-finally和throws,若没有显示使用try-catch-finally方式,默认使用throws扔出异常。
  2. 异常细节
  • 异常如果发生,则异常后面的代码块不会执行,直接进入catch块
  • 异常没有发生,则顺序执行try的代码块,不会进入到catch
  • 希望不管是否发生异常,都执行某段代码,则使用finally代码块
  • 可以使用多个catch语句捕获异常,子类异常写在前面,父类异常写在后面。
  • 可以直接使用try-finally,相当于没有捕获异常。
  1. jdk5之前手动装箱拆箱,jdk5之后自动装箱拆箱。自动装箱底层调用的是valueOf方法
  2. 自动装箱,底层使用的是Integer.valueOf(n1);自动拆箱,底层调用n1.intValue()
  3. 三元运算符是一个整体。Object obj1 = true?new Integer(1):new Double(2.0);由于三元运算符是一个整体所以会继承优先级最高的,所以输出1.0
  4. 包装类和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);
  1. Integer i = 1; // -128到127返回的是数组里的值,对象是同一个。
  2. 只要有基本类型,比较的就是值的大小。
    String数据结构
  3. String细节
  • String实现了Serializable,可以串行化,意味着可以网络传输;
  • 实现了Comparable,说明String对象可以比较;
  • 字符串常量对象是用双引号括起的字符序列。
  • 字符使用unicode编码,一个字符占两个字节
  • String类是final类,不能被继承。
  • String中有属性private final char value[];用于存放字符串内容,赋值之后不可以修改。不可以修改的是value的地址,但是单个字符内容可以变化。
  1. 两种创建String对象的区别
String s = "hsp"; // 先从常量池查看是否有hsp的数据空间。若有,直接指向;没有,则重新创建,然后指向。s最终指向的是常量池的空间地址。
String s = new String("hsp"); // 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。若常量池中没有hsp,重新创建,若有,直接通过value指向。最终指向的是堆中的空间地址。
  1. b.intern()//返回的是常量池的地址
  2. String a = “hello” + “abc”;//编译器优化,创建了一个对象,相当于String a = “helloabc”😭字符串常量相加,看的是池)
  3. String c = a + b;解读(变量相加,是在堆中)
String a = "hello"; //创建a对象
String b = "abc"; // 创建b对象
// 1. 先创建 StringBuilder sb = new StringBuilder();
// 2. 执行 sb.append("hello")
// 3. 执行 sb.append("abc")
// 4.  String c = sb.toString()
// c 指向堆中的对象 value[] -> 常量池中的"helloabc"
String c = a + b;
  1. 尽量看源码学习!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值