2020最全Java面试题--基础篇

时间:2022-07-28
本文章向大家介绍2020最全Java面试题--基础篇,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

基础篇

1. JDK和JRE有什么区别?

  • JDK:Java Development Kit的简称,Java开发工具包,它提供了Java程序的开发环境和运行环境,同时包括编译Java程序的编译器和调试器。
  • JRE:Java Runtime Environment的简称,Java运行环境,JRE提供Java程序运行所需的环境(运行库和JVM,不包括编译器),注:JDK工具包括JRE。

2. 什么是Java Virtual Machine(JVM)?

Java Virtual Machine(JVM)是一个抽象的计算机,能够执行Java字节码。能针对不同的软件和硬件提供不同的JVM。因此JVM是平台独立的,JVM在平台上负责执行指令、字节码加载、检查和执行,同时还要管理数据、内存和寄存器。

Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode)。字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 JVM 上。JVM 在执行字节码文件时,把字节码解释成具体的机器指令执行。

Java 程序可以经解释器得到字节码,所生成的字节码经过精心设计,并进行优化,提高了运行速度。现在的 Java 版本中又加入了即时编译功能(just-in-time 编译器,简称 JIT 编译器),编译器将字节码转换成本机的机器代码,然后能够以较高速度执行,使得执行效率大幅度提高,基本达到了编译语言的水平。

3. JVM分配哪些不同类型的内存区域?

在Java中,JVM将内存分配给不同的进程,方法和对象。 JVM分配的一些内存区域是:

  1. 类加载器:在JVM中用来加载类文件
  2. 类(方法)区:它存储每个类的结构,例如运行时常量池,字段和方法数据以及方法代码。
  3. 堆:堆创建了一个运行时,它包含在其中分配对象的运行时数据区域。
  4. 栈:栈在运行时存储局部变量和部分结果。 它还有助于方法调用和返回值。 每个线程在创建线程时都会创建一个私有JVM栈。
  5. 程序计数寄存器:该存储区包含当前正在执行的Java虚拟机指令的地址。
  6. 本地方法栈:该区域保留用于应用程序中使用的所有本机方法。

4. 什么是JIT?

即时编译器(Just In Time,也称为JIT编译器)用于提高Java的性能。 默认情况下启用。 它是在执行时(而不是更早)完成的。 Java通过将JIT编译器包含在JVM中来普及其使用。

5. Java平台与其他平台有何不同?

Java是与平台无关的语言。 Java编译器将Java代码转换为可由JVM解释的字节代码。 JVM为世界上几乎所有流行的平台编写。

Java字节码可以相同的方式在任何受支持的平台上运行。 与其他语言一样,需要为特定平台编译的库才能运行。

6. 为什么说Java是“write once and run anywhere”的语言?

你可以在Windows平台编写Java代码,同时在Windows上编译它。在Windows上编写的类和jar文件能够运行在Unix环境下。所以Java是真正的平台无关的语言。

所有这些可移植性的背后是Java字节码。 Java编译器生成的字节码可以由任何JVM解释。 因此,用Java编写程序并期望它们可以在任何平台上运行变得容易得多。 Java编译器javac编译Java代码,而JVM java运行该代码。

javac HelloWorld.java
java HelloWorld

7. Java中的类加载器是怎么工作的?

在Java中,ClassLoader是用于在JVM中加载文件的类。 ClassLoader从其物理文件位置加载文件,例如 文件系统,网络位置等。

Java中有三种主要的类加载器:

  1. Bootstrap ClassLoader(启动类加载器)。第一种类加载器,负责加载Java_HOME/lib目录中的类库,或通过-Xbootclasspath参数指定路径中被虚拟机认可的类库
  2. Extension ClassLoader(扩展类加载器)。从jre/lib/ext等位置加载类文件,或通过java.ext.dirs系统变量加载指定路径中的类库。
  3. Application ClassLoader(应用程序类加载器)。这一种取决于 CLASSPATH,负责加载用户路径(classpath)上的类库。如果你指定了CLASSPATHjars,那么类加载器就会加载它们。

除了上述3种类加载器,我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。

8. 你认为用于main方法的“ main”是Java中的关键字吗?

不,main只是方法的名称。 一个类文件中可以有多个具有相同名称main的方法。 它不是Java中的关键字。

9. 我们可以将main方法写为public void static而不是public static void吗?

不,你不能这样写。 任何方法都必须首先指定修饰符,然后再指定返回值。 修饰符的顺序可以更改。 我们可以编写static public void main(),而不是public static void main()

10.在Java中,如果我们不为局部变量指定任何值,那么局部变量的默认值是什么?

Java不会使用任何默认值初始化局部变量。 因此,这些变量默认情况下将为null。

11.假设我们在不传递任何参数的情况下运行Java类。 Main方法中参数的String数组的值是什么?

默认情况下,Java中参数的String数组的值为空。

12.Java中的字节和字符数据类型有什么区别?

byte和char都是Java中的数字数据类型。 它们用于表示特定范围内的数字。 它们之间的主要区别是字节可以存储原始二进制数据,而char则可以存储字符或文本数据。

char的用法是 char ch ='x';

字节值的范围是-128至127。

一个字节由8位组成。 但是一个char由16位组成。 因此,它相当于2个字节。

面向对象篇

1. 面向对象编程(Oject Oriented Programming)的主要思想是什么?

  • 抽象(Abstraction)
  • 封装(Encapsulation)
  • 继承(Inheritance)
  • 多态(Polymoriphism)

2. 面向对象编程语言和基于对象编程语言有什么区别?

答:面向对象编程的语言,像Java、C++遵循--封装、抽象、多态和继承等面向对象编程的概念。

