当子类继承父类时候,子类的构造函数用this 或者super
为什么super(i);这里改成了this(i);怎么不对啊?
class base{
// base(){
// System.out.println("base constructor");
// }
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
super(8);
System.out.println("derived constructor");
}
derived(int i){
super(i);//这里改this(i);怎么不对啊?
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}
super(i);//这里改this(i);怎么不对啊?
System.out.println("derived constructor int i");
}
---------------------------------------------------------------
super(i),调用父类的构造函数。this(i)调用自身的构造函数,构造函数系统自动调用,而不允许这样显式的调用。等同于:
public class Main {
Main(int i)
{
;
}
Main()
{
}
public static void main(String[] args) {
Main m = new Main();
m.Main(20); //一样的不合法:
}}
shazi_pig(傻子)
那子类的构造函数用this 怎么做呢?
super(i);//这里改this(i);怎么不对啊?
System.out.println("derived constructor int i");
}
都说不能显式调用构造函数了,特别是在构造函数derived里面调用构造函数本身super
当derived d=new derived();时
会自动先调用父类构造函数base();//如果没参数,也可以在子类构造函数里显式父类构造函数super(i);
再调用子类构造函数derived();
如果有static块,方法,变量,且为第1次使用这个类
则先初始化父类static块,方法,变量
再初始化子类static块,方法,变量
再调用父类,子类构造函数
A(){
this(1);//要这样加
}
A(int i){
//this(1); 这里加就错了,你看一下,加上会不会出现循环问题
}
}
用this调用本类的构造函数要避免出现间接调用自身的情形(死循环,有些编译器也报错).常见用法:
class Base{
Base(){
this(0);//也可以用this(0.0f);但不能用自身,即this();
}
Base(int i){
//这里完成初始化,但不要出现调用this()的情况(如果上面用了this(0);)
}
Base(float f){
//这里完成初始化,但不要出现调用this()的情况(如果上面用了this(0.0f);) }}