Java SE核心面试题总结——day 01

目录

编译型语言和解释型语言的区别?

数据类型

八种基本的数据类型

[long和int可以互转吗 ?](#long和int可以互转吗 ?)

数据类型转换方式你知道哪些?

类型互转会出现什么问题吗?

[为什么用bigDecimal 不用double ?](#为什么用bigDecimal 不用double ?)

[基本数据类型和包装类的区别?自动装箱 / 拆箱的实现原理?可能引发的问题?](#基本数据类型和包装类的区别?自动装箱 / 拆箱的实现原理?可能引发的问题?)

Java为什么要有Integer?

Integer相比int有什么优点?

那为什么还要保留int类型?

[说一下 integer的缓存](#说一下 integer的缓存)

面向对象

面向对象的三大特征(封装、继承、多态)分别是什么?如何实现?

多态体现在哪几个方面?

多态解决了什么问题?

面向对象的设计原则你知道有哪些吗

重载(Overload)和重写(Override)的区别?重写的注意事项?

抽象类和普通类区别?

[接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?](#接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?)

抽象类能加final修饰吗?

抽象类可以被实例化吗?

接口可以包含构造函数吗?

解释Java中的静态变量和静态方法

非静态内部类和静态内部类的区别?

非静态内部类可以直接访问外部方法,编译器是怎么做到的?(了解)

关键字

[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可能会导致数据丢失或溢出

数据类型转换方式你知道哪些?

  1. 自动转换(隐式):小范围类型→大范围类型(如int→long),编译器自动完成,无数据丢失。
  2. 强制转换(显式):大范围类型→小范围类型(如double→int),需手动写(目标类型),可能丢失精度(如小数截断)。
  3. 包装类转换:基本类型↔包装类(如int→Integer自动装箱,Integer→int自动拆箱)。
  4. 字符串转换:
    1. 其他类型→字符串:String.valueOf(123)123+" "
    2. 字符串→其他类型: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 种基本类型的引用类型(如IntegerDouble),继承Object,可用于泛型(如List<Integer>)、集合框架,在堆中分配内存。
  • 自动装箱 / 拆箱原理
    • 装箱:基本类型 → 包装类,通过valueOf()方法(如Integer.valueOf(10))。
    • 拆箱:包装类 → 基本类型,通过xxxValue()方法(如integer.intValue())。
  • 可能引发的问题
    • NPE 空指针异常 :拆箱时包装类为null(如Integer i = null; int j = i;)。
    • 缓存池问题ByteShortInteger(-128~127)、LongCharacter(0~127)有缓存池,超出范围会新建对象(如Integer a=127; Integer b=127; a==b → truea=128; b=128 → false)。

Java为什么要有Integer?

  1. 满足集合存储需求:Java集合(如List)只能存对象,无法直接存基本类型int,需用Integer包装。
  2. 提供额外方法 :如Integer.parseInt("123")(字符串转整数)、toString()(整数转字符串)。
  3. 支持自动装箱/拆箱 :Java自动将intInteger互转(如Integer a = 10自动装箱,int b = a自动拆箱),简化代码。

Integer相比int有什么优点?

  1. 适配集合:集合(如List)只能存对象,int无法直接存入,需用Integer包装。
  2. 自动转换 :支持自动装箱(int→Integer)和拆箱(Integer→int),代码更简洁。
  3. 工具方法 :提供parseInt()(字符串转int)、toString()等便捷方法。
  4. 缓存优化:默认缓存-128~127的Integer对象,减少重复创建(性能小优化)。

那为什么还要保留int类型?

  1. 性能高效int 是基本类型, 内存 占用小(4字节),操作无拆箱/装箱开销(直接运算),适合高频计算、大数量级场景(如数组、循环)。
  2. 底层适配:Java需兼容底层硬件/系统(如JVM字节码操作、本地方法调用),基本类型更贴近机器指令,减少转换成本。

说一下 integer的缓存

Integer缓存:Java对-128~127的整数预先创建Integer对象并缓存,目的是减少重复对象创建,提升性能。

面向对象

面向对象的三大特征(封装、继承、多态)分别是什么?如何实现?

  • 封装 :隐藏对象内部细节,仅通过公开方法暴露接口,提高安全性和可维护性。实现:用private修饰属性,提供public的 getter/setter 方法访问。
  • 继承 :子类继承父类的属性和方法,实现代码复用。实现:用extends关键字(Java 单继承、支持多实现接口)。
  • 多态 :同一行为在不同对象上有不同表现形式,提高代码灵活性。实现:① 子类重写父类方法;② 父类引用指向子类对象(如Animal dog = new Dog());③ 接口多实现。

多态体现在哪几个方面?

多态解决了什么问题?

允许不同对象对同一方法调用做出不同行为(如Animalspeak()方法,猫叫/狗吠不同),避免为每个类型重复写逻辑,提升代码复用性,让程序更易维护扩展。

面向对象的设计原则你知道有哪些吗

  1. 单一职责(SRP):一类只负责一项功能,降低复杂度。
  2. 开闭原则(OCP):对扩展开放,对修改关闭(通过扩展新增功能,而非改旧代码)。
  3. 里氏替换(LSP):子类可完全替换父类,不破坏程序逻辑。
  4. 接口隔离(ISP):接口细化,避免"胖接口"(只留需要的方法)。
  5. 依赖倒置(DIP):依赖抽象(接口/抽象类),而非具体实现,降低耦合。
  6. 最少知识(LoD):对象只与"朋友"交互(减少直接依赖,降低复杂度)。
  7. 合成复用(CRP):优先用组合(has-a)而非继承(is-a),提高灵活性。

重载(Overload)和重写(Override)的区别?重写的注意事项?

  • 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。
  • 重写(Overriding)指的是子类可以重新定义父类中的方法,方法名、参数列表和返回类型必须与父类中的方法一致,通过@override注解来明确表示这是对父类方法的重写。

重写注意事项

  • 不能重写final方法(final 方法不可继承)。
  • 不能重写static方法(静态方法属于类,不属于实例)。
  • 构造方法不能重写

抽象类和普通类区别?

  1. 实例化:抽象类不能直接创建对象(无法new),普通类可以。
  2. 方法:抽象类可包含抽象方法(无实现,子类必须重写),普通类所有方法必须有具体实现。
  3. 设计目的:抽象类定义公共行为/约束(供子类继承扩展),普通类是具体功能的实现。

接口(Interface)和抽象类(Abstract Class)的区别?Java 8 中接口新增了什么特性?

Java 8 接口新增特性

  • default方法:带方法体,子类可直接使用或重写。
  • static方法:带方法体,通过接口名直接调用(如Collection.emptyList())。

抽象类能加final修饰吗?

不能,Java中的抽象类是用来被继承的,而final修饰符用于禁止类被继承或方法被重写

抽象类可以被实例化吗?

不能,抽象类是用来被继承的。

接口可以包含构造函数吗?

不能接口不会有自己的实例的,所以不需要有构造函数。

解释Java中的静态变量和静态方法

静态变量和静态方法是与类本身关联的,而不是与类的实例(对象)关联。它们在内存中只存在一份,可以被类的所有实例共享。

非静态内部类和静态内部类的区别?

  1. 依赖外部实例:非静态内部类需绑定外部类实例(创建时需外部类对象.new 内部类());静态内部类无需,可直接外部类名.内部类()创建。
  2. 访问权限:非静态内部类可访问外部类所有成员(包括私有);静态内部类仅能访问外部类静态成员。
  3. 内存风险:非静态内部类隐含持有外部类引用,可能导致内存泄漏;静态内部类无此问题。
  4. 用途:非静态用于需操作外部实例的场景(如回调);静态用于独立工具/逻辑(如单例内部类)。

非静态内部类可以直接访问外部方法,编译器是怎么做到的?(了解)

非静态内部类对象自动持有外部类实例的引用(编译器生成this$0字段指向外部类)。当内部类访问外部方法时,编译器将调用转换为this$0.外部方法(),通过该引用直接访问外部类的成员(包括私有方法)。

关键字

final 关键字的用法?

  • 修饰类 :类不可被继承(如StringInteger)。
  • 修饰方法:方法不可被重写,可提高执行效率(JVM 可能内联优化)。
  • 修饰变量:变量不可被重新赋值(基本类型:值不可变;引用类型:引用地址不可变,对象内容可修改)。
    • 局部变量:声明时可不初始化,但使用前必须赋值。
    • 成员变量:声明时必须初始化(或在构造器、静态代码块中初始化)。

static 关键字的用法?

  • 静态变量( 类变量 :属于类,所有实例共享,存储在方法区,通过类名.变量名访问。
  • 静态方法 (类方法) :属于类,不可访问非静态成员(无this指针),通过类名.方法名访问。
  • 静态代码块:类加载时执行(仅一次),用于初始化静态变量,执行顺序优于构造方法。
  • 静态内部类 :不依赖外部类实例,可直接创建,只能访问外部类的静态成员(如HashMap.Node)。

this 和 super 关键字的区别?各自的使用场景?

相关推荐
2021_fc2 小时前
Flink入门指南:使用Java构建第一个Flink应用
java·大数据·flink
Java开发追求者2 小时前
vscode导入springboot项目
java·ide·spring boot·vscode
麦烤楽鸡翅2 小时前
坚持60s (攻防世界)
java·网络安全·jar·ctf·misc·反编译·攻防世界
少废话h3 小时前
Flume Kafka源与汇的topic覆盖问题解决
java·linux·kafka·flume
激动的兔子3 小时前
Geoserver修行记-连接瀚高数据库显示java.sql.SQLException: org.postgresql.util.PSQLException
java·geoserver·瀚高数据库
一 乐3 小时前
健康打卡|健康管理|基于java+vue+的学生健康打卡系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·spring boot·微信小程序
ghie90903 小时前
使用Java实现用户的注册和登录流程
java·数据库·oracle
颜如玉4 小时前
动态拼接SQL实践备忘📝
java·sql·mybatis
952364 小时前
数据结构-堆
java·数据结构·学习·算法