Java开发人员面试中你绝对应该知道的21个常见问题
Java面试题种类繁多,我们无法在一篇文章中全部列举。不过,根据IT公司人力资源经理的说法,这里列出了一些非常常见的Java面试题。
1.“拆卸” public static void main(String args[])。
这是Java面试中常见的一道题,尤其适合应届毕业生,而且比较简单。
public这是一个访问修饰符。我们用它来指定对该方法的访问权限。这里的修饰符是“public”,因此任何类都可以访问此方法。static.这个 Java 关键字表示我们使用此方法时不会创建新的类对象。Void这是方法的返回类型。这意味着该方法不返回任何值。main`main` 是方法的名称。JVM 将其识别为应用程序的入口点(它应该具有特定的签名)。`main` 是主要执行发生的方法。String args[].这是传递给主方法的参数。这里列出的是 Java 应用程序运行时接受的字符串类型的参数。您可以在终端中输入这些参数。
equals()2.和之间有什么区别==?
首先,“ ==”是一个运算符,而是equals()一个方法。我们使用==运算符进行引用比较(或地址比较),equals()使用方法进行内容比较。这意味着运算符==检查两个对象是否指向同一内存位置,而equals()方法比较对象中的值。
main()3. 我们可以执行一个没有方法的程序吗?
很多Java基础面试题都很简单,比如这道题。所以简而言之:是的,我们可以。例如,我们可以使用静态代码块来实现。
您可以使用静态代码块来初始化静态数据成员。它会main在类加载时,在方法执行之前执行。
class Example{
Static{
System.out.println("static block is invoked");
}
public static void main(String args[]){
System.out.println("Now main method");
}
}
输出结果为:
**static** block is invoked
Now main method
如果完全没有 main 方法会怎样?如果您尝试运行一个完全没有 main 方法的普通类,您会收到以下错误:
类 Test 中未找到 main 方法,请将 main 方法定义为:public static void main (String [] args)或者 JavaFX 应用程序类必须继承自javafx.application.Application。
错误信息本身表明,如果这是一个 JavaFX 应用程序,并且该类继承自javafx.application.Application,那么就可以实现。
4. 什么是immutable对象?你能创建immutable对象吗?
类中的对象创建后就无法修改immutable。也就是说,一旦创建了对象,就不能更改它。如果尝试修改Immutable对象,系统会创建一个新对象(克隆),然后在创建过程中修改这个克隆对象。
一个很好的例子是Java 中的 ` StringObject` 类immutable。这意味着你不能修改对象本身,但你可以修改对该对象的引用。
5. 以下代码创建了多少个对象?
Java 技术面试题之一,可替代第 4 题。
String s1="Hello";
String s2="Hello";
String s3="Hello";
答案是“只有一个”,因为 Java 有一个字符串池。当我们使用 ` new()new` 运算符创建一个字符串对象时,它会在堆内存中创建一个新对象。如果我们使用字符串字面量语法(就像我们示例中那样),它可能会从字符串池中返回一个已存在的对象(如果该对象已存在)。
6. 以下代码创建了多少个对象?
String s = new String("Hello");
这里有两个对象。一个在字符串常量池中,另一个在堆中。
String7. Java 中的类StringBuilder和StringBuffer类之间有什么区别?
这是顶尖的Java面试题之一。
首先,`String`String是一个不可变类。这意味着一旦创建,就无法修改其内容。而 `String`StringBuffer和 ` StringBuilderT` 是可变类,因此可以稍后修改。如果我们修改 `String` 对象的内容String,它会创建一个新的字符串,因此不会修改原始字符串。这就是为什么 `String` 的性能StringBuffer优于 `T` 的原因String。
两者之间的主要区别在于StringBuffer, ` StringBuilders`StringBuffer的方法是同步的,而StringBuilder`s` 的则不是。
String8.使用字面量和 with 运算符创建的内容有什么区别new()?
是的。如果我们使用运算符创建字符串,new()它会出现在堆中,而不会添加到字符串池中。如果使用String字面量创建字符串,它会创建String在堆的永久区(Perm)中的字符串池中。
9. Java 中可以重写privateorstatic方法吗?
这是Java新手面试中容易遇到的棘手问题之一。在Java中,你真的不能重写private方法static。
您无法重写private方法,因为私有访问说明符的作用域仅限于类内部。要重写某些方法,必须存在父类和子类。如果父类的方法被声明为私有private,子类就无法使用它,子类中的方法将被视为新方法(而非被重写的方法)。
Static方法也不能被重写,因为static方法是类本身的一部分,而不是类的任何对象的一部分。当然,你可以static在子类中声明具有相同签名的方法,但它们会被视为新方法。
10.Abstract Class两者之间的区别Interface
这是Java开发人员面试中常见的考题之一,它与面向对象编程(OOP)原则密切相关。首先,在Java中,interface定义行为并abstract class创建层次结构。
11. 我们可以在类中声明static变量和方法吗abstract?
是的,可以static在方法内部声明变量和方法abstract。访问静态上下文不需要创建对象。因此,我们可以abstract使用类名来访问类内部声明的静态上下文abstract。
12. JVM 分配哪些类型的内存区域?
类区域存储每个类的结构,例如运行时常量池、字段、方法数据以及所有方法的代码。
堆是运行时数据区域,用于为对象分配内存。
栈用于存储帧。它包含局部变量和部分结果,并参与方法的调用和返回。每个线程都有一个私有的 JVM 栈,该栈与线程同时创建。每次调用方法时都会创建一个新的帧。当方法调用完成时,帧会被销毁。
程序计数器寄存器包含当前正在执行的 Java 虚拟机指令的地址。
本地方法栈包含应用程序中使用的所有本地方法。
13. 为什么Java中不允许多重继承?
这会非常复杂。想象一下有三个类A:`A`、 ` B`B和`C`,它们分别继承了`A` 和 `B` 。现在, `A`和`C` 类有一个相同的方法,如果你从子类对象中调用它……应该调用哪个类呢?是`A` 的还是`B` 的?这里存在歧义。如果你试图继承两个类,Java 会报编译时错误。CCABABAB
14. 我们能否重载该main()方法?
当然,Java 程序中可以有多个主方法,这可以通过方法重载来实现。试试看!
15. 我们能否将构造函数声明为final?
不行。构造函数不能声明为 `<T>`,final因为它不能被继承。所以把构造函数声明为 `<T>` 是没有意义的final。但是,如果你尝试这样做,Java 编译器会报错。
16. 我们能否将接口声明为final?
不,我们不能这样做。接口不能被定义,final因为根据定义,接口必须由某个类来实现。因此,创建接口是没有意义的final。但是,如果你尝试这样做,编译器会报错。
static binding17.和有什么区别dynamic binding?
binding编译器在编译时可以解析的参数称为早期static绑定。Binding所有参数的static解析private和final方法都在编译时完成。
编译器Dynamic binding无法选择要调用的方法。重写方法就是一个典型的例子dynamic binding。在重写中,父类和子类都拥有相同的方法。
Static Binding
class Cat{
private void talk()
{System.out.println("cat is mewing...");
}
</code>
<code> public static void main(String args[]){
Cat cat=new Cat();
cat.talk();
}
} </code>
<code>Dynamic Binding
class Animal{
void talk(){
System.out.println("animal is talking...");
}
} </code>
<code>class Cat extends Animal{
void talk(){
System.out.println("cat is talking...");
} </code>
<code> public static void main(String args[]){
Animal animal=new Cat();
animal.talk();
}
}
18. 如何在 Java 中创建只读类?
你可以通过将类的所有字段设为私有来实现这一点。只读类只有getter方法,这些方法会将类的私有属性返回给该main方法。你无法修改此属性,原因是缺少setter方法。
public class HockeyPlayer{
private String team ="Maple leaf";
public String getTeam(){
return team;
}
}
19. 如何在 Java 中创建只写类?
同样,你应该将类的所有字段都设为只写private。现在,你的只写类应该只有 setter 方法,而没有 getter 方法。因此,我们无法读取该类的属性。
public class HockeyPlayer{
private String team;
public void setTeam(String college){
this.team = team;
}
}
20. 每个try代码块后面都必须跟一个catch代码块,对吧?
不,这不是必须的。每个 try 代码块都可以没有 catch 代码块。它后面可以跟一个catchblockfinally 代码块,或者一个 catch 代码块,甚至可以完全不跟它们。
public class Main{
public static void main(String []args){
try{
int variable = 1;
System.out.println(variable/0);
}
finally
{
System.out.println("the other part of the program...");
}
}
}
输出:
class Main {
public static void main(String[] args) throws IOException {
try(InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(inputStreamReader)){
System.out.println("test");
}
}
}
PS:在 Java 8 之前,接口中的方法只能是抽象的。在 Java 8 或更高版本中,可以定义默认方法并在接口中直接实现它们。
throw21.和throws关键词之间有什么区别?
Throws用于声明异常,因此它的工作方式类似于try-catch代码块。Throw关键字用于从方法或任何其他代码块中显式抛出异常。
Throw后面跟着类的实例Exception,throws 后面跟着异常类名。
Throw在方法体中用于抛出异常。Throws在方法签名中用于声明方法语句中可能发生的异常。
一次只能抛出一个异常,但您可以使用throw关键字声明多个异常来处理它们。您可以声明多个异常,例如:`Exception`、`Exception` public void method()throws IOException、` Exception` SQLException。
这里我们只列举了一些Java面试题及答案。本文是面试系列文章的第一篇。下一篇(即将推出)将介绍数据结构方面的问题。
最初发表于CodeGym 博客。
文章来源:https://dev.to/codegym_cc/top-21-interview-questions-for-java-developers-you-totally-should-know-4n3l

