当前位置:编程学习 > JAVA >>

Java语言基础:对象的初始化

1.  如果基类存在默认构造函数,则在子类构造之前,会先调用基类的默认构造函数:

view plaincopy to clipboardprint?
class A {  
    A() {  
        System.out.println("A create");  
    }  
}  
   
class B extends A {  
    B() {  
        // 会在这里先调用A的默认构造函数  
        System.out.println("B create");  
    }  
}  
   
class C extends A {  
    C(int i) {  
        // 会在这里先调用A的默认构造函数  
        System.out.println("C create");  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        B b = new B();  
        C c = new C(10);  
    }  
}  
   
// 输出为:  
A create  
B create  
A create  
C create 
class A {
    A() {
        System.out.println("A create");
    }
}
 
class B extends A {
    B() {
        // 会在这里先调用A的默认构造函数
        System.out.println("B create");
    }
}
 
class C extends A {
    C(int i) {
        // 会在这里先调用A的默认构造函数
        System.out.println("C create");
    }
}
 
public class Main {           
    public static void main(String[] args) {
        B b = new B();
        C c = new C(10);
    }
}
 
// 输出为:
A create
B create
A create
C create
 

2.  如果基类只有带参数的构造函数,子类必须在自己的构造函数中通过super(...)显式调用该基类构造函数:

view plaincopy to clipboardprint?
class A {  
    A(int i) {  
        System.out.println("A create");  
    }  
}  
   
class B extends A {  
    B() {  
        // 必须在这里显式调用父类的非默认构造函数,否则编译不通过  
        // 注意这调用只能放在最前面,否则编译不通过  
        super(20);  
        System.out.println("B create");  
    }  
}  
   
class C extends A {  
    C(int i) {  
        // 必须在这里显式调用父类的非默认构造函数,否则编译不通过  
        // 注意这调用只能放在最前面,否则编译不通过  
        super(30);  
        System.out.println("C create");  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        B b = new B();  
        C c = new C(10);  
    }  
}  
// 输出为:  
A create  
B create  
A create  
C create 
class A {
    A(int i) {
        System.out.println("A create");
    }
}
 
class B extends A {
    B() {
        // 必须在这里显式调用父类的非默认构造函数,否则编译不通过
        // 注意这调用只能放在最前面,否则编译不通过
        super(20);
        System.out.println("B create");
    }
}
 
class C extends A {
    C(int i) {
        // 必须在这里显式调用父类的非默认构造函数,否则编译不通过
        // 注意这调用只能放在最前面,否则编译不通过
        super(30);
        System.out.println("C create");
    }
}
 
public class Main {           
    public static void main(String[] args) {
        B b = new B();
        C c = new C(10);
    }
}
// 输出为:
A create
B create
A create
C create
 

3.  以上只讲了最简单的构造函数调用顺序,其实一个对象的真正的初始化过程应该是:

将对象的存储空间初始化为二进制的0.
先递归到最上层的基类去,将最上层的基类作为当前类。
对于当前类:
按声明顺序调用成员变量的初始设置代码。
调用构造函数。
接着将下一层继承类作为当前类,继续步骤3
先看下面的代码:

view plaincopy to clipboardprint?
class A {  
    A() {  
        System.out.println("A create");  
    }  
}  
   
class D {  
    D() {  
        System.out.println("D create");  
    }  
}  
   
class B extends A {  
    private D d = new D();  
    B() {  
        System.out.println("B create");  
    }  
}  
   
class C extends B {  
    C(int i) {  
        System.out.println("C create");  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        C c = new C(10);  
    }  

class A {
    A() {
        System.out.println("A create");
    }
}
 
class D {
    D() {
        System.out.println("D create");
   

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,