《⾯试⼩抄》之Java基础篇36问与答(2021最新版)
本⽂收录于《⾯试⼩抄》系列,Github地址:
这是⼀个很⼲的⾯试题合集,主要涉及Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、操作系统、计算机⽹络等知识点。
Java基础内容较多,我将分成两篇。这是本期的 Java 基础⾯试题⽬录,看看你会哪些?
话不多说,开始发车了~
1. Java语⾔有哪些特点?
⾯向对象(封装,继承,多态);
平台⽆关性,平台⽆关性的具体表现在于,Java 是“⼀次编写,到处运⾏(Write Once,Run any Where)”的语⾔,因此采⽤ Java 语⾔编写的程序具有很好的可移植性,⽽保证这⼀点的正是 Java 的虚拟机机制。在引⼊虚拟机之后,Java 语⾔在不同的平台上运⾏不需要重新编译。
可靠性、安全性;
⽀持多线程。C++ 语⾔没有内置的多线程机制,因此必须调⽤操作系统的多线程功能来进⾏多线程程序设计,⽽ Java 语⾔却提供了多线程⽀持;
⽀持⽹络编程并且很⽅便。Java 语⾔诞⽣本⾝就是为简化⽹络编程设计的,因此 Java 语⾔不仅⽀持⽹络编程⽽且很⽅便;
编译与解释并存;
2. Java和C++有什么关系,它们有什么区别?
都是⾯向对象的语⾔,都⽀持封装、继承和多态;
C++ ⽀持指针,⽽ Java 没有指针的概念;
C++ ⽀持多继承,⽽ Java 不⽀持多重继承,但允许⼀个类实现多个接⼝;
Java ⾃动进⾏⽆⽤内存回收操作,不再需要程序员进⾏⼿动删除,⽽ C++ 中必须由程序释放内存资源,这就增加了程序员的负担。
Java 不⽀持操作符重载,操作符重载则被认为是 C++ 的突出特征;
Java 是完全⾯向对象的语⾔,并且还取消了 C/C++ 中的结构和联合,使编译程序更加简洁;
C 和 C++ 不⽀持字符串变量,在 C 和 C++ 程序中使⽤“Null”终⽌符代表字符串的结束。在 Java 中字符串是⽤类对象(String 和 StringBuffer)来实现的;
goto 语句是 C 和 C++ 的“遗物”,Java 不提供 goto 语句,虽然 Java 指定 goto 作为关键字,但不⽀持它的使⽤,这使程序更简洁易读;
3. JVM、JRE和JDK的关系是什么?
JDK是(Java Development Kit)的缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE是Java Runtime Environment缩写,它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。
JDK包含JRE,JRE包含JVM。
4. 什么是字节码?采⽤字节码的好处是什么?
这个问题,⾯试官可以扩展提问,Java 是编译执⾏的语⾔,还是解释执⾏的语⾔?
Java之所以可以“⼀次编译,到处运⾏”,⼀是因为JVM针对各种操作系统、平台都进⾏了定制,⼆是因为⽆论在什么平台,都可以编译⽣成固定格式的字节码(.class ⽂件)供JVM使⽤。因此,也可以看出字节码对于Java⽣态的重要性。
之所以被称之为字节码,是因为字节码⽂件由⼗六进制值组成,⽽JVM以两个⼗六进制值为⼀组,即以字节为单位进⾏读取。在Java中⼀般是⽤javac命令编译源代码为字节码⽂件,⼀个.java⽂件从编译到运⾏的⽰例如图所⽰。
Java语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以Java程序运⾏时⽐较⾼效,⽽且,由于字节码并不专对⼀种特定的机器,因此,Java程序⽆须重新编译便可在多种不同的计算机上运⾏。
5. Oracle JDK 和 OpenJDK 的区别是什么?
可能在看这个问题之前很多⼈和我⼀样并没有接触和使⽤过 OpenJDK 。下⾯通过我通过我收集到⼀些资料对你解答这个被很多⼈忽视的问题。
Oracle JDK 版本将每三年发布⼀次,⽽ OpenJDK 版本每三个⽉发布⼀次;
OpenJDK 是⼀个参考模型并且是完全开源的,⽽ Oracle JDK 是OpenJDK 的⼀个实现,并不是完全开源的;
Oracle JDK ⽐ OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码⼏乎相同,但 Oracle JDK 有更多的类和⼀些错误修复。因此,如果您想开发企业/商业软件,建议选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些⼈提到在使⽤ OpenJDK 可能会遇到了许多应⽤程序崩溃的问题,但是,只需切换到Oracle JDK 就可以解决问题;
在响应性和 JVM 性能⽅⾯,Oracle JDK 与 OpenJDK 相⽐提供了更好的性能;
Oracle JDK 不会为即将发布的版本提供长期⽀持,⽤户每次都必须通过更新到最新版本获得⽀持来获取最新版本;
Oracle JDK 根据⼆进制代码许可协议获得许可,⽽ OpenJDK 根据 GPLv2 许可获得许可。
6. Java有哪些数据类型?
Java 语⾔的数据类型分为两种:基本数据类型和引⽤数据类型。
基本数据类型包括 boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、int(整型)、long(长整型)和 double (双精度浮点型)共 8 种,如下图所⽰。
image-
引⽤数据类型建⽴在基本数据类型的基础上,包括数组、类和接⼝。引⽤数据类型是由⽤户⾃定义,⽤来限制其他数据的类型。另外,Java 语⾔中不⽀持中的指针类型、结构类型、联合类型和枚举类型。
7. switch 是否能作⽤在 byte 上,是否能作⽤在 long 上,是否能作⽤在 String 上?
Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。
从 Java 5 开始,Java 中引⼊了枚举类型, expr 也可以是 enum 类型。
从 Java 7 开始,expr还可以是字符串(String),但是长整型(long)在⽬前所有的版本中都是不可以的。
8. 访问修饰符public、private、protected、以及不写(默认)时的区别?
Java中,可以使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问。Java ⽀持 4 种不同的访问权限。
default (即默认,什么也不写): 在同⼀包内可见,不使⽤任何修饰符。使⽤对象:类、接⼝、变量、⽅法。
private : 在同⼀类内可见。使⽤对象:变量、⽅法。注意:不能修饰类(外部类)
public : 对所有类可见。使⽤对象:类、接⼝、变量、⽅法
protected : 对同⼀包内的类和所有⼦类可见。使⽤对象:变量、⽅法。注意:不能修饰类(外部类)。
9. break ,continue ,return 的区别及作⽤?
break 跳出总上⼀层循环,不再执⾏循环(结束当前的循环体)
continue 跳出本次循环,继续执⾏下次循环(结束正在执⾏的循环进⼊下⼀个循环条件)
return 程序返回,不再执⾏下⾯的代码(结束当前的⽅法直接返回)
10. final、finally、finalize的区别?
final ⽤于修饰变量、⽅法和类。
final 变量:被修饰的变量不可变,不可变分为引⽤不可变和对象不可变,final 指的是引⽤不可变,final 修饰的变量必须初始化,通常称被修饰的变量为常量。
final ⽅法:被修饰的⽅法不允许任何⼦类重写,⼦类可以使⽤该⽅法。
final 类:被修饰的类不能被继承,所有⽅法不能被重写。java面向对象的特征有哪些方面
finally 作为异常处理的⼀部分,它只能在try/catch语句中,并且附带⼀个语句块表⽰这段语句最终⼀定被执⾏(⽆论是否抛出异常),经常被⽤在需要释放资源的情况下,it (0)可以阻断 finally 执⾏。
finalize 是在java.lang.Object⾥定义的⽅法,也就是说每⼀个对象都有这么个⽅法,这个⽅法在gc启动,该对象被回收的时候被调⽤。
⼀个对象的 finalize ⽅法只会被调⽤⼀次,finalize 被调⽤不⼀定会⽴即回收该对象,所以有可能调⽤ finalize 后,该对象⼜不需要被回收了,然后到了真正要被回收的时候,因为前⾯调⽤过⼀次,所以不会再次调⽤ finalize 了,进⽽产⽣问题,因此不推荐使⽤ finalize ⽅法。
11. 为什么要⽤static关键字?
通常来说,⽤new创建类的对象时,数据存储空间才被分配,⽅法才供外界调⽤。但有时我们只想为特定域分配单⼀存储空间,不考虑要创建多少对象或者说根本就不创建任何对象,再就是我们想在没有创建对象的情况下也想调⽤⽅法。在这两种情况下,static关键字,满⾜了我们的需求。
12. ”static”关键字是什么意思?Java中是否可以覆盖(override)⼀个private或者是static的⽅法?“static”关键字表明⼀个成员变量或者是成员⽅法可以在没有所属的类的实例变量的情况下被访问。
Java中static⽅法不能被覆盖,因为⽅法覆盖是基于运⾏时动态绑定的,⽽static⽅法是编译时静态绑定的。static⽅法跟类的任何实例都不相关,所以概念上不适⽤。
13. 是否可以在static环境中访问⾮static变量?
static变量在Java中是属于类的,它在所有的实例中的值是⼀样的。当类被Java虚拟机载⼊的时候,会
对static变量进⾏初始化。如果你的代码尝试不⽤实例来访问⾮static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
14. static静态⽅法能不能引⽤⾮静态资源?
不能,new的时候才会产⽣的东西,对于初始化后就存在的静态资源来说,根本不认识它。
15. static静态⽅法⾥⾯能不能引⽤静态资源?
可以,因为都是类初始化的时候加载的,⼤家相互都认识。
16. ⾮静态⽅法⾥⾯能不能引⽤静态资源?
可以,⾮静态⽅法就是实例⽅法,那是new之后才产⽣的,那么属于类的内容它都认识。
17. java静态变量、代码块、和静态⽅法的执⾏顺序是什么?
基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块
代码块执⾏顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执⾏顺序:⽗类静态块——>⼦类静态块——>⽗类代码块——>⽗类构造器——>⼦类代码块——>⼦类构造器
想要深⼊了解,可以参考这篇⽂章:
18. ⾯向对象和⾯向过程的区别?
⾯向过程:
优点:性能⽐⾯向对象⾼,因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资源;⽐如单⽚机、嵌⼊式开发、Linux/Unix等⼀般采⽤⾯向过程开发,性能是最重要的因素。
缺点:没有⾯向对象易维护、易复⽤、易扩展。
⾯向对象:
优点:易维护、易复⽤、易扩展,由于⾯向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:性能⽐⾯向过程低。
19. 讲讲⾯向对象三⼤特性
封装。封装最好理解了。封装是⾯向对象的特征之⼀,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让可信的类或者对象操作,对不可信的进⾏信息隐藏。
继承。继承是指这样⼀种能⼒:它可以使⽤现有类的所有功能,并在⽆需重新编写原来的类的情况下对这些功能进⾏扩展。通过继承创建的新类称为“⼦类”或“派⽣类”,被继承的类称为“基类”、“⽗类”或“超类”。
多态性。它是指在⽗类中定义的属性和⽅法被⼦类继承之后,可以具有不同的数据类型或表现出不同的⾏为,这使得同⼀个属性或⽅法在⽗类及其各个⼦类中具
有不同的含义。
20. Java语⾔是如何实现多态的?
本质上多态分两种:
1、编译时多态(⼜称静态多态)
2、运⾏时多态(⼜称动态多态)
重载(overload)就是编译时多态的⼀个例⼦,编译时多态在编译时就已经确定,运⾏的时候调⽤的是确定的⽅法。
我们通常所说的多态指的都是运⾏时多态,也就是编译时不确定究竟调⽤哪个具体⽅法,⼀直延迟到运⾏时才能确定。这也是为什么有时候多态⽅法⼜被称为延迟⽅法的原因。
Java实现多态有 3 个必要条件:继承、重写和向上转型。只有满⾜这 3 个条件,开发⼈员才能够在同⼀个继承结构中使⽤统⼀的逻辑实现代码处理不同的对象,从⽽执⾏不同的⾏为。
继承:在多态中必须存在有继承关系的⼦类和⽗类。
重写:⼦类对⽗类中某些⽅法进⾏重新定义,在调⽤这些⽅法时就会调⽤⼦类的⽅法。
向上转型:在多态中需要将⼦类的引⽤赋给⽗类对象,只有这样该引⽤才既能可以调⽤⽗类的⽅法,⼜能调⽤⼦类的⽅法。
Java多态的实现原理可看这篇⽂章:
21. 重载(Overload)和重写(Override)的区别是什么?
⽅法的重载和重写都是实现多态的⽅式,区别在于前者实现的是编译时的多态性,⽽后者实现的是运⾏时的多态性。
重写发⽣在⼦类与⽗类之间, 重写⽅法返回值和形参都不能改变,与⽅法返回值和访问修饰符⽆关,即重载的⽅法不能根据返回类型进⾏区分。即外壳不变,核⼼重写!
重载(overloading) 是在⼀个类⾥⾯,⽅法名字相同,⽽参数不同。返回类型可以相同也可以不同。每个重载的⽅法(或者构造函数)都必须有⼀个独⼀⽆⼆的参数类型列表。最常⽤的地⽅就是构造器的重载。
22. 重载的⽅法能否根据返回值类型进⾏区分?
不能根据返回值类型来区分重载的⽅法。因为调⽤时不指定类型信息,编译器不知道你要调⽤哪个函数。
float max(int a, int b);
int max(int a, int b);
当调⽤max(1,2);时⽆法确定调⽤的是哪个,单从这⼀点上来说,仅返回值类型不同的重载是不应该允许的。
23. 构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。每⼀个类必须有⾃⼰的构造函数,负责构造⾃⼰这部分的构造。⼦类不会覆盖⽗类的构造函数,相反必须⼀开始调⽤⽗类的构造函数。
24. 抽象类和接⼝的区别是什么?
语法层⾯上的区别:
抽象类可以提供成员⽅法的实现细节,⽽接⼝中只能存在public abstract ⽅法;
抽象类中的成员变量可以是各种类型的,⽽接⼝中的成员变量只能是public static final类型的;
接⼝中不能含有静态代码块以及静态⽅法,⽽抽象类可以有静态代码块和静态⽅法;
⼀个类只能继承⼀个抽象类,⽽⼀个类却可以实现多个接⼝。
设计层⾯上的区别:
抽象类是对⼀种事物的抽象,即对类抽象,⽽接⼝是对⾏为的抽象。抽象类是对整个类整体进⾏抽象,包括属性、⾏为,但是接⼝却是对类局部(⾏为)进⾏抽象。
设计层⾯不同,抽象类作为很多⼦类的⽗类,它是⼀种模板式设计。⽽接⼝是⼀种⾏为规范,它是⼀种辐射式设计。
想要深⼊了解,可以参考这篇⽂章:
25. 抽象类能使⽤ final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产⽣⽭盾,
所以 final 不能修饰抽象类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。