this(空/有参)用于本类构造方法的调用,而super(空/有参)则用于在子类构造方法中对父类构造方法的调用。
子类的每个构造方法的第一行默认都会隐式的调用super()即父类的无参构造函数
下面上代码来解释
1.
/**
父类
**/
class Fu
{
public Fu()
{
System.out.println("Fu 空参构造");
}
public Fu(int num)
{
System.out.println("Fu 有参构造 "+num);
}
}
/**
子类
**/
class Zi extends Fu
{
public Zi()
{
System.out.println("Zi 空参构造");
}
public Zi(int num)
{
System.out.println("Zi 有参构造 "+num);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi zi = new Zi(1);
}
}
打印结果如下图1.png:
从而印证了在
public Zi(int num)
{
//super( );此构造的第一行隐式调用了此代码,也可以显示的调用super( )
System.out.println("Zi 有参构造 "+num);
}
当然我们也可以显示的调用我们想调用的父类的构造方法,直接在子类构造方法的第一行显示调用super(参数)即可,而此时,默认的父类无参构造super(),将不会再调用.
除非显示调用的是super( )那么父类的无参构造自然就又调用了,等同于不写的时候,隐式调用父类无参构造
---------------------------------------------------------------------------------------------------------------------------------
2.再看,如果将代码做如下修改:
/**
父类
**/
class Fu
{
public Fu()
{
System.out.println("Fu 空参构造");
}
public Fu(int num)
{
System.out.println("Fu 有参构造 "+num);
}
}
/**
子类
**/
class Zi extends Fu
{
public Zi()
{
super(1);
this(1);
System.out.println("Zi 空参构造");
}
public Zi(int num)
{
System.out.println("Zi 有参构造 "+num);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi zi = new Zi();
}
}
在子类无参构造里又调用了super(1); 和 this(1);且都在第一行,当编译的时候报出了如下错误:如图2.png
说this()语句要放在构造函数的第一行,那么让this(1);和super(1); 互换顺序呢?编译如下图3.png
由此可得到结论,this(空/有参),super(空/有参)都必须放在构造函数的第一行,所以不可同时在构造里显示的调用两者