子类构造方法参数一定要和父类构造方法参数相同吗,子父类构造方法参数有什么关系
class A
{
public A(int a) { }
}
class B extends A
{
public B(int b) { }
}
这不行,因为A没有无参数构造函数。派生类需要指定:
class A
{
public A(int a) { }
}
class B extends A
{
public B(int b) { super(b); }
}
这样就可以
当然不需要了。当父类没有无参数构造函数的时候,派生类构造函数必须用super(参数列表) 指明自己调用哪个基类的构造函数。
但是派生类构造函数的参数可以不同(一般派生类的参数会更多,或者包含初始化自己特有变量的参数)
是没有必要。
在初始化子类时,会调用父类,没有参数上的依赖性。参数的多与少,都是可以的。
举例:
class A
{
}
class B extends A
{
public B(int b) { }
}
以上代码可以编译,B显然有一个有参数构造函数,A没有。这没问题
class A
{
public A(int a) { }
}
class B extends A
{
public B(int b, int c) { super(b); }
}
再给B增加一点参数,这样也可以
子类构造函数的参数跟父类构造函数的参数当然可以不一致了,因为子类继承自父类,可以有自己特有、而父类没有的一些属性。
子类编写构造函数的时候,需要注意的是,如果父类也提供了有参构造函数,那么第一步一定是先调用父类的有参构造函数。
所以子类构造函数的参数列表一定是包含父类有参构造函数列表。例如子类参数集合为A,父类参数集合为B,那么必须A>=B。
当然是不一定的,我们抛开代码实现上的东西谈一下,子类是父类中更具体的一部分,而构造函数的参数是干什么的?初始化成员变量(可以理解为属性,特征),那么子类是否具有父类的属性、特征呢?当然有,而且应该具有更多的属性、特征。构造器(构造函数)的本质是创建一个内存对象,如果有必要,可以继续为该类对象初始化部分成员变量。