📜  Java编程面试常见问题 |设置 2

📅  最后修改于: 2022-05-13 01:55:28.170000             🧑  作者: Mango

Java编程面试常见问题 |设置 2

在本文中,讨论了一些最重要的Java面试问题和答案,让您在面试中处于领先地位。 Java是最流行和广泛使用的编程语言和平台之一。 Java快速、可靠且安全。从桌面到 Web 应用程序,从科学超级计算机到游戏机,从手机到 Internet, Java被用于每个角落。这就是为什么如果你想脱颖而出,你应该掌握这些问题。

让我们先来看看一些最常见的Java面试问题,

  • 我们可以在Java中重载或覆盖静态方法吗?
  • 为什么 main 方法在Java中是静态的?
  • 如果从 main 方法中删除 static 修饰符会发生什么?
  • 在以下情况下, Java中变量的范围是什么?
  • Java中的“this”关键字是什么?
  • 什么是抽象类? Java中的抽象类与 C++ 有何相似或不同?
  • 哪个类是每个类的超类?
  • 我们可以重载 main() 方法吗?
  • 什么是对象克隆?
  • C++ 中的继承与Java有何不同?
  • 为什么通过更改Java中的返回类型无法实现方法重载?
  • 我们可以覆盖Java中的私有方法吗?
  • 什么是空白最终变量?
  • Java中的“super”关键字是什么?
  • Java中的静态变量是什么?
  • Java中HashMap和HashTable的区别。
  • Java对象是如何存储在内存中的?
  • Java中缺少哪些 C++ 功能?

因此,让我们从Java面试问题集开始吧。

Q1。我们可以在Java中重载或覆盖静态方法吗?

  • 覆盖:覆盖与运行时多态性有关。子类(或派生类)在运行时提供超类(或基类)中方法的特定实现。
  • 重载:重载与编译时(或静态)多态性有关。此功能允许不同的方法具有相同的名称,但不同的签名,特别是输入参数的数量和输入参数的类型。
  • 我们可以重载静态方法吗?答案是“是” 。我们可以有两个或多个同名但输入参数不同的静态方法
  • 我们可以覆盖Java中的静态方法吗?我们可以在子类中声明具有相同签名的静态方法,但它不被视为重写,因为不会有任何运行时多态性。因此答案是“否” 。静态方法不能被覆盖,因为方法覆盖只发生在方法的动态(即运行时)查找的上下文中。静态方法(按其名称)是静态查找的(即在编译时)。

阅读更多

Q2。为什么 main 方法在Java中是静态的?
该方法是静态的,否则会有歧义:应该调用哪个构造函数?特别是如果您的班级看起来像这样:

public class JavaClass
{
  protected JavaClass(int x)
  {   }
   public void main(String[] args) 
   {

    }
}

JVM 应该调用 new JavaClass(int) 吗?它应该为 x 传递什么?如果不是,JVM 是否应该在不运行任何构造方法的情况下实例化 JavaClass?因为这将使您的整个类成为特例——有时您有一个尚未初始化的实例,您必须在每个可以调用的方法中检查它。有太多的边缘情况和歧义,以至于 JVM 在调用入口点之前必须实例化一个类是有意义的。这就是为什么 main 是静态的。

Q3。如果从 main 方法中删除 static 修饰符会发生什么?
程序编译成功。但在运行时会抛出错误“NoSuchMethodError”。


Q4。在以下情况下, Java中变量范围是什么?

  • 成员变量(类级别范围):成员变量必须在类内(任何函数外)声明。它们可以在课堂的任何地方直接访问
  • 局部变量(方法级作用域):在方法内声明的变量具有方法级作用域,不能在方法外访问。
  • 循环变量(块范围):在方法中的一对括号“{”和“}”内声明的变量仅在括号内具有范围。

阅读更多

Q5。 Java中的“this”关键字是什么
在实例方法或构造函数中,this 是对当前对象的引用——调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。
这个关键字的使用

  • 用于引用当前类实例变量。
  • 调用当前类构造函数。
  • 它可以作为方法调用中的参数传递。
  • 它可以在构造函数调用中作为参数传递。
  • 用于返回当前类实例。
  • 用于调用当前类方法(隐式)

Q6。什么是抽象类? Java中的抽象类与 C++ 有何相似或不同?
抽象类是包含一个或多个抽象方法的类。抽象方法是一种已声明但不包含实现的方法。抽象类可能不会被实例化,并且需要子类来提供抽象方法的实现。

  • 与 C++ 一样,在Java中,无法创建抽象类的实例,但我们可以拥有抽象类类型的引用。
  • 与 C++ 一样,抽象类可以包含Java中的构造函数。并且在创建继承类的实例时调用抽象类的构造函数
  • 在Java中,我们可以有一个没有任何抽象方法的抽象类。这允许我们创建无法实例化但只能被继承的类。
  • 抽象类也可以有最终方法(不能被覆盖的方法)。例如,以下程序编译并运行良好。

阅读更多

问题 7。哪个类是每个类的超类?
对象类

Q8。我们可以重载 main() 方法吗?
Java中的主要方法是没有地外方法。除了 main() 就像任何其他方法一样并且可以以类似的方式重载之外,JVM 总是寻找方法签名来启动程序。

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

