提纲:

基础八股知识🔥

  • 内部类

    • 成员内部类 & 静态内部类

    • 局部内部类 & 匿名内部类

  • 拷贝

    • 浅拷贝

    • 深拷贝

  • 异常体系

    • Error

    • Exception

    • 异常处理 try...catch 代码块

面试八股真题🎈

  • 1、面向对象和面向过程的区别

  • 2、标识符的命名规则

  • 3、final有哪些用法

  • 4、static都有哪些用法

  • 5、try catch finally,try里有return,finally还执行么

  • 6、Excption与Error包结构

  • 7、OOM你遇到过哪些情况,SOF你遇到过哪些情况

一、基础八股知识点

1. 内部类

  • 成员内部类 & 静态内部类

    • 主要是用来弥补单继承的缺陷,补充类的功能

    • 除了外部类都无法直接访问内部类,可以提供更好的隐蔽性

    • 内部类定义的 private 属性外部类也不可以访问,因此对外界来说,比 private 的访问权限更小

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

  • 局部内部类 & 匿名内部类

    • 主要是在方法执行过程中需要解决一些问题使用到的类,匿名内部类常用作回调接口进行使用,例如调用 sort 方法时可以传入的 Comparator 接口的匿名内部类

    • 匿名内部类由于没有类名,必须实现一个接口或继承一个类,在创建该类的时候就创建一个实例

    • 局部内部类与匿名内部类使用方法的参数时,为了保证内部类与外部类参数数值一致,只能使用final修饰的不可变参数

2. 拷贝

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

    • 基本类型:直接拷贝值

    • 引用类型/对象:拷贝对象的地址,即拷贝后的引用与原引用指向同一个对象

    • String:String 对象是不可变的,因此在拷贝后,若原引用发生改变,其实是原引用指向一个新的 String 对象

  • 深拷贝

    • 当需要拷贝一份值相同但地址不同的对象时,就可以使用序列化与反序列化的方式进行对象的深拷贝

    • 在 Java 中,对于实现了 Serializable 的对象,可以使用 ObjectOutputStream 的 writeObject 方法,将其序列化为二进制流,并通过 ObjectInputStream 的 readObject 方法接收并生成一个深拷贝的对象

3. 异常体系

  • Error

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

  • 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 替代,更加简洁

二、面试八股真题🎈🎈🎈

1、面向对象和面向过程的区别

  • 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地