package pkg;
class Basic2{// 1st
Basic2(int i){
System.out.println("1st class, Basic constructor:"+i);
}
Basic2(){
System.out.println("1st class,Basic default constructor");
}
}
class ExtendBasic2 extends Basic2{//2nd
ExtendBasic2(int i){
super(i+1);
System.out.println("2nd class, Extend constructor:"+i);
}
}
public class p130 extends ExtendBasic2 {//3rd
public p130() {
super(11);//Constructor call must be the first statement in a constructor
System.out.println("3rd class,P130 constructor working now");
}
public static void main(String[] args) {
p130 obj=new p130();
}
}
OUTPUT:
1st class, Basic constructor:12
2nd class, Extend constructor:11
3rd class,P130 constructor working now
package pkg;
class Basic2{// 1st
Basic2(int i){
System.out.println("1st class, Basic constructor:"+i);
}
Basic2(){
System.out.println("1st class,Basic DEFAULT constructor");
}
}
class ExtendBasic2 extends Basic2{//2nd
ExtendBasic2(int i){
// super(i+1);
System.out.println("2nd class, Extend constructor:"+i);
}
}
public class p130 extends ExtendBasic2 {//3rd
public p130() {
super(11);//Constructor call must be the first statement in a constructor
System.out.println("3rd class,P130 constructor working now");
}
public static void main(String[] args) {
p130 obj=new p130();
}
}
OUTPUT:
1st class,Basic DEFAULT constructor
2nd class, Extend constructor:11
3rd class,P130 constructor working now
package pkg;
class Basic2{// 1st
Basic2(int i){
System.out.println("1st class, Basic constructor:"+i);
}
// Basic2(){
// System.out.println("1st class,Basic DEFAULT constructor");
// }
}
class ExtendBasic2 extends Basic2{//2nd
ExtendBasic2(int i){
// super(i+1);
System.out.println("2nd class, Extend constructor:"+i);
}
}
public class p130 extends ExtendBasic2 {//3rd
public p130() {
super(11);//Constructor call must be the first statement in a constructor
System.out.println("3rd class,P130 constructor working now");
}
public static void main(String[] args) {
p130 obj=new p130();
}
}
ERROR:
Implicit super constructor Basic2() is undefined. Must explicitly invoke another constructor
总结:
1、如果基类存在非默认构造器:此时子类构造器要调用基类的默认构造器,该默认构造器必须被“显示定义”。
(除非基类只有默认构造器,那么子类允许调用该隐式默认构造器:删除所有basic2的构造器,3rd代码可以运行)
2、通过super向父类传递参数。该传递参数方式,必须位于子类构造器的首句(first statement)。