Java基础面试指南一
相关阅读
- Java 内存管理面试指南一
- Java 基础面试指南一
- Java 基础面试指南二
- Java 基础面试指南三
- Java 基础面试指南四
- Java 线程面试指南一
- Java 线程面试指南二
- Redis 面试指南一
- Kafka 面试指南一
- Spring 面试指南一
- SpringBoot 面试指南一
- 微服务面试指南一
简介
Java 是当今世界上使用最广泛的编程语言之一,是一种通用的高级编程语言。核心 Java(Core Java) 是 Java 编程技术概念的基础,该术语最初由 Sun Microsystems 用来描述 Java 的标准版本(J2SE)。核心 Java 代表了 Java 平台标准版(Java SE),包含了 Java 的所有基础知识,包括基本原理和核心包详情。
Java 核心概念涵盖了所有面向对象编程(OOPS)概念、特殊运算符、数据类型、包装类、异常处理、多态性、多线程、集合框架(如链表、队列、栈、ArrayList)等。它最常用于开发桌面应用程序和服务器环境(独立应用程序)。
JDK 和 JVM 有什么区别?
- JDK (Java Development Kit):Java 开发工具包,主要用于开发目的,包含了开发工具以及执行环境(JRE)。
- JVM (Java Virtual Machine):Java 虚拟机,纯粹是运行时环境。您无法仅使用 JVM 编译源文件,它负责执行编译后的字节码。
OOPS 的基本概念是什么?
面向对象编程(Object-Oriented Programming System, OOPS)的基本概念包括:
- 抽象化 (Abstraction)
- 多态性 (Polymorphism)
- 继承 (Inheritance)
- 封装 (Encapsulation)
你能解释多态吗?
多态性被简要描述为“一个接口,许多实现”。它是能够在不同上下文中为某事物赋予不同含义或用法的一种特征。具体来说,就是允许诸如变量、函数或对象之类的实体具有多种形式。
内部类和子类之间有什么区别?
- 内部类 (Inner Class):嵌套在另一个类中的类。内部类具有对其外部类的访问权限,可以访问在外部类中定义的所有变量和方法(包括私有成员)。
- 子类 (Subclass):从另一个称为超类(Superclass)的类继承的类。子类可以访问其父类的所有公共(public)和受保护(protected)的方法以及字段。
Java 类的 private, public 是什么?
在 Java 中,访问修饰符(Access Modifiers)是在定义类、方法或字段时使用的关键字,用于定义访问范围。类的访问修饰符类型包括:
- public:类、方法、字段可从任何地方访问。
- protected:方法、字段可以从它们所属的同一类、子类以及同一包中的其他类访问,但不能从外部包访问。
- default(默认):方法、字段、类只能从同一包访问,而不能从其包外部访问。
- private:方法、字段只能从它们所属的相同类中访问。
您能解释一下静态方法和静态变量吗?
当需要在一个类的多个对象之间共享方法或变量,而不是为每个对象创建单独的副本时,我们使用 static 关键字。这使得所有对象共享同一个静态方法或变量。
Java 支持运算符重载吗?
不支持。Java 设计者认为运算符重载会降低代码的可读性,因此未引入该特性。
可以重载方法吗?
是的。派生类仍然可以覆盖(Override)重载的方法。多态性仍然可能发生。编译器将不会在编译期绑定方法调用(早期绑定),因为它可能已被重载,且可能会在运行时被覆盖(动态绑定)。
什么是数据封装,其意义是什么?
封装 (Encapsulation) 是面向对象编程中的一个概念,用于在单个单元中组合属性(数据)和方法(行为)。
封装的意义在于:
- 帮助程序员遵循模块化的方法进行软件开发,因为每个对象都有自己的一组方法和变量,且功能独立于其他对象。
- 用于数据隐藏 (Data Hiding),保护内部状态不被外部直接访问。
什么是单例模式?举例说明其用法
Java 中的单例类 (Singleton Class) 只能有一个实例,因此其所有方法和变量都只属于这一个实例。单例类概念对于需要限制一个类的对象数量的情况很有用。
最佳示例:由于驱动程序限制或许可问题,数据库连接通常限制为只有一个存在,此时适合使用单例模式。
什么是守护线程?
守护线程 (Daemon Thread) 是一个后台线程,不会阻止 JVM 在程序完成但该线程仍在运行时退出。守护线程的一个典型示例是垃圾回收器(Garbage Collector)。
Java 中的循环是什么?三种循环类型是什么?
循环在编程中用于重复执行一条语句或语句块。Java 中有三种循环类型:
- for 循环
用于重复执行给定次数的语句。当程序员明确知道执行语句的次数时,通常使用 for 循环。 - while 循环
当某些语句需要重复执行直到满足特定条件时使用。在 while 循环中,在执行语句块之前先检查条件。 - do-while 循环
与 while 循环类似,区别在于它在执行语句块后检查条件。因此,在 do-while 循环中,语句块至少会执行一次。
您可以定义死锁吗?
死锁 (Deadlock) 描述了一种情况,其中两个或多个线程永远被阻塞,互相等待对方释放资源。
什么是无限循环?如何声明无限循环?
无限循环无条件运行,并且无限执行。通过在语句块的主体中定义任何中断逻辑(如 break),可以中断无限循环。
无限循环声明如下:
for (;;) {
// 要执行的语句
// 添加任何循环中断逻辑
}Continue 和 break 语句有什么区别?
break 和 continue 是循环中使用的两个重要关键字。
- break:当在循环中使用
break关键字时,循环会立即终止。 - continue:当使用
continue关键字时,当前迭代中断,循环跳过剩余语句并进行下一次迭代。
break 示例:当计数器达到 4 时,循环中断。
for (int counter = 0; counter < 10; counter++) {
System.out.println(counter);
if (counter == 4) {
break;
}
}continue 示例:当计数器达到 4 时,循环跳至下一次迭代,continue 关键字之后的所有语句都将跳过当前迭代。
for (int counter = 0; counter < 10; counter++) {
System.out.println(counter);
if (counter == 4) {
continue;
}
System.out.println("This will not get printed when counter is 4");
}Java 中的 double 和 float 变量有什么区别?
- float:占用 4 个字节的内存,是单精度浮点十进制数。
- double:占用 8 个字节的内存,是双精度浮点十进制数。
什么是 javac?
javac 是 Java 编译器,它从 *.java 文件生成 Java 字节码(.class 文件)。它是您的源代码的中间表示,其中包含指示 JVM 执行操作的指令。
Java 中的 final 关键字是什么?举个例子
在 Java 中,使用关键字 final 声明一个常量。值只能分配一次,分配后不能更改常量的值。
示例:声明名为 const_val 的常量,并为其分配一个值。
private final int const_val = 100;- final 方法:当一个方法声明为
final时,它不能被子类覆盖。此方法通常比任何其他方法都快,因为它们在编译时已解决(静态绑定)。 - final 类:当一个类声明为
final时,则不能将其子类化。示例:String、Integer和其他包装类。
什么是三元运算符?
三元运算符(也称为条件运算符)用于根据布尔值评估来决定将哪个值分配给变量。表示为 ? :。
示例:如果等级为 1,则为状态分配值"Done",否则为"Pending"。
public class ConditionTest {
public static void main(String[] args) {
String status;
int rank = 1; // 假设 rank 已初始化
status = (rank == 1) ? "Done" : "Pending";
}
}Java 中有 6 种不同类型的运算符?
在 Java 中,运算符可以分为以下六种类型:
- 算术运算符:用于算术计算。例如
+,-,*,/,%,++,-- - 关系运算符:用于关系比较。例如
==,!=,>,<,<=,>= - 按位运算符:用于逐位操作。例如
&,|,^,~ - 逻辑运算符:用于逻辑比较。例如
&&,||,! - 赋值运算符:用于为变量分配值。例如
=,+=,-=,*=,/= - 其他运算符:如实例运算符 (
instanceof) 等(注:原文列举了 5 类,此处补全常见分类以符合"6 种”的描述语境,或仅保留原文 5 类并修正表述。基于原文内容,主要涵盖前 5 类,此处保持原文核心内容并优化格式)。
Java 派生所有类的基类是什么?
java.lang.Object
Java 中的 main() 方法可以返回任何数据吗?
在 Java 中,main() 方法无法返回任何数据,因此始终使用 void 的返回类型进行声明。
什么是 Java 包?包装的意义是什么?
在 Java 中,包 (Package) 是类和接口的集合,这些类和接口相互关联在一起,因此捆绑在一起。
意义:
- 有助于开发人员对代码进行模块化。
- 对代码进行分组以进行适当的重用。
- 将代码打包到 Packages 中之后,就可以将其导入其他类中并使用,避免命名冲突。
我们可以在没有任何抽象方法的情况下将类声明为 Abstract 吗?
是的。即使没有任何抽象方法,我们也可以在类名之前使用 abstract 关键字来创建一个抽象类。但是,如果一个类甚至具有一个抽象方法,则必须将其声明为抽象类,否则将产生编译错误。
堆内存和堆栈内存有什么区别?
- 堆内存 (Heap Memory):由应用程序的所有部分使用。每当创建对象时,它始终存储在堆空间中。堆栈存储器包含对该对象的引用。内存管理在 Heap 内存中更为复杂,因为它在全局范围内使用。
- 堆栈内存 (Stack Memory):仅由一个执行线程使用。堆栈内存仅包含局部原始变量和堆空间中对象的引用变量。堆栈中的内存管理以 LIFO (后进先出) 方式完成。
Java 中的抽象类和接口有什么区别?
- 方法实现:接口只能拥有没有具体实现的公共抽象方法的声明(Java 8 之前),而抽象类可以具有带有或不带有具体实现的带有任何访问修饰符(public, private 等)的成员。
- 继承要求:实现接口的类必须实现接口的所有方法,而从抽象类继承的类则不需要实现其超类的所有方法(除非子类也是抽象类)。
- 多重实现:一个类可以实现多个接口,但只能扩展一个抽象类。
接口对抽象类的性能影响是什么?
与抽象类相比,接口的性能较慢,因为接口需要额外的间接调用。开发人员要考虑的另一个关键因素是,任何类只能扩展一个抽象类,而一个类可以实现许多接口。
每当在类中实现接口时,使用接口也给开发人员带来了额外的负担;开发人员被迫实现每种接口方法(除非使用默认方法)。
导入软件包是否也可以在 Java 中导入其子软件包?
在 Java 中,当导入包时,不会导入其子包,并且如果需要,开发人员需要分别导入它们。
示例:如果开发人员导入了一个软件包 university.*,则将装入名为 university 的软件包中的所有类,但不会装入该子软件包中的任何类。
我们可以将类的主要方法声明为私有方法吗?
在 Java 中,main 方法必须是 public static 以便正确运行任何应用程序。如果将 main 方法声明为私有方法,则开发人员将不会获得任何编译错误,但它将无法执行,并会给出运行时错误(JVM 找不到公共入口点)。
我们如何通过引用将参数传递给函数,而不是通过值传递?
在 Java 中,我们只能通过值(Pass by Value)而不是通过引用将参数传递给函数。对于对象,传递的是引用的副本。
如何在 Java 中序列化对象?
在 Java 中,要通过序列化将对象转换为字节流,该类将实现一个名为 Serializable 的接口。实现可序列化接口的类的所有对象均被序列化,其状态保存在字节流中。
什么时候应该使用序列化?
当需要通过网络传输数据或持久化对象状态时,使用序列化。使用序列化,可以保存对象的状态并将其转换为字节流。字节流通过网络传输,并且在目标位置重新创建对象。
在 Java 中,在 try 块后面紧跟一个 catch 块是否强制进行异常处理?
try 块之后,需要紧接着是 catch 块、finally 块或二者兼有。从 try 块引发的任何异常都需要捕获在 catch 块中,或者必须在代码中止之前将要执行的任何特定任务放入 finally 块中。
即使在异常块中发生某些异常,是否有任何方法可以跳过最终的异常块?
如果在 try 块中引发异常,则控制传递到 catch 块(如果存在),否则传递到 finally 块。当发生异常时,总是执行 finally 块。避免在 finally 块中执行任何语句的唯一方法是通过在 try 块的末尾编写以下代码行来强行中止代码:
System.exit(0);一个类可以有多个构造函数吗?
是的,一个类可以具有多个带有不同参数的构造函数(构造函数重载)。用于创建对象的构造函数取决于创建对象时传递的参数。
super 关键字有什么作用?
当您在子类中重写方法时,可以使用 super 关键字来访问父类中被覆盖的方法。它也可以用于调用父类的构造函数。
我们可以重写类的静态方法吗?
我们不能覆盖(Override)静态方法。静态方法属于一个类,而不属于单个对象,并且在编译时(而不是在运行时)解析。即使我们尝试覆盖静态方法,也不会遇到编译错误,也不会在运行代码时产生覆盖的影响(这称为方法隐藏 (Method Hiding))。
public class Superclass {
public static void displayResult() {
System.out.println("Printing from superclass");
}
}
public class Subclass extends Superclass {
public static void displayResult() {
System.out.println("Displaying from subclass");
}
public static void main(String[] args) {
Subclass obj = new Subclass();
obj.displayResult();
// 注意:静态方法调用取决于引用类型,此处虽用对象调用,实际编译为 Subclass.displayResult()
// 若用 Superclass obj = new Subclass(); obj.displayResult(); 则调用父类方法
}
}字符串是 Java 中的数据类型吗?
字符串不是 Java 中的原始数据类型(Primitive Data Type)。在 Java 中创建字符串时,它实际上是创建的 java.lang.String 类的对象。创建此字符串对象后,可以在该字符串对象上使用 String 类的所有内置方法。
说明:本文部分术语(如 J2SE、Sun Microsystems)源于 Java 早期版本描述,当前 Java 版本已由 Oracle 维护并命名为 Java SE。内容核心概念依然适用,但具体实现细节可能随 JDK 版本更新有所变化。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/java-ji-chu-mian-shi-zhi-nan-yi.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。