面试题整理:Java基础
1、构造器 Constructor 是否可被 override?
Constructor 不能被 override(重写), 但是可以 overload(重载), 所以你可以看到一个类中有多个构造函数的情况。
2、Java 面向对象编程三大特性
- 封装:把一个对象的属性私有化, 同时提供一些可以被外界访问的属性的方法, 如果属性不想被外界访问, 可不必提供方法给外界访问。
- 继承:在一个类的基础上创建一个新的类,称为子类,原类为父类; 子类拥有父类的所有属性和方法,也可以扩展新增自己的属性和方法。
- 多态:1、编译时多态(重载),运行时多态(重写,通常所说的多态)。2、就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。3、在 Java 中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
3、String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
String 类中使用 final 关键字修饰字符数组来保存字符串, private final char value[] ,所以 String 对象是不可变的。
而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
4、接口和抽象类的区别是什么?
- 接口方法都是抽象方法,在接口中不能有实现; 抽象类可以有非抽象方法。
- 接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
- 一个类可以实现多个接口,但只能继承一个抽象类。
- 接口的方法默认修饰符是public,抽象方法可以有public、protected和default这些符号。(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)
- 抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范。
- 在 jdk 7 或更早版本中,接口里面只能有常量变量和抽象方法。这些接口方法必须由选择实
现接口的类实现。
- jdk 8 的时候接口可以有默认方法和静态方法功能。
- Jdk 9 在接口中引入了私有方法和私有静态方法。
5、==与equals与hashCode
- == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
- equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况: 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
- hashCode:作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置,所以只在用于哈希表时hashCode才有用。
为什么重写 equals 时必须重写 hashCode 方法?
在用于哈希表时,必须保证:如果两个对象相等,则 hashcode 一定也是相同的。否则会导致相同的对象在哈希表中重复出现,equals似乎没有起作用。
6、线程有哪些基本状态?
Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态:

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换:

7、异常类层次结构图

1、在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。 Throwable 类有两个重要的子类 Exception (异常)和 Error (错误)。 Exception 能被程序本身处理( try-catch ), Error 是无法处理的(只能尽量避免):
- Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获。 Exception 又可以分为 受检查异常(必须处理) 和 不受检查异常(可以不处理)。
- Error : Error 属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获 。例如,Java 虚拟机运行错误( Virtual MachineError )、虚拟机内存不够错误( OutOfMemoryError )、类定义错误( NoClassDefFoundError )等 。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
2、受检查异常和不受检查异常:
- 受检异常:Java 代码在编译过程中,如果受检查异常没有被 catch / throw 处理的话,就没办法通过编译。除了RuntimeException 及其子类以外,其他的 Exception 类及其子类都属于检查异常 。常?的受检查异常有: IO 相关的异常、 ClassNotFoundException 、 SQLException ...。
- 不受检异常:Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。RuntimeException 及其子类都统称为非受检查异常,例如: NullPointExecrption 、 NumberFormatException (字符串转换为数字)、 ArrayIndexOutOfBoundsException (数组越界)、 ClassCastException (类型转换错误)、 ArithmeticException (算术错误)等。
8、深拷贝和浅拷贝
- 浅拷?:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷?,此为浅拷?。
- 深拷?:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷?。
Java基础
原文:https://www.cnblogs.com/151it/p/15129680.html