最新的Java面试题请参考以下文章 – Java 面试问题 – 新鲜和经验丰富 (2023)

Java 是最流行和使用最广泛的编程语言之一,是由 James Gosling 于 1982 年开发的平台。它基于面向对象编程的概念。平台是开发和运行用任何编程语言编写的程序的环境。 Java 是一种高级、面向对象、安全、健壮、平台无关、多线程和可移植的编程语言。它主要用于编程、窗口、基于 Web、企业和移动应用程序。

由于其功能和性能,Java 是 Uber、Airbnb、Google、Netflix、Instagram、Spotify、Amazon 等顶级公司最常用的语言。要进入这些公司和其他软件公司,您需要掌握一些重要的 Core Java 面试问题,以破解他们的 Java 在线评估轮和 Java 技术面试。

这篇核心Java编程面试题文章是在Java大师的指导下,结合学生最近的Java面试经验编写的。

新生的核心 Java 面试问题

Q1.解释 JVM、JRE 和 JDK。 

JVM(Java 虚拟机): JVM(Java 虚拟机)充当运行时引擎来运行 Java 应用程序。 JVM 是调用 Java 代码中存在的 main 方法的地方。 JVM是JRE(Java运行时环境)的一部分。

JRE(Java运行时环境): JRE 是指可以执行 Java 字节码的运行时环境。它实现了 JVM(Java 虚拟机)并提供 JVM 在运行时使用的所有类库和其他支持文件。 JRE 是一个软件包,其中包含运行 Java 程序所需的内容。它是物理存在的 JVM 的实现。 

JDK(Java开发工具包): 它是编译、文档和打包Java程序所必需的工具。 JDK 完全包含 JRE,其中包含供 Java 程序员使用的工具。 Java 开发工具包免费提供。除了 JRE 之外,它还包括解释器/加载器、编译器 (javac)、归档器 (jar)、文档生成器 (Javadoc) 以及 Java 开发所需的其他工具。简而言之,它包含JRE+开发工具。

Q2。解释 public static void main(String args[])。 

  • 民众: Public 是一个访问修饰符。公共意味着任何类都可以访问该方法。 
     
  • 静止的: 它是 Java 中的一个关键字,将其标识为基于类,即无需创建类的实例即可访问它。由于我们希望 main 方法也能在没有任何实例的情况下执行,因此我们使用 static。 
     
  • 空白: 它是方法的返回类型。 void 定义不会返回任何值的方法。 
     
  • 主要的: 这是 JVM 执行的第一个方法。方法的签名必须相同。

Q3。为什么Java是平台无关的?

平台独立性实际上意味着“一次编写,随处运行”。 Java之所以被称为Java是因为它 字节码 它可以在任何系统上运行,无论其底层操作系统如何。

Q4。为什么Java不是纯粹的面向对象? 

Java 不被认为是纯粹的面向对象,因为它支持基本数据类型,例如 boolean、byte、char、int、float、double、long 和 Short。

Q5.定义类和对象。通过使用 Java 的示例来解释它们。 

  • 班级: 类是用户定义的蓝图或原型,从中创建对象。它表示一种类型的所有对象所共有的一组属性或方法。一般来说,类声明可以按顺序包含这些组件。
     
  • 超类(如果有): 类的父类(超类)的名称(如果有),前面带有关键字 extends。一个类只能扩展(子类)一个父类。
     
  • 接口: 由类实现的接口的逗号分隔列表(如果有),前面带有关键字implements。一个类可以实现多个接口。
     
  • 目的: 它是面向对象编程的基本单元,代表现实生活中的实体。典型的 Java 程序创建许多对象,如您所知,这些对象通过调用方法进行交互。一个对象由以下部分组成:
     
  • 状态: 它由对象的属性来表示。它还反映了对象的属性。
     
  • 行为: 它由对象的方法表示。它还反映了一个对象对其他对象的响应。
     
  • 身份: 它为对象提供唯一的名称,并使一个对象能够与其他对象交互。 

例如,Employee 是一个类的示例。具有唯一标识的特定员工是对象的一个​​示例。  

class Employee {    // 实例变量声明    // 方法定义 }

员工对象是具体的员工

员工 empObj = new Employee();

Employee 的对象之一由“empObj”引用 

Q6.什么是方法?提供方法的多个签名。

