Java基础常见面试题总结(1-2)
为什么说 Java 语言“编译与解释并存”?
这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。
我们可以将高级编程语言按照程序的执行方式分为两种:
- 编译型:编译型语言会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
- 解释型: 解释型语言会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
Oracle JDK 和 OpenJDK
2006 年 SUN 公司将 Java 开源,也就有了 OpenJDK。2009 年 Oracle 收购了 Sun 公司,于是自己在 OpenJDK 的基础上搞了一个 Oracle JDK。Oracle JDK 是不开源的,并且刚开始的几个版本(Java8 ~ Java11)还会相比于 OpenJDK 添加一些特有的功能和工具。
其次,对于 Java 7 而言,OpenJDK 和 Oracle JDK 是十分接近的。 Oracle JDK 是基于 OpenJDK 7 构建的,只添加了一些小功能,由 Oracle 工程师参与维护。
Oracle JDK 和 OpenJDK 的区别:
- 是否开源:OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是基于 OpenJDK 实现的,并不是完全开源的。
- 是否免费:Oracle JDK 会提供免费版本,但一般有时间限制。JDK17 之后的版本可以免费分发和商用,但是仅有 3 年时间,3 年后无法免费商用。不过,JDK8u221 之前只要不升级可以无限期免费。OpenJDK 是完全免费的。
- 功能性:Oracle JDK 在 OpenJDK 的基础上添加了一些特有的功能和工具,比如 Java Flight Recorder(JFR,一种监控工具)、Java Mission Control(JMC,一种监控工具)等工具。不过,在 Java 11 之后,OracleJDK 和 OpenJDK 的功能基本一致,之前 OracleJDK 中的私有组件大多数也已经被捐赠给开源组织。
- 稳定性:OpenJDK 不提供 LTS 服务,而 OracleJDK 大概每三年都会推出一个 LTS 版进行长期支持。不过,很多公司都基于 OpenJDK 提供了对应的和 OracleJDK 周期相同的 LTS 版。因此,两者稳定性其实也是差不多的。
- 协议:Oracle JDK 使用 BCL/OTN 协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。
Java 和 C++ 的区别?
Java 和 C++ 都是面向对象的语言,都支持封装、继承和多态
Java和C++最直观的不同点:
一、编程范式
- Java:完全面向对象的编程语言,不支持面向过程的编程方式。在Java中,一切都围绕着类和对象进行,这使得代码更加模块化、可重用和易于维护。
- C++:既支持面向过程的编程方式,也支持面向对象的编程方式。这使得C++在编写底层系统代码或需要精细控制硬件的场景中具有更大的灵活性。
二、内存管理
- Java:自带垃圾回收机制,自动管理内存。这减少了程序员的工作量和错误率,但同时也可能带来一些性能上的开销。
- C++:需要程序员手动管理内存,包括分配和释放内存。这增加了程序的灵活性,但也带来了内存泄漏和指针错误等风险。
三、平台兼容性
- Java:被设计为跨平台的语言,只要有相应的Java虚拟机(JVM),Java程序就可以在不同的操作系统上运行。这使得Java在开发跨平台应用时具有极大的优势。
- C++:虽然C++编写的代码可以在不同的操作系统上编译和运行,但需要在不同的操作系统上重新编译。这增加了开发和维护的复杂性。
四、性能
- Java:由于需要在虚拟机上运行,Java程序的执行速度可能会受到一定影响。尽管Java虚拟机进行了大量优化,但在某些对性能要求极高的场景下,Java可能不如C++高效。
- C++:代码可以直接在硬件上运行,执行速度非常快。这使得C++成为对性能要求极高的应用程序(如操作系统、游戏引擎等)的首选语言。
五、学习成本
- Java:语言规范严格,语法相对简单明了,且有丰富的类库和工具支持。这使得学习Java相对容易上手,但要想深入掌握并编写高效的Java程序,仍然需要投入大量的时间和精力。
- C++:语言本身包含了大量的特性和语法规则,且需要手动管理内存和进行底层控制。这使得学习C++的门槛相对较高,需要投入更多的时间和精力来掌握其复杂的特性和最佳实践。
标识符和关键字的区别是什么?
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了 标识符 。简单来说, 标识符就是一个名字 。
有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 关键字 。简单来说,关键字是被赋予特殊含义的标识符 。
Java 语言关键字有哪些?
访问控制:private、protected、protected
类,方法和变量修饰符:abstract、class、extends、final、implements、interface、native、new、static、strictfp、synchronized、transient、volatile、enum
程序控制:break、continue、return、do、while、if、else、for、instanceof、switch、case、default、assert
错误处理:try、catch、throw、throws、finally
包相关:import、package
基本类型:boolean、byte、char、double、float、int、long、short
变量引用:super、this、void
保留字:goto、const