java 初始化基类_java 初始化基类

从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。

java会自动在派生类的构造器中插入对基类的构造器的调用。下例展示了上述机制:

public class B1 {

B1() {

//super();

System.out.println("B1()");

}

}

public class B2 extends B1 {

B2() {

//super();

System.out.println("B2()");

}

}

public class B3 extends B2 {

B3() {

//super();

System.out.println("B3()");

}

public static void main(String[] args) {

B3 b3 = new B3();

System.out.println();

}

}

输出的结果为:

B1()

B2()

B3()

从上述代码中可以看到,构建过程是从基类"向外"扩散的,所以在派生类的构造器在没有访问之前基类的构造器已经被访问了。即使你不为B3创建构造器,编译器也会为你提供一个默认的构造器去调用基类的构造器。将上诉代码中的三个super();

去除注释结果是一样的,只不过是我现实的调用了基类的构造器。

带参数的构造器

上诉事例中构造器都是无参的,编译器可以轻松的调用它因为不必考虑要传递什么样的参数。但是如果没有默认基类构造器,或者想调用一个带参数的基类构造器,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。

public class B1 {

B1(int i) {

System.out.println("B1()");

}

}

public class B2 extends B1 {

B2(int i) {

super(i);

System.out.println("B2()");

}

}

public class B3 extends B2 {

B3() {

super(11);

System.out.println("B3()");

}

public static void main(String[] args) {

B3 b3 = new B3();

System.out.println();

}

}

如果没有在B3中调用基类的构造器,那么编译器就会提示错误:"未定义隐式超构造函数 B2()。必须显式调用另一个构造函数"。而且,调用基类的构造器必须是你在派生类构造器中做的第一件事(调用基类构造器的代码必须放在派生类构造器的第一行)。

总结:当创建一个派生类的对象时,先被访问的是基类的构造器,然后是派生类的构造器。如果基类没有提供默认的构造器,那么派生类就要用关键字super显示地调用基类的那个构造器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值