class A
{
A(int a)
{
System.out.println("A.a = "+a);
}
}
class B extends A
{
B(){
super(3);
System.out.println("B()");
}
B(int a)
{
super(3);
System.out.println("B.a = "+a);
}
public static void main(String args[])
{
new B();
}
}A中没有定义A(){}
编译居然有时正确,有时出错。倒死了。
构造函数调用法则到底是怎么样的??
{
A(int a)
{
System.out.println("A.a = "+a);
}
}
class B extends A
{
B(){
super(3);
System.out.println("B()");
}
B(int a)
{
super(3);
System.out.println("B.a = "+a);
}
public static void main(String args[])
{
new B();
}
}A中没有定义A(){}
编译居然有时正确,有时出错。倒死了。
构造函数调用法则到底是怎么样的??
{
A(){}
A(int a)
{
System.out.println("A.a = "+a);
}
}
如果你把B中的super(3);去掉就会出问题了,因为编译器会自动帮你添加super();这就需要A 有默认构造方法了.
1、new B();
2、调用类B的无参构造方法
B(){
super(3);
System.out.println("B()");
}
3、由于B类中调用的super(3);
所以,调用父类的具有一个参数的构造方法。即:
A(int a)
{
System.out.println("A.a = "+a);
}
4、说明:这样就没有访问到A类的无参构造方法。
如果B类中无参构造方法中没有使用super(3); 或使用无参Super(),
则默认调用A类中的无参构造方法,这时候就会报错。
因为B继承了A,在我的环境下会报A()未定义。
例如
class A
{
A(int a)
{
System.out.println("A.a = "+a);
}
}
只有在 没有为其提供构造方法的时候 才会有默认构造方法之说 。
所以 在本例中
class B extends A
{
B(){
super(3);
System.out.println("B()");
}
B(int a)
{
super(3);
System.out.println("B.a = "+a);
}
public static void main(String args[])
{
new B();
}
}super(3); 是正确的 。 如果换成super()调用默认的构造方法就出错了
A.a = 3
B()