JAVA面试:继承与初始化顺序深度解析

需积分: 10 5 下载量 100 浏览量 更新于2024-10-15 收藏 573KB PDF 举报
"JAVA面试题解惑系列,深入解析Java面试中的重要知识点,包括类的初始化顺序和传值传引用等概念。" 在Java面试中,深入理解类的初始化顺序是一个关键点,尤其是在涉及继承关系时。根据描述,面试题常常会设计成给出两个具有继承关系的类,每个类包含构造器、变量以及可能的操作这些变量的代码,目的是考察面试者对于类初始化顺序的掌握。 首先,我们来看类的初始化顺序的基本原则: 1. 静态变量和静态初始化块:这部分的初始化发生在类加载阶段,按照它们在源码中的顺序进行。首先执行父类的静态变量和静态初始化块,然后执行子类的静态变量和静态初始化块。 2. 实例变量和实例初始化块:当创建类的新实例时,这部分的初始化会在构造器执行之前完成。先执行父类的实例变量和实例初始化块,再执行子类的实例变量和实例初始化块。 3. 构造器:最后执行的是构造器,用于初始化新创建的对象。同样遵循先父类后子类的顺序。 以下是一个简单的例子来演示这个过程: ```java class Parent { public static String p_StaticField = "父类--静态变量"; public String p_Field = "父类--变量"; static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } { System.out.println(p_Field); System.out.println("父类--初始化块"); } public Parent() { System.out.println("父类--构造器"); } } class Child extends Parent { public static String c_StaticField = "子类--静态变量"; public String c_Field = "子类--变量"; static { System.out.println(c_StaticField); System.out.println("子类--静态初始化块"); } { System.out.println(c_Field); System.out.println("子类--初始化块"); } public Child() { System.out.println("子类--构造器"); } } public class Main { public static void main(String[] args) { new Child(); } } ``` 当我们运行`Main`类并创建一个`Child`对象时,输出顺序将是: 1. 父类的静态变量和静态初始化块 2. 子类的静态变量和静态初始化块 3. 父类的实例变量和实例初始化块 4. 子类的实例变量和实例初始化块 5. 父类的构造器 6. 子类的构造器 此外,描述中提到的“传值传引用”也是一个重要的Java概念。在Java中,基本类型是按值传递,而对象则是按引用传递。这意味着当你将一个对象作为参数传递给方法或作为另一个对象的成员时,你实际上是传递了指向该对象的引用,而不是对象本身。这意味着方法可以改变对象的内部状态,但不能改变引用本身。 例如: ```java public class Test { public static void main(String[] args) { int a = 10; // 基本类型,按值传递 changeInt(a); System.out.println(a); // 输出仍然是10,未受影响 MyClass obj = new MyClass(); // 对象,按引用传递 changeObject(obj); System.out.println(obj.value); // 输出20,对象状态已改变 } public static void changeInt(int i) { i = 20; // 这里只改变了副本,原值不受影响 } public static void changeObject(MyClass o) { o.value = 20; // 这里改变了对象的内部状态 } } class MyClass { public int value; } ``` 在这个例子中,`changeInt`方法改变了其副本的值,而不会影响到`a`的原始值。而在`changeObject`方法中,我们通过引用改变了`MyClass`对象的状态,因此在`main`方法中打印出的`obj.value`值为20。 掌握这些核心概念对于任何Java开发者,尤其是面试者来说都是至关重要的,因为它们直接影响着程序的行为和正确性。在面试中表现出对这些基础知识的深入理解和应用,无疑能够提升你的专业形象。