  • Java 方法是执行任务的一组语句。方法被放置在类中。 
  • 方法签名:方法的名称、返回类型和参数数量构成方法签名。 
  • 方法的签名中可以包含以下元素: 
    • 访问说明符 – 公共、私有、受保护等(非强制) 
    • 访问修饰符 – static、synchronized 等(非强制) 
    • 返回类型 – void、int、String 等(强制)
    • 方法名称 – show()(强制) 
    • 带或不带参数 – (int number, String name); (括号为必填项) 

例子:

Q7.解释实例变量和类变量之间的区别。 

实例变量是每个对象/实例都有一个副本的变量。这意味着每个对象都会有它的一个副本。类变量是每个类都有一个副本的变量。类变量在对象中不会有副本。 

例子:

empObj1 引用的对象是使用以下命令创建的: 

员工 empObj1 = new Employee();

实例变量 empObj1 和 empObj2 引用的对象具有单独的副本 empNo、empName、department 和 salal。但是,officePhone 属于类(类变量),并且可以作为 Employee.officePhone 进行访问。 

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

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

Q9. Java 中的构造函数是什么? 

在Java中,构造函数是指用于初始化对象的代码块。它必须与类的名称相同。此外,它没有返回类型,并且在创建对象时自动调用。 
如果类没有显式声明任何内容,Java 编译器会自动提供无参构造函数,也称为默认构造函数。 
此默认构造函数调用类父类的无参构造函数(因为它只包含一个语句,即 super();),或者如果该类没有其他父类,则调用 Object 类构造函数(因为 Object 类是所有类的父类,或者直接调用或间接)。 

有两种类型的构造函数:

  1. 默认构造函数
  2. 参数化构造函数

Q10.在 Java 中创建对象有哪些不同的方法? 

在 Java 中创建对象的方法有很多种。

        1  使用新关键字
        2  使用新实例
        3  使用clone()方法
        4  使用反序列化
        5  使用构造函数类的 newInstance() 方法

Q11.静态方法和静态变量的用途是什么? 

当需要在类的多个对象之间共享方法或变量而不是为每个对象创建单独的副本时,我们使用 static 关键字使方法或变量为所有对象共享。 

静态变量: 静态变量也称为类变量。 

  • 这些变量的声明方式与实例变量类似,不同之处在于静态变量是在任何方法构造函数或块之外的类中使用 static 关键字声明的。 
  • 与实例变量不同,无论我们创建多少个对象,每个类只能拥有一个静态变量的副本。  
  • 静态变量在程序执行开始时创建,并在执行结束时自动销毁。 
  • 要访问静态变量,我们不需要创建该类的对象。 

静态方法: 无需创建对象即可访问静态方法。只需使用类名即可访问该方法。静态方法只能访问静态变量,不能访问局部或全局非静态变量。

例如:

Q12.为什么静态方法不能访问非静态变量或方法? 

静态方法无法访问非静态变量或方法,因为无需实例化类即可访问静态方法,因此如果未实例化类,则变量不会初始化,因此无法从静态方法访问。
 

Q13.什么是静态类? 

如果类的所有变量和方法都是静态的并且构造函数是私有的,则可以说该类是静态类。将构造函数设置为私有将阻止该类被实例化。因此访问的唯一可能性是仅使用类名称。

Q14.解释一下Java中有多少种类型的变量? 

Java中的变量分为三种类型:

  1. 局部变量
  2. 实例变量
  3. 静态变量

局部变量: 在块、方法或构造函数中定义的变量称为局部变量。这些变量在进入块或调用函数时创建,并在退出块后或从函数返回时销毁。这些变量的作用域仅存在于声明该变量的块内。即我们只能在该块内访问这些变量。 
 

输出:  

局部变量的值为:11

在上面的程序中,变量 localVar 是函数 getLocalVarValue() 的局部变量。如果我们在 getLocalVarValue() 函数之外使用变量 localVar,编译器将产生错误“找不到符号 localVar”。

实例变量: 实例变量是非静态变量,在任何方法、构造函数或块之外的类中声明。由于实例变量是在类中声明的,因此这些变量在类的对象创建时创建,并在对象销毁时销毁。与局部变量不同,我们可以对实例变量使用访问说明符。如果我们不指定任何访问说明符,则将使用默认的访问说明符。 

在上面的程序中,变量(即instanceVarId、instanceVarName)是实例变量。如果我们有多个对象,如上面的程序,每个对象都有自己的实例变量副本。从上面的输出可以清楚地看出,每个对象都有自己的实例变量副本。

静态变量: 静态变量也称为类变量。 

