1、访问修饰符之间的区别
当问及访问修饰符的时候,要马上想它们能覆盖的四种范围,由小到大是:本类、同包、子包、其他包。再从访问修饰符的覆盖范围由小到大进行说明:
private:本类
protected:本类以及同包
default(不写修饰符时):本类、同包、子包
public:本类、同包、子包、其他包
2、深拷贝和浅拷贝区别是什么
区别在于对于引用类型的复制:
浅拷贝:对于 基本数据类型 直接复制数据值;对于 引用数据类型 复制它的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。
深拷贝:对于 基础数据类型 直接复制数据值;对于 引用数据类型 开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。
深拷贝相比于浅拷贝速度较慢并且花销较大。
3、关于父类子类初始化问题
静态变量只会初始化(执行)一次。
当有父类时,完整的初始化顺序为:父类静态变量(静态代码块)->子类静态变量(静态代码块)->父类非静态变量(非静态代码块)->父类构造器 ->子类非静态变量(非静态代码块)->子类构造器 。
要记住在这里面构造器是最后完成初始化的。
4、编译时多态和运行时多态
多态分为两种情况:编译时多态和运行时多态。如果在编译时能够确定执行多态方法
中的哪一个,称为编译时多态,否则称为运行时多态。
参考文章:(16条消息) Java 编译时多态和运行时多态_若明天不见-优快云博客_java运行时多态和编译时多态
5、抽象类(abstract class)和接口(interface)有什么区别
继承:抽象类只能单继承,接口可以多“继承”(一个类可以实现多个接口)。
有无构造方法:抽象类可以有构造方法,接口中不能有构造方法。
有无成员变量:抽象类中可以有成员变量,接口中没有成员变量,只能有常量(默认就是 public static final)
修饰符:抽象类中的抽象方法类型可以是任意修饰符,Java 8 之前接口中的方法只能是 public 类型,Java 9 支持 private 类型。
抽象类中可以包含非抽象的方法,在 Java 7 之前接口中的所有方法都是抽象的,在 Java 8 之后,接口支持非抽象方法:default 方法、静态方法等。Java 9 支持私有方法、私有静态方法。
设计思想的区别:
接口是自上而下的抽象过程,接口规范了某些行为,是对某一行为的抽象。我需要这个行为,我就去实现某个接口,但是具体这个行为怎么实现,完全由自己决定。
抽象类是自下而上的抽象过程,抽象类提供了通用实现,是对某一类事物的抽象。我们在写实现类的时候,发现某些实现类具有几乎相同的实现,因此我们将这些相同的实现抽取出来成为抽象类,然后如果有一些差异点,则可以提供抽象方法来支持自定义实现。
有一个形象的比方:
普通类像亲爹 ,他有啥都是你的。
抽象类像叔伯,有一部分会给你,还能指导你做事的方法。
接口像干爹,可以给你指引方法,但是做成啥样得你自己努力实现。
6、Error 和 Exception 有什么区别
Error(错误)和 Exception(异常)都是 java.lang.Throwable 类的子类,在 Java 代码中只有继承了 Throwable 类的实例才能被 throw 或者 catch。
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类,Exception 是程序正常运行过程中可以预料到的意外情况,并且应该被开发者捕获,进行相应的处理。Error 是指正常情况下不大可能出现的情况,绝大部分的 Error 都会导致程序处于非正常、不可恢复状态。所以不需要被开发者捕获。
Error 错误是任何处理技术都无法恢复的情况,肯定会导致程序非正常终止。并且 Error 错误属于未检查类型,大多数发生在运行时。Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。不检查异常就是所谓的运行时异常,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。
以下是常见的 Error 和 Exception:
1)运行时异常(RuntimeException):
- NullPropagation:空指针异常;
- ClassCastException:类型强制转换异常
- IllegalArgumentException:传递非法参数异常
- IndexOutOfBoundsException:下标越界异常
- NumberFormatException:数字格式异常
- ConcurrentModificationException的异常:并发修改异常
2)非运行时异常:
- ClassNotFoundException:找不到指定 class 的异常
- IOException:IO 操作异常
3)错误(Error):
- NoClassDefFoundError:找不到 class 定义异常
- StackOverflowError:深递归导致栈被耗尽而抛出的异常
- OutOfMemoryError:内存溢出异常
文章主要参考:(16条消息) Java 基础高频面试题(2021年最新版)_程序员囧辉-优快云博客_java基础知识面试并加上了自己的理解以及其他大佬的见解