基于对象编程的语言遵循一些面向对象语言的特点,但是不提供多态和继承的支持。比如:Javascript、VBScript等。

基于对象的编程语言提供对对象的支持,您可以从构造函数中构建对象。 他们的语言还支持封装。 这些也称为面向原型的语言。

3. 在Java中,定义为对象中的实例变量的对象引用的默认值是什么?

Java中所有的实例变量的对象引用默认为null。

4. 为什么需要构造函数?

Java是一种面向对象的语言,我们可以在其中创建和使用对象。构造函数是一段类似于方法的代码。它用于创建对象并设置对象的初始状态。

构造函数是一个特殊的函数,具有与类名相同的名称。

没有构造函数,就没有其他方法可以创建对象。

默认情况下,Java为每个对象提供默认的构造函数。如果我们重载了一个构造函数,那么必须实现这个默认的构造函数。

5. 为什么Java类中需要默认构造器?

如果没有定义其他构造函数,则默认构造函数是Java会自动生成的无参构造函数。

根据Java规范,如果类中没有重载的构造函数,它将提供一个默认的构造函数。但这并没有说明在类中编写重载构造函数的情况。

我们至少需要一个构造函数来创建一个对象,这就是Java提供默认构造函数的原因。

当我们重载了构造函数后,Java会假定我们希望在代码中进行一些自定义处理。由于此原因,它不提供默认构造函数。但是它需要按照规范的默认构造函数。因此,它会给出错误。

6. Java中的默认构造器返回的值是什么?

当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。

7. 我们能继承构造函数吗?

不能,Java不支持构造函数的继承。

8. 为什么在Java中构造函数不能是final,static或abstract?

如果将方法设置为final,则意味着我们不希望任何类覆盖它。 但是构造函数(按照Java语言规范)不能被覆盖。 因此,没有必要将其标记为final

如果我们将方法设置为抽象方法,则意味着它没有主体,应在子类中实现。 但是,当使用new关键字时,将隐式调用构造函数。 因此,它需要一个body。

如果我们将方法设置为static,则意味着它属于该类,但不属于特定对象。 始终调用构造函数来初始化对象。 因此,没有使用标记构造函数为静态的。

继承

1. this关键字的作用?

在Java中,”this“关键字是指对象的当前实例。this调用本类中的属性,也就是类中的成员变量。

this调用本类中的其他方法

this可以用来调用构造函数,或者用来引用实例。

this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用

2. 解释一下继承的概念

继承是面向对象编程概念中一个很重要的概念。一些对象具有某些特征和行为。通过使用继承,我们可以将常见的行为和特征放在基类(父类)中。

然后所有具有共同行为的对象都将从该基类继承。类似于“is-a”关系。

继承增加代码的可重用性、方法重写和多态性。

3. Java中所有类的父类是什么?

Java是一种面向对象的编程语言。在Java中,Object 类是其他所有类的父类。

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

多重继承意味着一个类可以从两个或者多个父类中继承行为。

多重继承的问题在于,对于同一个方法,两个父类可能具有不同的实现。因此,他们有不同的方式来做同一件事。在这种情况下,子类该选择哪种实现?

这导致多重继承中的歧义,所以Java在实现中不支持多重继承。

但是在Java中可以实现(implement)多个接口(interfaces)。

5. 在OOP中,组合是什么意思?

组合是整体和个体之间的关系,即has-a的关系,“has-a”关系涉及两个类。例如,Class Car有方向盘。

如何一个类拥有另一个的实例,则称为组合。

6.聚合和组合的区别?

在OOPS中,聚合和组合是关联关系的类型。 组合是强关系。 如果组合对象被破坏,那么其所有部分都将被破坏。 例如。 汽车有方向盘。 如果Car对象被破坏,那么方向盘就没有意义。 在聚合中,该关系比组合弱。例如。 图书馆有学生。 如果图书馆被毁,学生仍然存在。 因此,图书馆和学生是通过聚合关联的。

图书馆有书。 如果图书馆被销毁,则书籍也将被销毁。 没有图书馆就不可能存在图书馆的书籍。 因此,书籍和图书馆是组合关系。

7. 为什么Java中没有指针?

在Java中,有引用而不是指针。 这些引用指向内存中的对象。 但是不能直接访问这些存储位置。 JVM可以自由地在VM内存中移动对象。

缺少指针有助于Java有效地管理内存和垃圾回收。 此外,它还方便为开发人员提供有效的内存分配和释放。

8.如果Java中没有指针,那为什么我们会得到NullPointerException?

在Java中,指针是等同于对象引用。 当我们使用。 它指向对象的引用。 因此,JVM使用指针,但是程序员仅看到对象引用。

如果对象引用指向空对象,并且我们尝试访问其上的方法或成员变量,则将获得NullPointerException。

9. Java中“ super”关键字的目的是什么?

“ super”关键字用于子类的方法或构造函数中。 它指对象的直接父类。

通过使用“ super”,我们可以从子类的方法中调用父类的方法。

我们也可以使用“ super”关键字从子类的构造函数中调用父类的构造函数。

10.是否可以在同一构造函数中同时使用this()和super()?

不,Java不允许在同一构造函数中同时使用super()this()。 根据Java规范,super()this()必须是构造函数中的第一条语句。

11. Java中的对象克隆是什么意思?

Object.clone()方法用于在Java中创建对象的完全拷贝。 它的行为就像复制一个构造函数。 它创建并返回对象的副本,该对象具有相同的类,并且所有字段的值与原始对象的值相同。 克隆的一个缺点是返回类型是Object。 必须将其显式转换为实际类型。