Java关于含有继承类的成员初始化过程讲解
在Java中,含有继承类的成员初始化过程比较复杂。本文将从以下几个方面详细讲解初始化过程:继承、实例化、构造函数和静态变量初始化。通过多个示例的说明,让读者更加深入地理解Java中含有继承类的成员初始化过程。
继承
在Java中,子类继承了父类的属性和方法,但是并不包括构造函数。因此,在实例化子类时,需要先实例化父类。这个过程称为构造函数链。构造函数链的执行顺序是从顶层父类开始,逐级向下执行,最后执行子类的构造函数。
实例化
实例化是指将类变量转化为真正意义上的实例。在实例化时,需要执行以下几个步骤:
- 分配内存空间,其中包括非静态变量和一些辅助信息,如虚函数表。
- 非静态变量初始化。变量的初始值由变量类型决定,引用类型的初始值为null。
- 执行构造函数。
构造函数
在执行构造函数时,需要执行以下几个步骤:
- 执行父类的构造函数。这个过程以构造函数链的方式逐级向下执行。
- 执行子类的构造函数。
需要注意的是,构造函数是不可继承的。如果子类没有定义构造函数,则默认使用父类的无参构造函数。
静态变量初始化
静态变量是类变量,在程序启动时就会被初始化。在含有继承类的情况下,静态变量的初始化顺序是从父类开始,逐级向下执行。
下面通过两个示例来说明含有继承类的成员初始化过程。
示例1
class A {
static String s1 = "A's static variable";
String s2 = "A's non-static variable";
{
System.out.println(s2);
}
public A() {
System.out.println("Inside A's constructor");
}
}
class B extends A {
static String s1 = "B's static variable";
String s2 = "B's non-static variable";
{
System.out.println(s2);
}
public B() {
super();
System.out.println("Inside B's constructor");
}
}
public class C extends B {
static String s1 = "C's static variable";
String s2 = "C's non-static variable";
{
System.out.println(s2);
}
public C() {
super();
System.out.println("Inside C's constructor");
}
public static void main(String[] args) {
C c = new C();
}
}
输出结果:
A's non-static variable
A's non-static variable
Inside A's constructor
B's non-static variable
Inside B's constructor
C's non-static variable
Inside C's constructor
示例1说明了含有继承类的成员变量初始化和构造函数执行顺序。对于三个含有继承的类A、B和C,分别定义了静态变量s1和非静态变量s2,并且都有一个普通代码块。输出结果显示了变量初始化和构造函数执行过程中的信息。
示例2
public class A {
static {
System.out.println("A's static block");
}
{
System.out.println("A's non-static block");
}
public A() {
System.out.println("Inside A's constructor");
}
}
public class B extends A {
static {
System.out.println("B's static block");
}
{
System.out.println("B's non-static block");
}
public B() {
super();
System.out.println("Inside B's constructor");
}
}
public class C extends B {
static {
System.out.println("C's static block");
}
{
System.out.println("C's non-static block");
}
public C() {
super();
System.out.println("Inside C's constructor");
}
public static void main(String[] args) {
C c = new C();
}
}
输出结果:
A's static block
B's static block
C's static block
A's non-static block
Inside A's constructor
B's non-static block
Inside B's constructor
C's non-static block
Inside C's constructor
示例2说明了含有继承类的成员变量的静态代码块初始化过程。对于三个含有继承的类A、B和C,分别定义了静态代码块和普通代码块,输出结果显示了静态代码块和普通代码块初始化的顺序。需要注意的是,静态代码块只会被执行一次,而普通代码块会在每次实例化时都被执行。
总结
含有继承类的成员变量初始化和构造函数的执行顺序比较复杂,但是遵循一定的规则,可以让我们更好地理解和掌握。在编写含有继承类的代码时,需要注意变量初始化和构造函数执行顺序,以免出现意外的bug。同时,由于静态变量的初始化是在程序启动时就会完成,因此静态变量的初始化顺序也需要注意。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java关于含有继承类的成员初始化过程讲解 - Python技术站