Java基础面试题

发布于:2025-09-01 ⋅ 阅读:(12) ⋅ 点赞:(0)

记录、交流、实践,让每一份付出皆可看见,让你我共同前行😁

java中的序列化和反序列化

【Q】:java中的序列化和反序列化

【A】:

  1. 序列化:将对象转化为字节流,方便网络传输,数据持久化和缓存。实现了java.io.Serializable里面的Serializable接口。里面的ObjectOutputStream为序列化。
  2. 反序列化:将字节流转化为对象。ObjectInputStream为反序列化。将JVM里面“立体“的对象,压缩成扁平的二进制信息。
  3. 反序列化需要进行验证码,避免加载不安全的类或执行不安全的代码,要避免反序列化漏洞。

Java中的Exception和Error

【Q】: Java中的Exception和Error

【A】:

  1. ExceptionError都是Throwable的子类,只有继承了Throwable的类才可以被throw或try。
  2. Exception是程序可以处理的异常,分为Checked Execption(编译时异常)和Unchecked Exception(运行时异常)。
  3. Error是错误,通常是JVM层次内系统级的,无法预料的错误,程序无法通过代码进行处理或回复,如内存耗尽和栈溢出。

Java的优势

【Q】:Java的优势

【A】:

  1. 跨平台,java里面添加了一层JVM,编译过程将Java源代码编译成字节流,字节码再由JVM解释或JIT编译执行,而且因为JIT编译时需要预热,所有提供了AOT,直接将字节码转化成机器码。
  2. 垃圾回收,在内存充裕情况下,将内存交给GC来做,进行垃圾回收。
  3. 生态,第三方库类,网上资料。
  4. 面向对象,有清晰的类,对象,集成,接口等概念,支持封装,集成,多态等OOP特性

Java的多态

【Q】: Java的多态

【A】:

  1. 指的是同一个接口或父类引用变量可以指向不同的对象实例,并且根据实际指向的对象类型执行相应的方法。
  2. 可以灵活处理不同类型的对象,降低代码耦合度,增强系统可扩展性。
  3. 编译时多态:主要是通过方法的重载(方法名称一样但是参数列表不同)实现。
  4. 运行时多态:主要是通过方法的重写(一个方法重写父类的一个方法或多个方法)。

Java中的参数传递是按值还是引用?

【Q】:Java中的参数传递是按值还是引用?

【A】:

  1. Java中,参数的传递只有按值传递。
  2. 基本数据类型传递的是值的副本,不会对参数进行任何修改。
  3. 引用数据类型传递的是引用的副本,即对象的内存地址。因此,方法内可以修改通过引用修改对象属性,但是将其指向另一个对象。

为什么Java不支持多重集成?

【Q】:为什么Java不支持多重集成?

【A】:

  1. 多重集成会造成歧义,导致不知道应该调用哪个。
  2. 为什么可以接口多实现?因为java8之后出了默认方法(default method),强制规定了多个接口有相同的默认方法,子类就必须重写这个方法。

Java面向对象和面向过程区别是什么?

【Q】:Java面向对象和面向过程区别是什么?

【A】:

  1. 面向编程:把类和对象作为基本单元来组织代码。数据和行为封装在对象内部,数据操作由对象方法进行管理。
  2. 面向过程:以过程作为基本单元来组织代码。过程就是函数,面向过程中函数和数据分离,数据就是成员变量。数据和函数是分离的,函数对数据进行操作。

方法重载和重写之间区别是什么?

【Q】:方法重载和重写之间区别是什么?

【A】:

  1. 重载(方法名称一样但是参数列表不同)。
  2. 重写(一个方法重写父类的一个方法或多个方法)。
  3. 在方法重写时,子类方法不能使用比父类更严格的访问级别。如,父类是protected,子类就不能改为private

Java内部类

【Q】:Java内部类

【A】:

  1. 一个类内部定义的类,包括成员内部类,局部内部类,匿名内部类和静态内部类。内部类可以访问外部类的成员变量和方法,甚至包括私有的成员。
  2. 主要作用: 封装,访问外部类成员,简化代码,事件处理。
  3. 实际上内部类只是编译层面的概念,经过编译器后内部类会提升为外部顶级类,JVM中是没有内部类的概念。

JDK8新特性

【Q】:JDK8新特性

【A】:

  1. 用元空间替代了永久的。JDK8把JRockit虚拟机和Hostspot虚拟机融合。而JRockit没有永久代,所以把Hotspot永久代给去了(本质是因为永久代效率太低)。
  2. Lambda表达式。
  3. 日期类。引入的新的日期类都是不可变的,一旦被创建就不能被修改。使用了ZonedDateTimeOffsetDateTimeZoneId等,简化了时区。
  4. 接口默认方法,静态。
  5. Steam流式接口。提供了一种更高效而易于使用的方法来处理数据集合。支持链式操作,惰性求值和并行处理。

网站公告

今日签到

点亮在社区的每一天
去签到