目录
[long和int可以互转吗 ?](#long和int可以互转吗 ?)
[为什么用bigDecimal 不用double ?](#为什么用bigDecimal 不用double ?)
[基本数据类型和包装类的区别?自动装箱 / 拆箱的实现原理?可能引发的问题?](#基本数据类型和包装类的区别?自动装箱 / 拆箱的实现原理?可能引发的问题?)
[说一下 integer的缓存](#说一下 integer的缓存)
面向对象的三大特征(封装、继承、多态)分别是什么?如何实现?
重载(Overload)和重写(Override)的区别?重写的注意事项?
[接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?](#接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?)
非静态内部类可以直接访问外部方法,编译器是怎么做到的?(了解)
[final 关键字的用法?](#final 关键字的用法?)
[static 关键字的用法?](#static 关键字的用法?)
[this 和 super 关键字的区别?各自的使用场景?](#this 和 super 关键字的区别?各自的使用场景?)
• Java源代码首先被编译成字节码
解释性:
• JVM中一个方法调用计数器,当累计计数大于一定值的时候,就使用JIT进行编译生成机器码文件。否则就是用解释器进行解释执行,(字节码也是经过解释器进行解释运行的)
编译型语言和解释型语言的区别?
- 编译型语言:源码通过编译器一次性转成机器码(可执行文件),执行快,跨平台需为不同系统重新编译(如C/C++)。
- 解释型语言:源码由解释器逐行翻译执行,无需预编译,跨平台性好(装解释器即可),但执行较慢(如Python/JS)。
数据类型
八种基本的数据类型
- 数值型:整数类型(byte、short、int、long)和浮点类型(float、double)
- 字符型:char
- 布尔型:boolean
1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double)
long和int可以互转吗 ?
int转换为long是安全的
long转换为int可能会导致数据丢失或溢出。
数据类型转换方式你知道哪些?
- 自动转换(隐式):小范围类型→大范围类型(如
int→long),编译器自动完成,无数据丢失。 - 强制转换(显式):大范围类型→小范围类型(如
double→int),需手动写(目标类型),可能丢失精度(如小数截断)。 - 包装类转换:基本类型↔包装类(如
int→Integer自动装箱,Integer→int自动拆箱)。 - 字符串转换:
-
- 其他类型→字符串:
String.valueOf(123)或123+" "; - 字符串→其他类型:
Integer.parseInt("123")(需处理异常)。
- 其他类型→字符串:
类型互转会出现什么问题吗?
- 基本数据类型转换的问题
-
- 大范围转小范围,出现数据数据溢出 或者精度损失
- 对象引用转换的问题
-
-
向上转型是自动进行的,而且是安全的
class Animal {}
class Dog extends Animal {}Dog dog = new Dog();
Animal animal = dog; // 自动向上转型
-
-
-
向下转型需要手动进行,并且存在风险
Animal animal = new Animal();
Dog dog = (Dog) animal; // 运行时抛出ClassCastException
//解决方式是需要使用 instanceof 检查
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 只有确认animal是Dog的实例时才进行转型
}
-
为什么用bigDecimal 不用double ?
使用BigDecimal可以确保精确的十进制数值计算 ,避免了使用double有精度损失
基本数据类型和包装类的区别?自动装箱 / 拆箱的实现原理?可能引发的问题?
- 区别:
-
- 基本类型:8 种(byte、short、int、long、float、double、char、boolean),存储值本身,不继承
Object,在栈中分配内存(局部变量)。 - 包装类:对应 8 种基本类型的引用类型(如
Integer、Double),继承Object,可用于泛型(如List<Integer>)、集合框架,在堆中分配内存。
- 基本类型:8 种(byte、short、int、long、float、double、char、boolean),存储值本身,不继承
- 自动装箱 / 拆箱原理:
-
- 装箱:基本类型 → 包装类,通过
valueOf()方法(如Integer.valueOf(10))。 - 拆箱:包装类 → 基本类型,通过
xxxValue()方法(如integer.intValue())。
- 装箱:基本类型 → 包装类,通过
- 可能引发的问题:
-
- NPE ( 空指针异常 ) :拆箱时包装类为
null(如Integer i = null; int j = i;)。 - 缓存池问题 :
Byte、Short、Integer(-128~127)、Long、Character(0~127)有缓存池,超出范围会新建对象(如Integer a=127; Integer b=127; a==b → true;a=128; b=128 → false)。
- NPE ( 空指针异常 ) :拆箱时包装类为
Java为什么要有Integer?
- 满足集合存储需求:Java集合(如List)只能存对象,无法直接存基本类型int,需用Integer包装。
- 提供额外方法 :如
Integer.parseInt("123")(字符串转整数)、toString()(整数转字符串)。 - 支持自动装箱/拆箱 :Java自动将
int与Integer互转(如Integer a = 10自动装箱,int b = a自动拆箱),简化代码。
Integer相比int有什么优点?
- 适配集合:集合(如List)只能存对象,int无法直接存入,需用Integer包装。
- 自动转换 :支持自动装箱(
int→Integer)和拆箱(Integer→int),代码更简洁。 - 工具方法 :提供
parseInt()(字符串转int)、toString()等便捷方法。 - 缓存优化:默认缓存-128~127的Integer对象,减少重复创建(性能小优化)。
那为什么还要保留int类型?
- 性能高效 :int 是基本类型, 内存 占用小(4字节),操作无拆箱/装箱开销(直接运算),适合高频计算、大数量级场景(如数组、循环)。
- 底层适配:Java需兼容底层硬件/系统(如JVM字节码操作、本地方法调用),基本类型更贴近机器指令,减少转换成本。
说一下 integer的缓存
Integer缓存:Java对-128~127的整数预先创建Integer对象并缓存,目的是减少重复对象创建,提升性能。
面向对象
面向对象的三大特征(封装、继承、多态)分别是什么?如何实现?
- 封装 :隐藏对象内部细节,仅通过公开方法暴露接口,提高安全性和可维护性。实现:用
private修饰属性,提供public的 getter/setter 方法访问。 - 继承 :子类继承父类的属性和方法,实现代码复用。实现:用
extends关键字(Java 单继承、支持多实现接口)。 - 多态 :同一行为在不同对象上有不同表现形式,提高代码灵活性。实现:① 子类重写父类方法;② 父类引用指向子类对象(如
Animal dog = new Dog());③ 接口多实现。
多态体现在哪几个方面?

多态解决了什么问题?
允许不同对象对同一方法调用做出不同行为(如Animal的speak()方法,猫叫/狗吠不同),避免为每个类型重复写逻辑,提升代码复用性,让程序更易维护扩展。
面向对象的设计原则你知道有哪些吗

- 单一职责(SRP):一类只负责一项功能,降低复杂度。
- 开闭原则(OCP):对扩展开放,对修改关闭(通过扩展新增功能,而非改旧代码)。
- 里氏替换(LSP):子类可完全替换父类,不破坏程序逻辑。
- 接口隔离(ISP):接口细化,避免"胖接口"(只留需要的方法)。
- 依赖倒置(DIP):依赖抽象(接口/抽象类),而非具体实现,降低耦合。
- 最少知识(LoD):对象只与"朋友"交互(减少直接依赖,降低复杂度)。
- 合成复用(CRP):优先用组合(
has-a)而非继承(is-a),提高灵活性。
重载(Overload)和重写(Override)的区别?重写的注意事项?
- 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。
- 重写(Overriding)指的是子类可以重新定义父类中的方法,方法名、参数列表和返回类型必须与父类中的方法一致,通过@override注解来明确表示这是对父类方法的重写。
重写注意事项:
- 不能重写
final方法(final 方法不可继承)。 - 不能重写
static方法(静态方法属于类,不属于实例)。 - 构造方法不能重写
抽象类和普通类区别?
- 实例化:抽象类不能直接创建对象(无法
new),普通类可以。 - 方法:抽象类可包含抽象方法(无实现,子类必须重写),普通类所有方法必须有具体实现。
- 设计目的:抽象类定义公共行为/约束(供子类继承扩展),普通类是具体功能的实现。
接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?

Java 8 接口新增特性:
default方法:带方法体,子类可直接使用或重写。static方法:带方法体,通过接口名直接调用(如Collection.emptyList())。
抽象类能加final修饰吗?
不能,Java中的抽象类是用来被继承的,而final修饰符用于禁止类被继承或方法被重写
抽象类可以被实例化吗?
不能,抽象类是用来被继承的。
接口可以包含构造函数吗?
不能 ,接口不会有自己的实例的,所以不需要有构造函数。
解释Java中的静态变量和静态方法
静态变量和静态方法是与类本身关联的,而不是与类的实例(对象)关联。它们在内存中只存在一份,可以被类的所有实例共享。
非静态内部类和静态内部类的区别?
- 依赖外部实例:非静态内部类需绑定外部类实例(创建时需
外部类对象.new 内部类());静态内部类无需,可直接外部类名.内部类()创建。 - 访问权限:非静态内部类可访问外部类所有成员(包括私有);静态内部类仅能访问外部类静态成员。
- 内存风险:非静态内部类隐含持有外部类引用,可能导致内存泄漏;静态内部类无此问题。
- 用途:非静态用于需操作外部实例的场景(如回调);静态用于独立工具/逻辑(如单例内部类)。
非静态内部类可以直接访问外部方法,编译器是怎么做到的?(了解)
非静态内部类对象自动持有外部类实例的引用(编译器生成this$0字段指向外部类)。当内部类访问外部方法时,编译器将调用转换为this$0.外部方法(),通过该引用直接访问外部类的成员(包括私有方法)。
关键字
final 关键字的用法?
- 修饰类 :类不可被继承(如
String、Integer)。 - 修饰方法:方法不可被重写,可提高执行效率(JVM 可能内联优化)。
- 修饰变量:变量不可被重新赋值(基本类型:值不可变;引用类型:引用地址不可变,对象内容可修改)。
-
- 局部变量:声明时可不初始化,但使用前必须赋值。
- 成员变量:声明时必须初始化(或在构造器、静态代码块中初始化)。
static 关键字的用法?
- 静态变量( 类变量 ) :属于类,所有实例共享,存储在方法区,通过
类名.变量名访问。 - 静态方法 (类方法) :属于类,不可访问非静态成员(无
this指针),通过类名.方法名访问。 - 静态代码块:类加载时执行(仅一次),用于初始化静态变量,执行顺序优于构造方法。
- 静态内部类 :不依赖外部类实例,可直接创建,只能访问外部类的静态成员(如
HashMap.Node)。
this 和 super 关键字的区别?各自的使用场景?
