内部类

成员内部类 & 静态内部类

  • 主要是用来弥补单继承的缺陷,补充类的功能。
  • 除了外部类都无法直接访问内部类,可以提供更好的隐蔽性。
  • 内部类定义的 private 属性外部类也不可以访问,因此对外界来说,比 private 的访问权限更小。

两者区别:主要是成员内部类不可以有任何静态的成员,并且必须先创建外部类才能创建内部类对象, 而静态内部类可以有静态或非静态的成员,且获取静态内部类对象时,不需要先创建外部类对象

局部内部类 & 匿名内部类

  • 主要是在方法执行过程中需要解决一些问题使用到的类,匿名内部类常用作回调接口进行使用, 例如调用 sort 方法时可以传入的 Comparator 接口的匿名内部类。
  • 匿名内部类由于没有类名,必须实现一个接口或继承一个类,在创建该类的时候就创建一个实例。
  • 局部内部类与匿名内部类使用方法的参数时,为了保证内部类与外部类参数数值一致,只能使用 final 修饰的不可变参数。

拷贝

浅拷贝

实现了 Clonable 接口的类的 clone 方法,实际上是浅拷贝。

  1. 基本类型:直接拷贝值。
  2. 引用类型/对象:拷贝对象的地址,即拷贝后的引用与原引用指向同一个对象。
  3. String:String 对象是不可变的,因此在拷贝后,若原引用发生改变,其实是原引用指向一个新的 String 对象。

深拷贝

  1. 当需要拷贝一份值相同但地址不同的对象时,就可以使用序列化与反序列化的方式进行对象的深拷贝。
  2. 在 Java 中,对于实现了 Serializable 的对象,可以使用 ObjectOutputStreamwriteObject 方法, 将其序列化为二进制流,并通过 ObjectInputStream readObject 方法接收并生成一个深拷贝的对象

异常体系

Error

通常是虚拟机出错,如 OutOfMemoryErrornoClassDefFoundErrorStackOverFlowError 等,通常会导致应用程序直接中断, 无法被捕获和处理。

Exception

编译期异常

  • ClassNotFoundException
  • IOException

运行时异常

  • ClassCast
  • ArrayIndexOutOfBound
  • NullPoint
  • NumberFormat

异常处理 try…catch 代码块

  • 在加载类时会在字节码中会根据 catch 抓取的异常生成一个 Exception Table 异常表,当执行 Try 代码块发生异常时, 就会和异常表中的异常进行匹配,找到匹配异常的 catch 代码块位置,并执行 catch 代码块。
  • finally 代码块会在编译时,在异常表中添加一个 all 异常,表示捕获所有异常,并且会在字节码中 Try 代码块和 Catch 代码块后都加上 finally 代码块的内容,因此 finally 代码块无论如何都会执行,常用于完成资源的释放。
  • 不要在 finally 中进行 return,首先在 finally 中进行 return 会覆盖 try 代码块中的 return,即最后执行的是 finally 块的 return 语句,可能导致程序返回值错误,另外在 finally 中进行 return,会让字节码中的 athrow 指令消失,从而无法 抛出异常。
  • 不要在 Spring 事务方法中使用 try…catch 处理异常,会导致事务回滚失效。
  • try – catch – finally 也可以使用 try – with – resources 替代,更加简洁。

本文文档

© 版权声明
评论 抢沙发

请登录后发表评论

    暂无评论内容