this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句...
发布网友
发布时间:2024-03-29 17:15
我来回答
共2个回答
热心网友
时间:2024-06-16 12:40
如果两个类之间发生了继承关系,那么在实例化子类的时候,JVM隐式的会为我们创建一个父类对象,子类的构造器会调用父类的构造器(super()),先实例化父类对象,然后再实例化子类对象,此时父类中的this就是子类对象;如果是直接实例化的父类对象,那么父类构造器中的this就是父类对象,先实例化父类对象,然后再实例化子类对象(子类中的this),然后调用子类构造器,在子类构造器中调用父类构造器(子类中的super)。
"因为在构造器之前是没有对象的",这句话体现在哪呢?
但是this()必须放在第一行,是因为在构造器之前是没有对象,为什么是这样解释的呢?
终上所述,这两个问题可以这样理解:构造器之前确实是没有对象的,但构造器里面是可以产生对象的,当你new对象的时候this()或者super()就要起作用了,而且必须是第一时间起作用,可以看出其实this()和super()的作用就是实例化对象。仔细阅读上面的总结你会发现,是实例化产生对象之后才能调用构造器,所以必须把this()或者super()放在第一行,实例化产生对象之后,才能执行构造器第二行,第三行的内容。
希望可以帮到你!
假期愉快&新年快乐!
热心网友
时间:2024-06-16 12:37
this() super()
是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
为什么要在第一排呢?
example:
class A{
A() {
System.out.println("You call super class non-args constructor!");
}
}
class B extends A{
B() {
//这里,编译器将自动加上 super();
System.out.println("You call subclass constructor!");
}
B(int c){
System.out.println("wrong,wrong");
}
B(String n) {
这里为空 // super();
System.out.println("想想就是这样");
this();
//实际就是调用了B(){...},而B(){...}已经调用过一次,super();所以super()就被调用两次,也就是对A进行了两次初始化。而在实例化一个对象时,一 个 构造方法只能调用一次,这然显然是不对的.
}
B(double c){
this();
this(3);
//这里实际上也是调用两次super(),也就是对A进行两次初始化,所以其结果也不对
}
}
注:任意一个类,它都一定有父类,如果你没有建立该类的父类,那么该类的父类为Object;