100+核心Java面试问题

核心Java面试问题可以帮助您准备基于Java的面试。无论您是新手还是经验丰富的专业人士,核心Java在任何Java/JEE面试中都扮演着重要的角色。

核心Java是大多数面试中最受青睐的领域,在决定面试结果方面起着至关重要的作用。

这篇文章直接来源于我14年以上的Java编程经验和大量的面试经验。Java 16最近发布了,我已经更新了文章,包括一些来自最新版本的问题。

核心Java面试问题和答案

I have already written a lot about java interview questions for specific topics such as String, Collections, and Multithreading.

  1. Java字符串面试问题
  2. Java线程面试问题
  3. Java集合面试问题
  4. Java异常面试问题

这里我提供了一些你应该了解的重要的 Java 核心面试问题及答案,你可以收藏这篇文章,在面试前温习一下知识。

1. 列举 Java 14 发布的一些重要特性。

Java 14 发布于 2020 年 3 月 17 日。这是一个非 LTS 版本。一些开发者需要关注的 Java 14 特性 包括:

  1. Switch 表达式 – JEP 361
  2. instanceof 操作符的模式匹配改进 – 预览特性,JEP 305
  3. 有用的 NullPointerException 消息 – JEP 358
  4. 文本块 – 第二次预览,JEP 368
  5. Records – 数据类,预览特性,JEP 359。

2. 列举 Java 13 发布的一些重要特性。

Java 13 发布于 2019 年 9 月 17 日。这是一个非 LTS 版本。一些开发者需要关注的 Java 13 特性 包括:

  1. 文本块 – 预览特性,JEP 355
  2. Switch表达式 – 预览功能,JEP 354
  3. Java Sockets API的重新实现 – JEP 353
  4. 动态CDS存档 – JEP 350
  5. FileSystems.newFileSystem() 方法
  6. 具有命名空间支持的DOM和SAX工厂
  7. Unicode 12.1支持
  8. ZGC改进以释放未使用的内存 – JEP 351

3.列举Java 12发布的一些重要功能?

Java 12于2019年3月19日发布。它是一个非LTS版本。一些Java 12功能包括:

  1. JVM变更 – JEP 189,JEP 346,JEP 344和JEP 230。
  2. Switch表达式
  3. 文件mismatch() 方法
  4. 紧凑数字格式化
  5. 流API中的Teeing收集器
  6. String类中的新方法
  7. JEP 334:JVM常量API
  8. JEP 305:instanceof的模式匹配
  9. 从JDK 12中删除了原始字符串文字。

4. Java 11发布的重要特性是什么?

Java 11是继Java 8之后的第二个LTS版本。他们已经改变了许可和支持模型,这意味着如果您下载Java 11 Oracle JDK,则需要为商业用途付费。如果您想使用免费版本,可以从OpenJDK网站下载。

Java 11的一些重要特性包括:

  • 我们可以通过java命令直接运行Java程序。源文件将被隐式编译和执行。这是JEP 330功能实现的一部分。
  • String类中新增了6个新方法 – isBlank()、lines()、strip()、stripLeading()、stripTrailing()和repeat()。您可以在我们的Java String类文章中了解所有相关内容。
  • Files类新增了两个新方法以读取/写入字符串数据 – readString()和writeString()。
  • 我们也可以在lambda表达式中使用“var”。这是JEP 323实现的一部分。
  • Epsilon:用于测试环境的No-Op垃圾收集器。这是一个实验性功能,属于JEP 318的一部分。
  • Java EE和CORBA模块已从标准JDK构建中移除。Nashorn JavaScript引擎也已被弃用。
  • 新的HTTP客户端(JEP 321)和飞行记录器(JEP 328)

要获取完整的概述,请阅读Java 11 特性

5. Java 10 发布的重要特性是什么?

