颍上人才网
颍上职场资讯
颍上面试技巧
正文:Java 面试题总结:巩固知识,为校招做好准备
Java 面试题总结:巩固知识,为校招做好准备
来源:网络整理2024-10-30

写在前面

之前收集整理过一篇文章《Java线程面试题》,反响还不错,这也促使我有写这篇文章的冲动。

学了几年Java,做过一些项目,但总感觉很多小知识点没有掌握好。面对校招,借此机会总结一下我遇到的一些常见的Java面试问题。我希望巩固自己的Java知识,为面试做准备。

参考文档:

115 个 Java 面试问题和答案 – 终极列表(第 1 部分):

经典Java基础面试题合集:

《Java程序员面试指南》第11章面向对象·11.1面向对象的基本概念:

100道JAVA面试题第1部分:

面向对象

1. 面向对象编程有哪些特点?

[包裹]

封装为对象提供了隐藏内部特征和行为的能力。外界无法直接访问这些封装后的数据,从而保证了这些数据的正确性。同时,该对象提供了一些可以被其他对象访问的方法来改变其内部数据。在Java中,修饰符分为三种:public、private、protected。每个修饰符为位于同一包或不同包中的其他对象提供不同的访问权限。

下面列出了使用封装的一些好处:

- 通过隐藏对象的属性来保护对象的内部状态。

- 提高代码的可用性和可维护性,因为对象的行为可以单独更改或扩展。

- 禁止对象之间的不良交互以提高模块化程度。

[多态性]

多态是指程序中定义的引用变量所指向的具体类型以及通过引用变量发出的方法调用并不是在编程时确定的,而是在程序运行时确定的。也就是说,引用变量将指向哪个类实例对象,以及哪个类实现引用变量发出的方法调用,都必须在程序运行过程中确定。因为具体的类只有在程序运行时才确定,所以引用变量可以在不修改源程序代码的情况下绑定到各种类的实现上,导致引用调用的具体方法也随之改变,即不需要被修改。程序代码可以改变程序运行时绑定的具体代码,让程序选择多种运行状态。这就是多态性。多态性增强了软件的灵活性和可扩展性。

[继承]

继承使对象能够从基类获取字段和方法。继承提供了代码的重用以及向现有类添加新功能而无需修改它们的能力。

[抽象的]

抽象是将想法与具体实例分离的步骤,从而根据类的功能而不是实现细节来创建类。 Java 支持创建仅公开接口但不包含方法实现的抽象类。这种抽象技术的主要目的是将类的行为与实现细节分开。

2. 对象和实例有什么区别?

分析:Java的内存分配中,对象和实例是不同的。前者分配在内存堆中,后者分配在堆栈中。至于为什么这么划分,可以参考其他资料。对象是不可变的东西。它是对客观事物的抽象。实例是对操作对象的引用。您不能直接操作对象。

答:从宏观上看,对象和实例的区别在于:对象是同类事物的抽象表达,而实例是对象的具体化。一个对象可以实例化很多实例,该对象就是一个模型,实例是根据这个模型产生最终产品的。实际上是这样的,一个对象可以实例化N个实例。就像基于一种模型可以制造多种实际产品一样。

Java基础知识

1.什么是Java虚拟机?为什么Java被称为“平台无关的编程语言”? Java的“一次编写,随处运行”是如何实现的?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。 Java源文件被编译成可由Java虚拟机执行的字节码文件。 Java 的设计目的是允许应用程序在任何平台上运行,而不需要程序员为每个平台单独重写或重新编译它们。 Java 虚拟机使这成为可能,因为它知道底层硬件平台的指令长度和其他特征。

2.JDK和JRE有什么区别?

Java运行时环境是执行Java程序的Java虚拟机。它还包含执行小程序所需的浏览器插件。 Java Develop Kit是一个完整的Java软件开发工具包,包括JRE、编译器和其他工具(如JavaDoc、Java调试器),它允许开发人员开发、编译和执行Java应用程序。

3.“static”关键字是什么意思?是否可以重写 Java 中的私有或静态方法?

“static”关键字表示成员变量或成员方法无需所属类的实例变量即可访问。 Java中静态方法不能被重写,因为方法重写是基于运行时动态绑定的,而静态方法是在编译时静态绑定的。静态方法与类的任何实例都不相关,因此从概念上讲它们不适用。

4. 静态环境下是否可以访问非静态变量?

静态变量在Java中属于类,它们的值在所有实例中都是相同的。当Java虚拟机加载一个类时,静态变量就会被初始化。如果您的代码尝试在不使用实例的情况下访问非静态变量,编译器将报告错误,因为这些变量尚未创建并且不与任何实例关联。

5.Java支持哪些数据类型?什么是自动拆箱箱?

Java语言支持的8种基本数据类型对应的长度和对应的包装类:

int---4字节---整数

char---2字节---字符

浮点数---4字节---浮点数

双---8字节---双

字节---1字节---字节

短---2字节---短

长---8字节---长

布尔值---1字节--布尔值

自动装箱是Java编译器在基本数据类型和相应的对象包装类型之间完成的转换。否则会自动拆箱。

6.Java中方法重写和方法重载是什么意思?

Java 中的方法重载是指同一个类中的两个或多个方法具有相同的方法名但参数不同的情况。相反,方法重写是指子类重新定义父类的方法。方法重写必须具有相同的方法名称、参数列表和返回类型。覆盖者不能限制对其覆盖的方法的访问。

7.Java中的构造函数是什么?什么是构造函数重载?什么是复制构造函数?

当创建新对象时,将调用构造函数。每个类都有一个构造函数。在程序员没有为类提供构造函数的情况下,Java编译器将为该类创建一个默认构造函数。

Java中的构造函数重载和方法重载非常相似。一个类可以创建多个构造函数。每个构造函数必须有自己唯一的参数列表。

Java 不像 C++ 那样支持复制构造函数。这种差异是因为如果您不编写自己的构造函数,Java 不会创建默认的复制构造函数。

8. Java支持多重继承吗?

不,Java 不支持多重继承。每个类只能继承一个类,但可以实现多个接口。

9. 接口和抽象类有什么区别?

Java 提供并支持抽象类和接口的创建。它们的实现有一些共同点,但区别在于:

接口中的所有方法都是隐式抽象的。抽象类可以包含抽象方法和非抽象方法。

一个类可以实现多个接口,但只能继承一个抽象类

如果一个类想要实现一个接口,那么它必须实现该接口声明的所有方法。但是,类不需要实现抽象类声明的所有方法。当然,在这种情况下,该类也必须声明为抽象的。

抽象类可以实现接口而不提供接口方法的实现。

Java接口中声明的变量默认是final的。抽象类可以包含非最终变量。

Java 接口中的成员函数默认是公共的。抽象类的成员函数可以是私有的、受保护的或公共的。

接口是绝对抽象的,无法实例化。抽象类无法实例化,但如果它包含 main 方法,则可以调用它。

也可以参考JDK8中抽象类和接口的区别

10.什么是值传递和引用传递?

对象按值传递,这意味着传递对象的副本。因此,即使更改对象副本,源对象的值也不会受到影响。

对象是通过引用传递的,这意味着传递的不是实际的对象,而是对该对象的引用。因此,外部对引用对象所做的更改将反映在所有对象中。

11.什么是局部变量?什么是实例变量?什么是类变量(静态变量)?

在方法、构造函数或代码块中定义的变量是局部变量。局部变量在函数内声明和初始化,并在函数结束时销毁。实例变量是类内部但在任何函数外部的变量。实例变量只有在类实例化后才能被引用。在类内部和任何函数外部,使用 static 关键字声明的变量是类变量。

12.什么是类的单例模式?

单例类控制对象的生成。一次只能存在一个对象,但它很灵活,允许在条件发生变化时创建多个变量。

13.什么是构造函数?

创建新对象时会自动调用构造函数。每个类都有一个构造函数。如果没有显式声明构造函数,JAVA编译器将调用默认构造函数。

14.列出为类创建对象的过程(三步)。

首先声明一个对象,然后实例化它,然后初始化它。

15.JAVA中byte数据类型的默认值是多少?

16.JAVA中float和double的默认值是什么?

float和double的默认值与C/C++相同,float为0.0f,double为0.0d。

17.什么时候使用byte类型?

字节类型用于在较大的数组中节省存储空间。使用byte类型代替int类型可以节省三倍的空间。

18.什么是访问控制修饰符?

JAVA提供了访问控制修饰符来修改类、变量、方法和构造函数的访问控制属性。当没有写出访问控制修饰符时,成员具有默认访问权限或包访问控制权限。

19.什么是protected访问控制修饰符?

如果变量、方法和构造函数在父类中被声明为 protected,则它们只能在其他包的子类或父类的包中访问。

20.什么是同步修饰符?

JAVA除了访问控制修饰符之外还提供了同步修饰符。同步修饰符用于限制方法,使其一次只能由一个线程调用。

21.JAVA运算符优先级中,哪个运算符优先级最高?

括号 () 和下标运算符 [] 具有最高优先级。

22.switch语句中可以使用哪些数据类型?

switch 中使用的变量只能是字节类型、短整型、整数类型或字符类型。

23.parseInt()函数什么时候使用?

parseInt() 函数用于解析字符串并返回整数。

24.为什么String类是不可变的?

String对象一旦创建就无法更改,因此可以在多个线程中安全地引用,这对于多线程编程非常重要。

25.为什么说StringBuffer类是可变的?

