您的位置:首页 > 编程语言 > Java开发

使用Java的子类调用构造方法super()和this()

2014-06-04 01:15 721 查看
测试代码:

package Test;

abstract class FatherClass{
abstract void getn();
FatherClass(){
System.out.println("无参父类构造方法");
getn();
}
FatherClass(int i){
System.out.println("有参父类构造方法");
getn();
}
}

class SonClass extends FatherClass{
boolean n=true;
SonClass(int x){
//super();     //与下面的this()发生冲突
this();
System.out.println("有参子类构造方法");
getn();
}

SonClass(){
super(6);
System.out.println("无参子类构造方法");
getn();
}
void getn(){
System.out.println(n);
}
}

public class TestOfConstruction2 {
public static void main(String[] args){
new SonClass(6);
}
}

输出结果:


有参父类构造方法
false   //这里变量n还未初始化
无参子类构造方法
true
有参子类构造方法
true

1.构造方法作用:在系统生成对象时,系统会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化,当对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收。

默认构造方法是没有参数的构造方法,可分为两种:隐含的默认构造方法和程序显式定义的默认构造方法。

在Java语言中,每个类都至少需有一个构造方法。因此,如果用户定义的类中没有提供任何构造方法,那么Java语言将自动提供一个隐含的默认构造方法。该构造方法没有参数,用public 修饰,而且方法体为空,格式如下:

public ClassName(){ } //隐含的默认构造方法
在程序中也可以显式的定义默认构造方法,它可以是任意的访问级别。例如:

protected Employee() { //程序显式定义的默认构造方法
this("Hello~");
}
如果类中显式定义了一个或多个构造方法,并且所有的构造方法都带参数,那么这个类就失去了默认构造方法。//所以上面代码中,SonClass(int x)中自带的隐含super()和this()里的super(int i)没有同时被调用,只有super(int i)有效
2.如果一个子类继承自一个父类,则其构造方法的调用次序为:父类构造方法;成员变量初始化;子类构造方法。

父类的构造方法一定会在子类的构造方法中被调用,并且逐渐向上链接,直到使得每个父类使用的构造方法都能被调用到。

3.子类不能继承父类的构造方法,当子类需要在构造方法中调用父类的构造方法时(只有构造方法才能调用一个类的构造方法)不能直接通过父类的方法名来调用其构造方法,必须使用super(), 而且super()必须是构造方法的第一条语句(事实上系统默认在子类的构造方法里添加了一个隐含的super())。同理,this()也必须要作为构造方法里的第一条语句,这导致在同一个构造方法里super()和this()不共存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: