我有一个这样的课程:
public class BaseClass
{
public BaseClass(URL url, String something, String whatever)
{
// Do some stuff with URL, something and whatever
}
public List ImportantFunction()
{
// Some important stuff here
}
}
我想使用这个类,但是我想在构造函数中做不同的事情。构造函数所做的事情我需要以不同的方式完成它们。但我想使用其他类方法的所有功能。
我认为最简单的方法是扩展课程。但是当我这样做时,构造函数要求我调用父构造函数:
super(url, something, whatever);
是否可以扩展基类但具有完全不同的构造函数?我不希望完全调用BaseClass
构造函数...
答案 0 :(得分:8)
您必须调用超类的 a 构造函数。如果没有显式调用,Java将尝试自动调用无参数构造函数;如果不存在,则会出现编译错误。您调用的构造函数不需要与传递给子类的构造函数的参数相对应。
这是强制性的 - 对象的成员变量可以在构造函数中初始化,而不调用其中一个可能会违反超类的内部假设。
没有办法解决使用JNI破坏JVM的问题。
答案 1 :(得分:2)
您将登陆调用基类构造函数。如果您不想调用此特定构造函数,则必须定义默认构造函数
public BaseClass(){ }
然后在扩展时,首先默认调用此构造函数。只有这样才能调用SubClass中的构造函数。
答案 2 :(得分:0)
您不必在父级中调用该特定构造函数。如果父项定义了默认构造函数,则可以执行以下操作:
public class ChildClass extends BaseClass {
public ChildClass(URL url, String something, String whatever) {
// implicit call to the Parent's default constructor if next line is commented
super(); // explicit call to the default constructor of ParentClass
// now do stuff totally specific to your ChildClass here
}
}
答案 3 :(得分:0)
我不敢,你无法绕过不编辑超类的构造函数。但是,如果您担心这可能会影响现有代码,您可以使用以下操作,但我通常不推荐它:
protected void init(URL url, String something, String whatever){\\constructor code}
从构造函数
中调用此方法public BaseClass(URL url,String something,String whatever){ init(URL url,String something,String whatever); }
在子类中重写此受保护的方法。