Java 面试题
内容提要
本文汇总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)。多个异常捕获时按多态方式处理,若先捕获基类再捕获子类,子类的处理代码将永远不会执行。