Java - 你可以覆盖一个没有调用父类构造函数的类吗?

时间:2012-01-31 04:38:02

标签: java inheritance

我有一个这样的课程:

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构造函数...

4 个答案:

答案 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)

我不敢,你无法绕过不编辑超类的构造函数。但是,如果您担心这可能会影响现有代码,您可以使用以下操作,但我通常不推荐它:

  1. 将所有构造函数代码移动到BaseClass中的受保护方法,例如 protected void init(URL url, String something, String whatever){\\constructor code}
  2. 从构造函数

    中调用此方法

    public BaseClass(URL url,String something,String whatever){     init(URL url,String something,String whatever); }

  3. 在子类中重写此受保护的方法。