String 类是不可变的,因此 String 对象一旦创建就无法更改。如果需要频繁修改字符串,则应该使用StringBuffer。

26.StringBuffer和StringBuilder类有什么区别?

尽可能使用 StringBuilder,因为它比 StringBuffer 运行得更快。但如果需要强调线程安全,则应该使用StringBuffer。

27. 如果main方法被声明为私有会发生什么?

编译正常,但是运行时会提示“main方法不公开”。

28.Java中按引用传递和按值传递有什么区别?

按引用传递意味着传递地址而不是值本身,而按值传递意味着传递值的副本。

29. 如果你想重写一个对象的 equals 方法,你还应该考虑什么?

哈希码。

30、解释一下public static void main(String args[])语句中各个关键字的作用

public:main方法是Java程序运行时第一个调用的方法,因此它必须对Java环境可见。因此可见性设置为公共。

static:Java平台在调用该方法时不会创建该类的实例,因此该方法必须声明为static。

void:main方法没有返回值。

String是命令行传入的参数类型,args指的是命令行传入的字符串数组。

31、去掉main方法的static修饰符会发生什么情况?

程序编译正常。运行时会抛出NoSuchMethodError异常。

32、最后,最后,最后确定

Final:常量声明。最后:处理异常。 Finalize:帮助垃圾收集。

接口中声明的变量默认是final的。 Final类不能被继承,即它们没有子类。这样做是出于基本类型(例如字符串和整数)的安全原因。这也使得编译器可以进行一些优化,更容易保证线程安全。最终方法不能被覆盖。最终变量的值不能更改。 Finalize() 方法在对象被销毁和回收之前调用。 finally,通常用于异常处理,无论是否抛出异常都会执行。例如,关闭连接通常是在finally 块中完成的。

33.什么是Java API?

Java API是大型软件组件的集合,提供大量有用的功能,例如GUI组件。

34.什么是GregorianCalendar类?

GregorianCalendar 提供对传统西历的支持。

35.Java中为什么没有全局变量?

全局变量是全局可见的。 Java不支持全局可见变量,因为:全局变量破坏了引用透明性原则。全局变量会导致命名空间冲突。

36.如何将String类型转换为Number类型?

Integer类的valueOf方法可以将String转换为Number。这是代码示例:

字符串numString =“1000”;

int id=Integer.valueOf(numString).intValue();

37.什么是隐式类型转换?

隐式类型转换只是将一种类型分配给另一种类型,而不显式告诉编译器转换已发生。并非所有类型都支持隐式类型转换。

代码示例:

整数 i = 1000;

长 j = i; //隐式转换

38.sizeof是Java中的关键字吗?

不。

39.什么是native方法?

本机方法是用非 Java 代码实现的方法。

40.System.out.println()中,System、out、println分别是什么?

System是系统提供的预定义的final类,out是一个PrintStream对象,println是out对象中的重载方法。

41.什么是显式类型转换?

显式类型转换显式告诉编译器转换对象。

代码示例:

长 i = 700.20;

int j = (int) i; //显式转换

42.什么是类型向下转型?

向下转换是指从通用类型转换为特定类型,在继承结构中向下进行。

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

访问修饰符是指示类成员访问类型的关键字。使用这些关键字来限制对程序方法或变量的访问。它们包括:

public:所有类都可以访问 protected:同一个包中的所有子类都可以访问 private:只有所属的类可以访问 Default:所属的类和同一个包中的子类都可以访问

44.静态类型有什么特点?

静态变量绑定到类,而不是绑定到类的实例对象。每个实例对象共享相同的静态变量。换句话说,一个类的静态变量只有一份副本,无论它有多少个对象。类变量或静态变量通过 static 关键字声明。类变量通常用作常量。静态变量通常通过类名来访问。该变量在程序运行时创建,直到程序结束才会被销毁。类变量的作用域与实例变量的作用域相同。它的初始值与成员变量的初始值相同。当变量未初始化时,它将根据其数据类型有一个默认值。同样,静态方法是属于类的方法,而不是属于类对象的方法。它的调用不会影响类对象,也不需要创建任何类实例。静态方法本身是最终的,因为重写只会发生在类实例上。静态方法绑定到类,而不是对象。父类的静态方法会被子类的静态方法阻塞,只要原方法没有声明为final。非静态方法不能覆盖静态方法,即不能将静态方法更改为子类中的实例方法。

非静态变量在每个对象实例上都有一个单独的值。

45.&运算符和&&运算符有什么区别?

当计算 & 表达式时,两个操作数都会被计算,&& 更像是一个运算符快捷方式。当计算 && 表达式时,首先计算第一个操作数,如果返回 true,则计算第二个操作数。如果第一个操作数的计算结果为 false,则不会计算第二个操作数。

46.Java如何处理整数的上溢和下溢?