Java 10 是来自 Oracle 公司的首个每六个月发布一次的版本,因此不像早期版本那样是一个重大的发布。然而,Java 10 的一些重要特性包括:

  • 局部变量类型推断
  • 增强了 java.util.Locale 和相关的 API,以实现 BCP 47 语言标签的额外 Unicode 扩展。
  • 使 HotSpot VM 能够在替代存储设备(例如用户指定的 NV-DIMM)上分配 Java 对象堆。
  • 在 JDK 中提供了一组默认的根证书颁发机构(CA)证书。

Java 10 主要是一个维护版本,但我特别喜欢局部变量类型推断功能。有关 Java 10 的详细概述,请查阅Java 10 特性

6. Java 9发布的重要特性有哪些?

Java 9是一个重要的版本,带来了许多新特性。其中一些重要特性包括:

  • Java 9 REPL (JShell)
  • Java 9模块系统
  • 不可变列表、集合、映射和映射条目的工厂方法
  • 接口中的私有方法
  • 响应式流
  • 垃圾收集器(Garbage Collector)改进

您可以在《Java 9特性》中找到更多详细信息。Java 9特性

7. Java 8发布的重要特性有哪些?

Java 8于2014年3月发布,因此是Java面试问题中的热门话题之一。如果您清晰地回答了这个问题,那将表明您喜欢与最新技术保持同步。

Java 8是继Java 5注解和泛型之后的最重要的版本之一。Java 8的一些重要特性包括:

  1. 接口使用默认和静态方法进行更改
  2. 函数式接口和Lambda表达式
  3. Java流API用于集合类
  4. Java日期时间API

I strongly recommend to go through above links to get proper understanding of each one of them, also read Java 8 Features.

8. 在Java中列出一些面向对象编程的概念?

Java基于面向对象编程概念,以下是Java编程中实现的一些面向对象编程概念。

  • 抽象
  • 封装
  • 多态
  • 继承
  • 关联
  • 聚合
  • 组合

在《Java中的面向对象编程概念》中了解更多信息。

9. Java的平台独立性是什么意思?

平台独立性意味着你可以在任何操作系统中运行相同的Java程序。例如,你可以在Windows中编写Java程序,然后在Mac OS中运行它。

10. JVM是什么,它是否是平台独立的?

Java虚拟机(JVM)是Java编程语言的核心。JVM负责将字节码转换为机器可读的代码。JVM不是平台独立的,这就是为什么不同操作系统有不同的JVM。我们可以使用Java选项来自定义JVM,比如为JVM分配最小和最大内存。它被称为虚拟机是因为它提供了一个不依赖于底层操作系统的接口。

11. JDK和JVM之间有什么区别?

Java开发工具包(JDK)用于开发目的,其中JVM是其中的一部分,用于执行Java程序。

JDK提供了编译、调试和执行Java程序所需的所有工具、可执行文件和二进制文件。执行部分由JVM处理,以提供机器独立性。

12. JVM和JRE之间有什么区别?

Java运行时环境(JRE)是JVM的实现。JRE包括JVM、Java二进制文件和其他类,以成功执行任何程序。JRE不包含任何开发工具,如Java编译器、调试器等。如果要执行任何Java程序,您应该安装JRE。

13. 哪个类是所有类的超类?

java.lang.Object是所有Java类的根类,我们不需要扩展它。

14. 为什么Java不支持多重继承?

Java在类中不支持多重继承,因为存在“菱形问题”。要了解有关菱形问题的更多信息以及示例,请阅读Java中的多重继承

然而,接口支持多重继承。接口可以继承多个接口,因为它们只声明方法,具体实现将存在于实现类中。因此,接口没有菱形问题的问题。

15. 为什么Java不是纯粹的面向对象语言?

Java不被认为是纯粹的面向对象,因为它支持诸如int、byte、short、long等原始类型。我认为这为编写我们的代码带来了简单性。Java可以为原始类型提供包装对象,但仅用于表示,它们不会提供任何好处。

我们知道,对于所有的原始类型,我们都有像Integer、Long等的包装类,它们提供了一些附加方法。

16. 路径和类路径变量之间有什么区别?

