面试 Java 基础八股文十问十答第二十六期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)你觉得 Java 好在哪儿?
Java 在许多方面都有其优势:
- 平台无关性: Java 通过虚拟机实现了平台无关性,可以在各种不同的操作系统上运行相同的代码,这使得 Java 在跨平台开发方面具有很大的优势。
- 面向对象: Java 是一种面向对象的编程语言,支持封装、继承和多态等面向对象的特性,使得代码更易于理解、维护和扩展。
- 强大的生态系统: Java 拥有丰富的类库和框架,可以支持各种不同类型的应用开发,从企业级应用到移动应用等各个领域都有涵盖。
- 内存管理: Java 提供了垃圾回收机制,大大简化了内存管理的工作,减少了内存泄漏和野指针等问题的出现。
- 安全性: Java 通过提供安全管理器来控制应用程序的访问,可以有效地防止恶意代码的执行。
2)Java 的多态是什么意思?
在 Java 中,多态性是指同一个方法调用可以在不同的对象上产生不同的行为。具体来说,多态性包括两种形式:编译时多态(静态多态)和运行时多态(动态多态)。
- 编译时多态(静态多态): 在编译时,编译器根据引用变量的类型决定调用哪个方法。这种多态性主要体现在方法的重载上。
- 运行时多态(动态多态): 在运行时,虚拟机根据对象的实际类型决定调用哪个方法。这种多态性主要体现在方法的重写(覆盖)上。
多态性使得代码更加灵活和可扩展,能够提高代码的可维护性和可读性。
3)Java 按值传递还是按引用传递?
Java 中的参数传递是按值传递(pass by value)。这意味着在方法调用时,实际参数的值(即对象的引用)被复制到方法形式参数的副本中,而不是传递实际对象的引用本身。因此,对形式参数的修改不会影响到实际参数。
虽然对于引用类型的参数,传递的是引用的副本,但仍然是按值传递的。因为即使在方法内部修改了引用所指向的对象,实际上是修改了副本所指向的对象,而不是实际的引用本身。
4)接口和抽象类有什么区别?
接口(Interface)和抽象类(Abstract Class)都是用来定义规范的,但它们有一些关键区别:
- 方法实现: 在接口中,所有的方法都是抽象的,没有方法体。而抽象类可以包含抽象方法和具体方法(有方法体的方法)。
- 多继承: 一个类可以实现多个接口,但只能继承一个抽象类。这意味着接口支持多重继承,而抽象类不支持。
- 构造方法: 接口不能包含构造方法,而抽象类可以包含构造方法。
- 成员变量: 接口中只能包含常量(被
final
修饰的变量),而抽象类可以包含非抽象方法和成员变量。 - 用途: 接口用于定义类之间的契约,描述了类应该实现的方法,而抽象类用于创建子类的模板,提供了一部分实现并留下一些方法由子类去实现。
5)Java 为什么不支持多继承?
Java 不支持多继承是为了避免多继承可能带来的复杂性和潜在的问题:
- Diamond 问题: 如果一个类继承自多个父类,并且这些父类又有共同的父类,就会产生 Diamond 问题(菱形继承问题)。这种情况下,编译器可能无法确定正确的方法调用顺序。
- 代码可读性和维护性: 多继承会增加代码的复杂性,降低代码的可读性和可维护性。当一个类继承自多个父类时,代码的逻辑关系变得更加难以理解和跟踪。
- 歧义性: 如果多个父类中包含同名方法,编译器无法确定应该调用哪一个,这会引发歧义性。
- 单继承+接口的替代方案: Java 提供了接口和单继承的机制,通过接口可以实现类与类之间的解耦合,提供了更加灵活的设计方式。
综上所述,Java 不支持多继承是为了保持语言的简洁性和安全性,以及降低复杂性和歧义性。
6)什么是序列化?什么是反序列化?
- 序列化(Serialization): 序列化是指将对象转换为字节序列的过程,以便将其保存到文件、数据库或者通过网络进行传输。在 Java 中,通过实现
java.io.Serializable
接口,可以将对象序列化为字节流,然后可以通过反序列化将字节流还原为对象。 - 反序列化(Deserialization): 反序列化是指将字节序列转换为对象的过程,从而可以从文件、数据库或者网络中恢复对象。在 Java 中,通过读取字节流并使用
ObjectInputStream
类的readObject()
方法,可以将字节流反序列化为对象。反序列化的对象与序列化之前的对象相同,包括其状态和数据。
7)什么是不可变类?
不可变类(Immutable Class)是指一旦创建一个对象后,该对象的状态(即属性值)将不能被修改。不可变类通常通过以下方式实现:
- 属性私有化:通过将类的属性声明为私有属性,并提供只读的访问方法来限制对属性的直接修改。
- 没有提供修改属性的方法:不可变类通常不提供改变对象属性的方法。
- 创建一个新的对象:如果需要改变对象的属性值,通常会创建一个新的对象,而不是修改现有对象的属性。
不可变类的优点包括线程安全性,因为不可变对象在多线程环境下不会被改变;同时,这些类也更加容易维护和调试。
8)Exception 和 Error 的区别知道吗?
在编程中,Exception
和 Error
是异常机制中两种不同类型的错误:
- Exception:指的是程序运行过程中可以预期并且需要处理的异常。这类异常通常由程序本身的问题引起,比如文件未找到、数组越界、网络连接问题等。程序员通常会在代码中捕获和处理
Exception
,以确保程序能够正常运行。 - Error:指的是更为严重的错误,这通常是由于系统层面的原因引起,比如内存溢出、虚拟机错误等。
Error
代表程序通常无法处理的情况,程序员无法也不应该尝试捕获它们,因为它们通常是程序外部(例如虚拟机或系统)的问题。
9)面向对象编程和面向过程编程的区别?
面向对象编程(OOP)和面向过程编程(Procedural Programming)是两种不同的编程范式。它们的区别主要体现在:
- 程序结构:面向对象编程将程序组织成对象和类,而面向过程编程则将程序组织成一系列过程和函数。
- 数据封装:面向对象编程强调数据和行为的封装,即将数据和操作数据的方法封装在类中;面向过程编程则较少强调数据封装。
- 继承和多态:面向对象编程支持继承和多态,通过继承可以复用代码,通过多态可以增强程序的灵活性;面向过程编程不支持这些特性。
- 代码复用:面向对象编程通过继承和组合来复用代码,而面向过程编程通过函数调用和模块化来复用代码。
10)重载与重写的区别?
重载(Overloading)和重写(Overriding)是面向对象编程中两个不同的概念:
- 重载(Overloading):是指在同一个类中创建多个具有相同名称但不同参数列表的方法。这些方法在方法签名不同(参数类型、数量、顺序)的情况下可以共存。这允许同一个方法名称在不同的情境下表现出不同的行为。
- 重写(Overriding):是指在子类中重新定义父类中已经定义的方法。重写允许子类提供特定于自己的实现,而不是使用父类的方法实现。这种行为增强了多态性,使子类能够对父类的方法进行定制化。
总之,重载是同一类中的方法多样化,而重写是子类对父类方法的改写。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,1.5W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