Java 面试题

💡 原文中文,约1400字,阅读约需4分钟。
📝

内容提要

本文汇总Java面试核心知识点:构造方法与普通方法在命名、继承、调用及初始化职责上存在差异;反射可在运行时检查并操作类成员,获取Class对象有Class.forName、类名.class、实例.getClass()三种方式;创建对象有new、反射、clone、反序列化四种途径;switch支持整型、枚举和字符串;volatile保证可见性但不保证原子性;finally不一定会执行;异常分为检查性异常与运行时异常,并按多态方式捕获;HelloWorld程序经历编译、类加载与执行过程。

🔎

延伸解读

构造方法与普通方法:面试常考的边界

文章从命名、继承、调用方式、初始化职责等角度对比构造方法与普通方法,并指出构造方法未定义时编译器会生成默认无参方法,而普通方法没有这一默认能力。这类对比题容易停留在表面,实际回答时需注意构造方法不能使用 super 调用父类普通方法,且伴随 new 调用,普通方法则需类或实例发起调用。理解这些边界有助于避免混淆初始化与业务逻辑。

反射与对象创建:运行时能力的代价

文章列出获取 Class 对象的三种方式:Class.forName、类名.class、实例.getClass(),并说明反射可在运行时检查类、获取成员、创建对象和调用方法。同时提到创建对象有 new、反射、clone、反序列化四种途径。这些知识点常被分开记忆,但实际面试中可能追问不同方式的适用场景与限制。文章未展开性能或安全影响,读者需注意其仅覆盖基础概念,不宜过度引申。

volatile 与 finally:常见误解的澄清

文章明确 volatile 保证线程间可见性,从内存取数据而非缓存,但不保证原子性;finally 代码块也不一定执行,例如进入 try 之前抛异常或调用 System.exit(0)。这两点常被简化为“volatile 解决并发”和“finally 必执行”,文章给出了反例。回答相关面试题时,应区分可见性与原子性,并说明 finally 的例外条件,避免绝对化表述。

异常捕获顺序与 HelloWorld 执行过程

文章指出异常处理按多态方式向上抛出,若先捕获基类再捕获子类,子类处理代码将永远不会执行,这提示捕获顺序应从具体到抽象。HelloWorld 执行过程则分为 javac 编译、ClassLoader 装载 class、解释执行与编译执行,并列出编译的词法分析、语法分析、语义分析、代码生成阶段。这些内容适合作为面试复习框架,但文章对类加载链接阶段的描述较简略,深入追问需另行准备。

❓

Q&A

Java中构造方法和普通方法有哪些主要区别?

构造方法必须与类名相同,不能被继承,伴随new调用,用于初始化对象,可通过super调用父类构造方法,未定义时编译器生成默认无参构造。普通方法名无要求,可继承,需通过类或实例调用,执行具体业务逻辑,不能使用super,无默认生成。

Java反射是什么?获取Class对象有哪几种方式?

反射允许程序在运行时自我检查并操作内部成员,功能包括获取对象所属类、获取成员和方法、运行时创建对象和调用方法。获取Class对象有三种方式:Class.forName("类路径")、类名.class、实例.getClass()。

Java中创建对象有哪几种方式?

创建对象有四种方式:使用new关键字、反射机制、clone方法、反序列化。

volatile关键字有什么作用?它保证原子性吗?

volatile保证线程间的可见性,即从内存中取数据而不是缓存;但它不保证原子性。

finally代码块一定会被执行吗?什么情况下不会执行?

finally不一定会执行。在进入try之前抛出异常,或调用System.exit(0)时,finally代码块不会执行。

Java异常分为哪几类?多个异常捕获时要注意什么?

异常分为检查性异常(如IO、SQL异常)和运行时异常(如NullPointerException、ClassCastException、ArrayIndexOutOfBoundsException)。多个异常捕获时按多态方式处理,若先捕获基类再捕获子类,子类的处理代码将永远不会执行。

🏷️

标签

➡️

继续阅读