PATH 是操作系统用来定位可执行文件的环境变量。这就是为什么当我们安装 Java 或者希望操作系统找到任何可执行文件时,我们需要将目录位置添加到 PATH 变量中。如果您使用 Windows 操作系统,阅读这篇文章来了解如何在 Windows 上设置 PATH 变量。

Classpath 是特定于 Java 的,由 Java 可执行文件用于定位类文件。我们可以在运行 Java 应用程序时提供 classpath 位置,它可以是目录、ZIP 文件、JAR 文件等。

main() 方法是任何独立 Java 应用程序的入口点。main 方法的语法是 public static void main(String args[])

Java 的 main 方法是公共的和静态的,因此 Java 运行时可以在不初始化类的情况下访问它。输入参数是一个字符串数组,通过它我们可以将运行时参数传递给 Java 程序。查看这篇文章来了解如何编译和运行 Java 程序。

18. 什么是 Java 中的重载和重写?

当在单个类中有多个方法具有相同的名称但参数不同时,这被称为方法重载。

重写的概念是在继承中出现的,当父类和子类中有相同签名的两个方法时。我们可以在子类的重写方法中使用 @Override 注解,以确保如果父类方法发生变化,子类也会相应变化。

19. 我们能重载 main() 方法吗?

是的,我们可以在单个类中拥有多个名称为“main”的方法。然而,如果我们运行这个类,Java 运行时环境将会寻找具有以下语法的 main 方法:public static void main(String args[])

20. 在一个Java源文件中,我们可以有多个public类吗?

在单个Java源文件中我们不能拥有多个public类。一个源文件可以包含多个非public类。

21. 什么是Java包,哪个包是默认导入的?

Java包是组织Java类的机制,通过对它们进行分组来实现。分组逻辑可以基于功能或模块进行。Java类的完全分类名包含包名和类名。例如,java.lang.ObjectObject类的完全分类名,它是java.lang包的一部分。

默认情况下会导入java.lang包,因此我们不需要显式地从此包中导入任何类。

22. Java中的访问修饰符是什么?

Java通过public、private和protected访问修饰符关键字提供访问控制。当这些关键字都未被使用时,它被称为默认访问修饰符。

A java class can only have public or default access modifier. Read Java Access Modifiers to learn more about these in detail.

23. 什么是final关键字?

final关键字用于类上,确保没有其他类可以扩展它。例如,String类是final的,我们无法扩展它。

我们可以使用final关键字与方法,确保子类无法覆盖它。

Java的final关键字可以用于变量,以确保它只能被赋值一次。但是变量的状态可以改变,例如,我们只能将一个final变量赋值给一个对象一次,但对象的变量后来可以更改。

Java接口变量默认为final和static。

24. 什么是static关键字?

static关键字可用于类级别变量,使其成为全局变量,即所有对象将共享相同的变量。

我们也可以用static关键字来修饰方法。静态方法只能访问类的静态变量,并且只能调用类的静态方法。

请在java static 关键字中详细阅读。

25. 在 Java 中 finally 和 finalize 是什么?

finally 块与 try-catch 一起使用,用于放置您希望始终执行的代码,即使 try-catch 块抛出异常。finally 块通常用于释放在 try 块中创建的资源。

finalize() 是 Object 类中的一个特殊方法,我们可以在我们的类中覆盖它。当对象正在被垃圾收集器回收时,该方法将被垃圾收集器调用。通常会重写此方法以在对象被垃圾收集时释放系统资源。

26. 我们可以将类声明为 static 吗?

我们不能将顶级类声明为 static,但是可以将内部类声明为 static。如果内部类声明为 static,则称为静态嵌套类。

静态嵌套类与任何其他顶级类相同,只是为了包装方便而嵌套。

java 内部类中阅读更多关于内部类的信息。

27. 什么是静态导入?

如果我们需要使用其他类的静态变量或方法,通常我们会导入该类,然后使用类名加方法/变量。

import java.lang.Math;

//在类内部
double test = Math.PI * 5;

我们可以通过仅导入静态方法或变量,然后在类中使用它,就像它属于该类一样。

import static java.lang.Math.PI;

//现在不需要引用类
double test = PI * 5;

使用静态导入可能会引起混淆,因此最好避免使用。过度使用静态导入可能会使您的程序难以阅读和维护。

28. 什么是 Java 中的 try-with-resources?

Java 7 的一个特性是用于自动资源管理的 try-with-resources 语句。在 Java 7 之前,没有自动资源管理,我们应该显式关闭资源。通常,这是在 try-catch 语句的 finally 块中完成的。当我们忘记关闭资源时,这种方法会导致内存泄漏。

从Java 7开始,我们可以在try块内创建资源并使用它。 Java会在try-catch块完成后立即关闭它。在Java自动资源管理中了解更多信息。

29. Java中的多重捕获块是什么?

Java 7的一个改进是多重捕获块,我们可以在单个捕获块中捕获多个异常。当每个捕获块具有类似的代码时,这使得我们的代码更短更清晰。

如果一个捕获块处理多个异常,您可以使用管道(|)来分隔它们,在这种情况下,异常参数(ex)是final的,因此您无法更改它。

Java多重捕获块中了解更多信息。

30. 什么是静态块?

Java静态块是一组语句,在Java ClassLoader将类加载到内存时执行。它用于初始化类的静态变量。大多数情况下,它用于在类加载时创建静态资源。

31. 什么是接口?

接口是Java编程语言的核心概念,在JDK以及Java设计模式、大多数框架和工具中广泛使用。接口提供了在Java中实现抽象的一种方式,并用于定义子类要实现的契约。

接口是定义类型并在代码中创建顶级层次结构的良好起点。由于Java类可以实现多个接口,因此在大多数情况下最好使用接口作为超类。更多信息请阅读Java接口

32. 什么是抽象类?

抽象类用于在Java中创建具有一些默认方法实现的类,供子类使用。抽象类可以有没有主体的抽象方法,并且还可以有带有实现的方法。

抽象关键字用于创建抽象类。抽象类不能被实例化,主要用于为子类提供基础,以扩展和实现抽象方法,并覆盖或使用抽象类中的已实现方法。阅读有关抽象类的重要点,请访问java抽象类

33. 抽象类和接口之间有什么区别?

  • 抽象关键字用于创建抽象类,而interface是接口的关键字。
  • 抽象类可以有方法实现,而接口不能。
  • A class can extend only one abstract class but it can implement multiple interfaces.
  • 如果抽象类有main()方法,则可以运行抽象类,而接口无法运行。

更多详细的区别请参阅抽象类和接口的区别

34. 接口能实现或扩展另一个接口吗?

接口不实现另一个接口,而是扩展它。由于接口不能有方法实现,所以不存在菱形继承问题。这就是为什么我们在接口中有多重继承,即一个接口可以继承多个接口。

从Java 8开始,接口可以有默认方法实现。因此,当一个公共默认方法存在于多个接口中时,为了处理菱形继承问题,必须在实现它们的类中提供该方法的实现。有关更多详细信息和示例,请阅读《Java 8 接口变更》。

35. 什么是标记接口?

A marker interface is an empty interface without any method but used to force some functionality in implementing classes by Java. Some of the well known marker interfaces are Serializable and Cloneable.

36. 什么是包装类?

Java包装类是Java中八种基本类型的对象表示。Java中的所有包装类都是不可变的和最终的。Java 5的自动装箱和拆箱允许在基本类型和其对应的包装类之间进行简单的转换。

更多信息请阅读《Java 中的包装类》。

37. 什么是 Java 中的枚举?

枚举是在 Java 1.5 中引入的一种新类型,其字段由一组固定的常量组成。例如,在 Java 中,我们可以创建一个名为 Direction 的枚举,其固定字段为 EAST、WEST、NORTH、SOUTH。

