前言:
如果Java的父类中没有定义无参的构造方法,即父类中所有的构造方法都是有参数的,那么,继承它的子类的构造方法会如何处理?
例如下代码:
class A{
private int a;
private int b;
public A(int x,int y)
{
a=x;
b=y;
}
}
class B extends A{
private int c;
private int d;
public B(int z,int w)
{
c=z;
d=w;
}
}
这样写编译器会报错。为什么会报错?
原因很简单:
(1)B继承于A,那么,子类B中的构造方法的第一句,就默认是super()语句(即使我们不写),而super()语句又会去调用父类A的无参构造方法,但是父类A中,我们并没有定义无参的构造方法。所以,super()语句就不能正确的找到父类A的构造方法,所以,就发生编译错误。
(2)有人可能会说,编译器会自动为我们添加一个默认的无参数的构造方法。但是呢,这个默认的无参数的构造方法是在我们没有写任何的构造方法的前提下,编译器才会为我们生成默认的无参数的构造方法,然而在这里我们已经写了一个有参数的构造方法,编译器就不会自动添加默认的无参数的构造方法。
【解决方案】:
(1)方法一:在父类A中添加一个无参的构造方法
(2)方法二:在子类B中的构造方法中添加有参数的super()语句,用这个super()语句去调用父类有参数的构造方法。
(3)方法三:在子类B中使用this关键字调用本身其他的构造方法,但是调用的这个其他的构造方法一定要有一个去访问了父类的有参构造方法,即:调用的这个其他的构造方法中写了有参数的super()语句。
【注意】:super()语句和this()语句必须在构造方法的第一句。
在这里,我们可以注意到,super是访问父类的东西,this是使用本类的东西。
例:
(1)方法一:
class A{
private int a;
private int b;
public A()
{
a=0;
b=0;
}
public A(int x,int y)
{
a=x;
b=y;
}
}
class B extends A{
private int c;
private int d;
public B(int z,int w)
{
c=z;
d=w;
}
}
(2)方法2:
class A{
private int a;
private int b;
public A(int x,int y)
{
a=x;
b=y;
}
}
class B extends A{
private int c;
private int d;
public B(int z,int w)
{
super(13,14);
c=z;
d=w;
}
}
(3)方法三:
class A{
private int a;
private int b;
public A(int x,int y)
{
a=x;
b=y;
}
}
class B extends A{
private int c;
private int d;
public B(int z,int w)
{
this(12);//调用下面一个参数的构造方法。
c=z;
d=w;
}
public B(int q)
{
super(13,14);
}
}
至于为什么要这么做,我的理解是:既然B继承于A,那么A肯定在B初始化之前就初始化好了,所以,在子类B的构造方法中第一句必须是对父类A的初始化。
【可能有错误,望大佬不吝赐教~~】