  • 这些变量的声明方式与实例变量类似,不同之处在于静态变量是在任何方法构造函数或块之外的类中使用 static 关键字声明的。
  • 与实例变量不同,无论我们创建多少个对象,每个类只能拥有一个静态变量的副本。
  • 静态变量在程序执行开始时创建,并在执行结束时自动销毁。

要访问静态变量,我们不需要创建该类的对象,我们可以简单地访问变量: 
 

在上面的程序中,stVarObj1 和 stVarObj2 共享相同的静态变量 count 实例,因此如果该值增加一个对象,则增加的值将反映在 stVarObj1 和 stVarObj2 中。

Q14. Set 和 List 接口有什么区别?  

Set 和List 都是Collection 接口的子接口。它们之间有以下两个主要区别

  1. List 可以保存重复的值,但 Set 不允许这样做。
  2. 在 List 接口中,数据按照插入的顺序出现,但在 Set 的情况下,不会保留插入顺序。

Q15. StringBuffer 和 String 有什么区别?  

String 类是一个不可变类,即一旦创建就无法修改其内容。而 StringBuffer 是一个可变类,这意味着您可以稍后更改其内容。每当我们更改 String 对象的内容时,它都会创建一个新字符串并引用该字符串,但不会修改现有字符串。这就是 StringBuffer 的性能优于 String 的原因。 

Q16.什么时候使用 super 关键字?  

super 关键字用于指代:

  • 直接父类构造函数,
  • 直接父类变量,
  • 直接父类方法。

详情请参阅超级。 

Q17. Java中HashMap和HashTable的区别。 

  • HashMap 是非同步的。它不是线程安全的,如果没有正确的同步代码,就不能在多个线程之间共享,而 Hashtable 是同步的。它是线程安全的,可以与多个线程共享。 
  • HashMap 允许一个空键和多个空值,而 Hashtable 不允许任何空键或值。 
  • 如果不需要线程同步,HashMap 通常优于 HashTable。

更多详细信息请参阅 HashMap 和 HashTable。

Q18.如果从 main 方法中删除 static 修饰符会发生什么? 

程序编译成功。但在运行时会抛出错误“NoSuchMethodError”。 

Q19.我们可以重载 main() 方法吗? 

Java中的主要方法不是外星方法。除了 main() 就像任何其他方法一样并且可以类似地重载这一事实之外,JVM 总是寻找方法签名来启动程序。  

  • 普通的 main 方法充当 JVM 开始执行程序的入口点。
  • 我们可以重载Java中的main方法。但是当我们运行你的程序时,程序并不会执行重载的main方法,我们只需要从实际的main方法中调用重载的main方法。

Q20。 Java 中的包装类是什么?

包装类将 Java 原语转换为引用类型(对象)。每个原始数据类型都有一个专用于它的类。这些被称为包装类,因为它们将原始数据类型“包装”到该类的对象中。

Q21.为什么Java中不使用指针?

Java 不使用指针,因为它们不安全并且会增加程序的复杂性。由于Java以其代码简单而闻名,因此添加指针的概念会产生矛盾。此外,由于 JVM 负责隐式内存分配,因此为了避免用户直接访问内存,Java 中不鼓励使用指针。

Q22. Java中集合的含义是什么?

集合是一个框架,旨在存储对象并操纵设计来存储对象。

集合用于执行以下操作:

  • 搜寻中
  • 排序
  • 操纵
  • 插入
  • 删除

一组对象称为集合。所有用于收集的类和接口都可以在 Java util 包中找到。

Q23.什么是同步?

同步使得一次只有一个线程访问一个代码块。如果多个线程访问代码块,那么最终有可能得到不准确的结果。为了避免这个问题,我们可以为敏感代码块提供同步。

同步的 关键字意味着线程需要一个键来访问同步代码。

每个 Java 对象都有一个锁。一把锁只有一把钥匙。仅当线程可以获得要锁定的对象的键时,该线程才能访问同步方法。锁是针对每个对象的。

有关详细信息,请参阅同步。

Q24.同步的缺点是什么?

不建议同步实现所有方法。因为如果一个线程访问同步代码,那么下一个线程就必须等待。所以它会使另一端的性能变慢。

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

对象类是 Java 中所有其他类的超类。