enum 是创建枚举类型的关键字,类似于 class。枚举常量隐式地是静态和 final 的。详细了解请参阅 java 枚举

38. 什么是 Java 注解?

Java注解提供有关代码的信息,对其注释的代码没有直接影响。注解是在Java 5中引入的。注解是关于程序的元数据,嵌入在程序本身中。它可以被注解解析工具或编译器解析。我们还可以指定注解的可用性,要么仅在编译时,要么在运行时都可用。Java内置的注解包括@Override@Deprecated@SuppressWarnings。更多信息请参阅Java注解

39. Java反射API是什么,为什么它如此重要?

Java反射API提供了检查和修改Java应用程序运行时行为的能力。我们可以检查Java类、接口、枚举,并获取它们的方法和字段详情。反射API是一个高级主题,我们应该在正常编程中避免使用它。使用反射API可能会破坏设计模式,例如通过调用私有构造函数来违反访问修饰符的规则,如单例模式。

尽管我们在正常编程中不使用反射API,但它非常重要。没有反射API,我们无法使用任何框架,比如Spring、Hibernate或服务器,比如Tomcat、JBoss。它们通过反射API调用适当的方法并实例化类,并且在其他处理中广泛使用。

阅读Java反射教程以深入了解反射API。

40. 什么是Java中的组合?

组合是在类中实现has-a关系的设计技术。我们可以使用对象组合进行代码重用。

通过使用引用其他对象的实例变量来实现Java组合。使用组合的好处是我们可以控制客户类对其他对象的可见性,并且仅重用我们所需的部分。在Java组合示例中查看更多示例。

41. 组合相比继承有什么优点?

Java编程的最佳实践之一是“优先选择组合而非继承”。一些可能的原因是:

  • 即使我们可能不使用超类方法,但超类的任何更改都可能影响子类。例如,如果在子类中有一个方法test(),突然有人在超类中引入了一个方法test(),我们将在子类中得到编译错误。组合永远不会遇到这个问题,因为我们只使用我们需要的方法。
  • 继承将所有超类方法和变量暴露给客户端,如果我们无法控制设计超类,可能会导致安全漏洞。组合允许我们对方法提供受限访问,因此更安全。
  • 我们可以在组合中获得运行时绑定,而继承在编译时绑定类。因此,组合提供了在调用方法时的灵活性。

您可以在Java组合与继承中了解更多关于组合优于继承的上述优点。

42.如何在Java中对自定义对象的集合进行排序?

我们需要实现Comparable接口来支持自定义对象在集合中的排序。Comparable接口具有compareTo(T obj)方法,排序方法使用该方法,通过提供此方法的实现,我们可以提供默认的方式来对自定义对象集合进行排序。

然而,如果您想根据不同的标准进行排序,比如根据工资或年龄对员工集合进行排序,那么我们可以创建Comparator实例并将其传递为排序方法。有关更多详细信息,请阅读Java Comparable和Comparator

43. Java中的内部类是什么?

我们可以在类内部定义一个类,它们被称为嵌套类。任何非静态嵌套类都称为内部类。内部类与类的对象相关联,它们可以访问外部类的所有变量和方法。由于内部类与实例相关联,所以我们不能在其中有任何静态变量。

我们可以在类内部有局部内部类或匿名内部类。有关更多详细信息,请阅读java内部类

44. 什么是匿名内部类?

A local inner class without a name is known as an anonymous inner class. An anonymous class is defined and instantiated in a single statement. Anonymous inner class always extend a class or implement an interface.

由于匿名类没有名称,因此无法为匿名类定义构造函数。匿名内部类只能在定义它的地方访问。

45. 什么是 Java 中的类加载器?

Java 类加载器是将字节码程序加载到内存中的程序,当我们想要访问任何类时会用到。我们可以通过扩展 ClassLoader 类并覆盖 loadClass(String name) 方法来创建自己的类加载器。了解更多,请访问 java classloader

46. 有哪些不同类型的类加载器?