阅读更多

问题 9。什么是对象克隆
对象克隆意味着创建原始对象的精确副本。如果一个类需要支持克隆,它必须实现Java.lang.Cloneable 接口并覆盖 Object 类的 clone() 方法。 clone() 方法的语法是:

protected Object clone() throws CloneNotSupportedException

如果对象的类没有实现 Cloneable 接口,那么它会抛出异常 'CloneNotSupportedException' 。

阅读更多

问题 10。 C++中的继承与Java有何不同?

  1. 在Java中,所有类都直接或间接地继承自 Object 类。因此, Java中总是存在一个类的单一继承树,而 Object 类是树的根。
  2. 在Java中,祖父类的成员不能直接访问。有关更多详细信息,请参阅此 G-Fact。
  3. 在Java中受保护的成员访问说明符的含义有些不同。在Java中,类“A”的受保护成员可以在同一个包的其他类“B”中访问,即使 B 不是从 A 继承的(它们都必须在同一个包中)。
  4. Java使用extends关键字进行继承。与 C++ 不同, Java不提供像 public、protected 或 private 这样的继承说明符。因此,我们不能更改Java中基类成员的保护级别,如果某些数据成员在基类中是公共的或受保护的,那么它在派生类中仍然是公共的或受保护的。与 C++ 一样,基类的私有成员在派生类中不可访问。
    与 C++ 不同,在Java中,我们不必记住那些由基类访问说明符和继承说明符组合而成的继承规则。
  5. 在Java中,方法默认是虚拟的。在 C++ 中,我们显式地使用 virtual 关键字。有关更多详细信息,请参阅此 G-Fact。
  6. Java对接口使用单独的关键字interface ,对抽象类和抽象函数使用abstract关键字。
  7. 与 C++ 不同, Java不支持多重继承。一个类不能从多个类继承。但是,一个类可以实现多个接口。
  8. 在C++中,会自动调用父类的默认构造函数,但是如果我们要调用父类的参数化构造函数,就必须使用Initializer list。和 C++ 一样, Java中会自动调用父类的默认构造函数,但如果要调用参数化构造函数,则必须使用 super 调用父构造函数。

在此处查看示例

问题 11。为什么通过更改Java中的返回类型无法实现方法重载?
在 C++ 和Java中,只有返回类型不同的函数不能被重载。函数的返回类型不是编译器生成的用于唯一标识每个函数的错位名称的一部分。 No of arguments, Type of arguments & Sequence of arguments 是用于为每个函数生成唯一的重整名称的参数。即使名称相同(重载),编译器也可以基于这些独特的错位名称来理解要调用哪个函数。


问题 12。我们可以覆盖Java中的私有方法吗?
不,私有方法不能被覆盖,因为它对任何其他类都不可见。阅读更多


问题 13。什么是空白最终变量
Java中的 final 变量只能被赋值一次,我们可以在声明中或之后赋值。

final int i = 10;
    i = 30; // Error because i is final.

Java中的空白最终变量是在声明期间未初始化的最终变量。下面是一个空白final的简单例子。

// A simple blank final example 
    final int i;
    i = 30;

阅读更多

问题 14。 Java中的“super”关键字是什么
Java中的super关键字是一个引用变量,用来引用父类对象。关键词“super”带着继承的概念出现了。每当您创建子类的实例时,都会隐式创建父类的实例,即由超引用变量引用。
Java super关键字的各种使用场景:

  • super 用于引用直接父实例变量
  • super用于调用父类方法
  • super() 用于调用直接父构造函数

阅读更多

问题 15。 Java中的静态变量是什么
Java中的static关键字主要用于内存管理。我们可以将Java static 关键字应用于变量、方法、块和嵌套类。 static 关键字属于类而不是类的实例。

静态可以是:

  • 变量(也称为类变量)
  • 方法(也称为类方法)
  • 堵塞
  • 嵌套类

问题 16。 Java中HashMap和HashTable的区别
1. HashMap 不同步。它不是线程安全的,并且在没有适当的同步代码的情况下不能在多个线程之间共享,而 Hashtable 是同步的。它是线程安全的,可以与许多线程共享。
2. HashMap 允许一个空键和多个空值,而 Hashtable 不允许任何空键或空值。
3. 如果不需要线程同步,一般首选HashMap而不是HashTable
阅读更多

问题 17。 Java对象是如何存储在内存中的
在Java中,所有对象都在堆上动态分配。这与 C++ 中的对象可以在堆栈或堆上分配内存不同。在 C++ 中,当我们使用 new() 分配对象时,对象分配在堆上,否则如果不是全局或静态的,则在堆栈上分配。
在Java中,当我们只声明一个类类型的变量时,只会创建一个引用(不为对象分配内存)。要将内存分配给对象,我们必须使用 new()。所以对象总是在堆上分配内存。阅读更多


问题 18。 Java中缺少哪些 C++ 功能?
在看到答案之前尝试自己回答这个问题 - 在这里。

也可以看看:

  • Java面试常见问题 |设置 1
  • Java专业人士的面试问题
  • Java多项选择题
  • 练习编码问题
  • Java文章