首页
登录 | 注册

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

测试代码:

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 修饰,而且方法体为空,格式如下:
在程序中也可以显式的定义默认构造方法,它可以是任意的访问级别。例如:
protected Employee() { //程序显式定义的默认构造方法
    this("Hello~"); 
}
如果类中显式定义了一个或多个构造方法,并且所有的构造方法都带参数,那么这个类就失去了默认构造方法。//所以上面代码中,SonClass(int x)中自带的隐含super()和this()里的super(int i)没有同时被调用,只有super(int i)有效

2.如果一个子类继承自一个父类,则其构造方法的调用次序为:父类构造方法;成员变量初始化;子类构造方法。

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

3.子类不能继承父类的构造方法,当子类需要在构造方法中调用父类的构造方法时(只有构造方法才能调用一个类的构造方法)不能直接通过父类的方法名来调用其构造方法,必须使用super(), 而且super()必须是构造方法的第一条语句(事实上系统默认在子类的构造方法里添加了一个隐含的super())。同理,this()也必须要作为构造方法里的第一条语句,这导致在同一个构造方法里super()和this()不共存。




2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号