Java 中有三种内置的类加载器。

  1. Bootstrap ClassLoader – 它加载 JDK 内部类,通常加载 rt.jar 和其他核心类。
  2. 扩展类加载器 – 它从 JDK 扩展目录加载类,通常是 $JAVA_HOME/lib/ext 目录。
  3. 系统类加载器 – 它从当前类路径加载类,可以在调用程序时使用 -cp 或 -classpath 命令行选项设置。

47. 什么是 Java 中的三元运算符?

Java 三元运算符是唯一的条件运算符,它接受三个操作数。它是 if-then-else 语句的一行替代,广泛用于 Java 编程。我们可以使用三元运算符来代替 if-else 条件,甚至可以使用嵌套的三元运算符来代替 switch 条件。一个例子可以在java 三元运算符中找到。

48. super 关键字的作用是什么?

当您在子类中重写方法时,super 关键字可以用于访问超类方法。

我们可以使用 super 关键字在子类构造函数中调用超类构造函数,但在这种情况下,它应该是构造函数方法中的第一条语句。

package com.journaldev.access;

public class SuperClass {

	public SuperClass(){
	}
	
	public SuperClass(int i){}
	
	public void test(){
		System.out.println("super class test method");
	}
}

可以在下面的子类实现中看到 super 关键字的使用。

package com.journaldev.access;

public class ChildClass extends SuperClass {

	public ChildClass(String str){
		//使用 super 关键字访问父类构造函数
		super();
		
		//访问子类方法
		test();
		
		//使用 super 访问父类方法
		super.test();
	}
	
	@Override
	public void test(){
		System.out.println("child class test method");
	}
}

49. break 和 continue 语句是什么?

我们可以使用 break 语句来终止 for、while 或 do-while 循环。我们可以在 switch 语句中使用 break 语句来退出 switch case。您可以在 java break 看到 break 语句的示例。我们可以与标签一起使用 break 来终止嵌套循环。

continue 语句跳过当前的 for、while 或 do-while 循环的迭代。我们可以与标签一起使用 continue 语句来跳过最外层循环的当前迭代。

50. Java 中的 this 关键字是什么?

this 关键字提供对当前对象的引用,主要用于确保使用对象变量,而不是具有相同名称的局部变量。

//构造函数
public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

我们还可以使用这个关键字来从构造函数中调用其他构造函数。

public Rectangle() {
    this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
    this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

51. 默认构造函数是什么?

类的无参构造函数称为默认构造函数。当我们没有为类定义任何构造函数时,Java编译器会自动为类创建默认的无参构造函数。如果已定义其他构造函数,则编译器不会为我们创建默认构造函数。

52. 我们可以没有 catch 块而只有 try 块吗?

是的,我们可以使用 try-finally 语句,从而避免 catch 块。

53. 什么是垃圾回收?

垃圾回收是查看堆内存,识别哪些对象正在使用哪些对象不在使用,并删除未使用对象的过程。在Java中,内存的释放过程由垃圾收集器自动处理。

我们可以使用代码 Runtime.getRuntime().gc() 来运行垃圾收集器,或者使用实用方法 System.gc()。有关堆内存和垃圾收集的详细分析,请阅读Java垃圾收集

54. 什么是序列化和反序列化?

我们可以将Java对象转换为称为序列化的流。一旦对象转换为流,它可以保存到文件,发送到网络上或在套接字连接中使用。

对象应该实现一个Serializable接口,我们可以使用java.io.ObjectOutputStream将对象写入文件或任何OutputStream对象中。了解更多信息,请访问Java序列化

通过反序列化将通过序列化创建的流数据转换为对象的过程称为反序列化。了解更多信息,请访问Java反序列化

55. 如何通过命令提示符运行JAR文件?

我们可以使用java命令运行jar文件,但这需要在jar清单文件中添加Main-Class条目。Main-Class是jar的入口点,由java命令用于执行类。在java jar文件了解更多。

56. System类的用途是什么?

Java的System类是核心类之一。调试时记录信息的一种简单方式是使用System.out.print()方法。

System类是final的,因此我们无法通过继承来子类化和覆盖其行为。System类不提供任何公共构造函数,因此我们无法实例化此类,这就是为什么其所有方法都是静态的。

System类的一些实用方法用于数组复制、获取当前时间、读取环境变量。在Java System类了解更多信息。

57. instanceof 关键字是什么?

我们可以使用 instanceof 关键字来检查一个对象是否属于某个类。我们应尽量避免它的使用。示例用法是:

public static void main(String args[]){
	Object str = new String("abc");
		
	if(str instanceof String){
		System.out.println("String value:"+str);
	}
		
	if(str instanceof Integer){
		System.out.println("Integer value:"+str);
	}
}

由于 str 在运行时是 String 类型,第一个 if 语句评估为 true,第二个则为 false。

58. 我们可以在 switch case 中使用 String 吗?

Java 7 的一个特性是改进了 switch case 来允许使用字符串。因此,如果您使用的是 Java 7 或更高版本,您可以在 switch-case 语句中使用 String。详细信息请参阅 Java switch-case String 示例

59. Java 是按值传递还是按引用传递?

这是一个非常令人困惑的问题,我们知道对象变量包含堆空间中对象的引用。当我们调用任何方法时,这些变量的副本会被传递并存储在方法的堆栈内存中。我们可以通过一个简单的通用交换方法来测试任何语言是按引用传递还是按值传递的,要了解更多信息,请阅读《Java是按值传递而不是按引用传递》。

堆内存和栈内存之间的主要区别如下:

  • 堆内存被应用程序的所有部分使用,而栈内存仅被一个执行线程使用。
  • 每当创建对象时,它总是存储在堆空间中,而栈内存包含对它的引用。栈内存仅包含本地基本变量和对堆空间中对象的引用变量。
  • 堆栈中的内存管理以LIFO方式进行,而堆内存中的内存管理更为复杂,因为它在全局范围内使用。

有关详细说明和示例程序,请阅读《Java堆内存与栈内存》。

61. Java编译器存储在JDK、JRE还是JVM中?

Java编译器的任务是将Java程序转换为字节码,我们有javac可执行文件来完成这项任务。因此,它必须存储在JDK中,我们在JRE中不需要它,而JVM只是规范。

62. 以下程序的输出是什么?

上下文:类中的静态方法

package com.journaldev.util;

public class Test {

	public static String toString(){
		System.out.println("Test toString called");
		return "";
	}
	
	public static void main(String args[]){
		System.out.println(toString());
	}
}

答案:代码无法编译,因为我们不能在Object类方法中使用static关键字。请注意,Object类具有toString()方法。您将收到编译时错误,内容为“This static method cannot hide the instance method from Object”。原因是静态方法属于类,由于每个类的基类都是Object,我们无法在实例中和类中拥有相同的方法。如果您将方法名称从toString()更改为在超类Object中不存在的其他内容,则不会收到此错误。

上下文:静态方法调用

package com.journaldev.util;

public class Test {

	public static String foo(){
		System.out.println("Test foo called");
		return "";
	}
	
	public static void main(String args[]){
		Test obj = null;
		System.out.println(obj.foo());
	}
}

答案: 这是一个奇怪的情况。我们都见过 NullPointerException 当我们在一个空对象上调用方法时。但是在这里,这个程序会正常工作并打印出“Test foo called”。

这是因为Java编译器的代码优化。当Java代码编译为字节码时,它会发现 foo() 是一个静态方法,并且应该使用类来调用。所以它将方法调用 obj.foo() 改变为 Test.foo() ,因此没有 NullPointerException

I must admit that it’s a very tricky question and if you are interviewing someone, this will blow his mind off. ?

这就是关于核心Java面试问题和答案的全部内容。如果您认为我漏掉了重要的问题,请通过评论让我知道,我会继续添加到列表中。

Source:
https://www.digitalocean.com/community/tutorials/core-java-interview-questions-and-answers