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 ,