Java根据类型的大小将计算结果中对应的低位字节存储到对应的值中。

47.如果public static void写成static public void会发生什么?

程序编译并正常运行。

48.声明变量和定义变量有什么区别?

声明变量时,我们只提供变量的类型和名称,并不对其进行初始化。定义包括两个阶段:声明和初始化。字符串 s;只是一个变量声明, String s = new String("bob");或字符串 s = "bob";是一个变量定义。

49.Java支持哪些参数传递类型?

Java参数都是按值传递的。对于对象来说,传递的值是对该对象的引用,这意味着原始引用和参数引用的副本指向同一个对象。

50.对象封装的原则是什么?

封装是将数据和对数据进行操作的代码绑定到单独的单元中。这确保了数据安全并防止外部代码的错误使用。对象允许封装程序和数据以减少潜在的干扰。对封装的另一种理解是作为数据和代码的保护层,防止保护层之外的代码随机访问。

51.如何理解变量?

变量是程序可以访问的命名内存区域。变量用于存储数据。当程序执行时,存储的数据也可能发生变化。

52什么是数值改进?

数值提升是指将数据从较小的数据类型转换为较大的数据类型以进行整数或浮点运算。在数值提升过程中,byte、char、short值会被转换为int类型。当需要时,int 类型也可以提升为 long。 Long 和 float 可以转换为 double 类型。

53.Java中什么是类型转换?

从一种数据类型转换为另一种数据类型称为类型转换。 Java有两种类型转换方法,一种是显式类型转换,另一种是隐式类型转换。

54、main方法的参数中,字符串数组的第一个参数是什么?

该数组为空,没有任何元素。与 C 或 C++ 不同,第一个元素默认为程序名称。如果命令行不提供参数,则main方法中的String数组为空,但不为null。

55. 如何判断一个数组是否为null或为空?

输出array.length的值。如果为0,则表示数组为空。如果为null,则会抛出空指针异常。

56、一个程序中可以允许多个类同时拥有main方法吗?

能。当程序运行时,我们指定要运行的类名。 JVM 只会查找您指定的类中的 main 方法。因此,当多个类有main方法时,不存在命名冲突问题。

57.静态变量什么时候加载?编译时还是运行时?那么加载静态代码块的时机呢?

静态变量是在类加载器将类加载到 JVM 时创建的,无论该对象是否已创建。静态变量加载时会分配内存空间。静态代码块中的代码只会在类第一次初始化时执行一次。一个类可以有多个静态代码块。它不是类的成员,没有返回值,不能直接调用。静态代码块不能包含this或super,它们通常用于初始化静态变量。

58. 一个类可以有多个main方法吗?

是的,但只有一个主要方法可以具有以下签名:

公共静态无效主(字符串[]参数){}

否则程序将无法编译。编译器会警告您 main 方法已经存在。

59.简单介绍一下JVM是如何工作的?

JVM是一个抽象的计算机。就像真正的计算机一样,它们首先将.java文件编译为.class文件(.class文件是字节码文件),然后使用其解释器加载字节码。

60.如何就地交换两个变量的值?

首先将两个值相加并将其分配给第一个变量,然后从结果中减去第二个变量并将其分配给第二个变量。然后从第一个变量中减去第二个变量并将其分配给第一个变量。代码如下:

int a=5,b=10;a=a+b; b=ab; a=ab;

交换也可以使用 XOR 运算来完成。第一种方法也可能会导致溢出。异或方法如下:int a=5,b=10;a=a+b; b=ab; a=ab;

整数a=5;整数 b = 10;

a = a ^ b;

b = a^b;

a = a ^ b;

61. JVM本身会维护缓存吗?它是在堆、操作系统的堆还是JVM本身管理的堆中分配对象?为什么?

是的,JVM本身管理缓存,它在堆中创建对象,然后在堆栈上引用这些对象。

62. == 和 equals 的区别

== 比较两个对象在内存中是否是同一个对象,即在内存中的存储位置是否一致。两个String对象中存储的值是相同的,但可能存储在内存中的不同位置。

== 比较引用,而 equals 方法比较内容。 public boolean equals(Object obj) 该方法由Object对象提供,可以被子类重写。默认实现仅在对象与自身比较时返回true,相当于==。 String、BitSet、Date 和 File 都重写了 equals 方法。对于两个String对象,相等的值意味着它们包含相同的字符序列。对于基本类型的包装类来说,值相等意味着对应的基本类型的值是相同的。

温馨提示:本内容地址http://m.ysjob.cc/article/articledetail-792.html转载请注明,以上Java 面试题总结:巩固知识,为校招做好准备资讯信息来自颍上人才网(颍上地区最大的颍上人才网颍上人才网

 
 ©2003-2018 颍上人才网  
客服电话:  QQ: