GitHub:https://github.com/JDawnF
声明:题目大部分来源于Java后端公众号,有些个人整理,但答案皆为个人整理,仅供参考。
目录
Exception、Error、运行时异常与一般异常有何异同
String、StringBuilder、StringBuffer
什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
Object类中常见的方法,为什么wait notify会放在Object里边?
-
Java中有几种基本数据类型,各占几个字节?
-
面向对象的特征:继承、封装和多态
- 继承:多个类具有共同的属性(成员变量)与行为(成员方法)的时候,将这些共同的部分抽取出来定义到一个公共的类中,其他及各类可以与这个公共的类形成继承关系,从而在多个类中不需要重 复定义公共部分!这个公共的类就是父类,也称为超类或者基类,其他的类就是子类。子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.get()方法。
- 封装:所谓封装指的是隐藏对象的属性以及实现细节,仅对外提供访问方式,将不需要对外提供的内容进行隐藏,把属性隐藏对外提供访问方式。使用private修饰。
- 多态: java程序中定义的引用变量所指向的具体类型和通过该引用类型发出的方法在调用时不确定,该引用变量发出的方法到底调用哪个类的实现的方法,必须在程序运行期间才能决定。
- 多态的成员特点:成员变量:编译与运行时期都看父类!
成员方法:编译时期看父类,运行时期看子类
- 多态的成员特点:成员变量:编译与运行时期都看父类!
-
final, finally, finalize 的区别
- final:Java的关键字之一,被final修饰的类不能被继承,所以要注意一个类不能被abstract和final同时修饰;被final修饰的变量不能被修改,所以一开始要先赋值。当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的。
- finally:捕获异常中的finally模块,不管有没有异常被抛出、捕获,finally块都会被执行。
-
finally什么时候会被执行:
- 在try...catch...finally语句中,只要try语句之前程序没有抛异常,或者在try语句中程序没有退出(System.exit(0))的话,就会执行;
- 加入try语句中有return语句,那么会先执行finally语句中的内容,因为如果执行了return语句程序就会结束退出;
- 此外,要注意方法内部的变量都是存放在栈里面,函数执行结束后,其对应的栈会被回收,那么方法体中定义的变量也就不存在了,所以return语句实际上是拷贝了一份值,然后再返回的。所以在finally中如果有return语句的话,对基本类型的值不影响,但是对引用类型的值就会有影响。
-
- finalize:这是Object类中的一个方法,在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,它与析构函数不同。
-
Exception、Error、运行时异常与一般异常有何异同
- Exception:分为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。
IOException(其他异常)
FileNotFoundException(文件未找到异常。)
IOException(操作输入流和输出流时可能出现的异常。)
EOFException (文件已结束异常) - Error:描述了java运行时系统的内部错误和资源耗尽错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。应用程序不应该抛出这种类型的对象。
- 运行时异常:对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
-
Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显示地进行捕获处理,这是编译期检查的一部分。Error,是 Throwable 不是 Exception。不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
-
粉色的异常是需要被抛出的。
- Exception:分为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。
-
请写出5种常见到的runtime exception
- IndexOutOfBoundsException(下标越界异常)
- NullPointerException(空指针异常)
- NumberFormatException (String转换为指定的数字类型异常)
- ArithmeticException -(算术运算异常 如除数为0)
- ArrayStoreException - (向数组中存放与声明类型不兼容对象异常)
- SecurityException -(安全异常)
-
int 和 Integer 有什么区别,Integer的值缓存范围
- Integer是int的包装类;int是基本数据类型;
- Integer变量必须实例化后才能使用;int变量不需要;
- Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
- Integer的默认值是null;int的默认值是0。
- 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
- Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
- 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
- 对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
- 深入描述
-
public class Test { public static void main(String[] args) { //在-128~127 之外的数 Integer num1 = 128; Integer num2 = 128; System.out.println(num1==num2); //false // 在-128~127 之内的数 Integer num3 = 9; Integer num4 = 9; System.out.println(num3==num4); //true } }
解析原因:归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。
加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。
而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。 -
https://blog.csdn.net/why15732625998/article/details/79437930#commentBox
-
- 源码分析:
- 给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,源码如下:
-
public static Integer valueOf(String s, int radix) throws NumberFormatException { return Integer.valueOf(parseInt(s,radix)); } public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
- Integ