Java:子类构造函数如何使父类构造函数失效?

3

如何让子类构造函数中和父类构造函数冲突的内容变得中立?

我的意思是在子类构造函数中,我们必须使用super() - 是否存在创建父对象的方法?

带有super的示例:

class abstract Parent{
  protected String name; 
  public Parent(String name){
    this.name=name;
  }
}

class Child extends Parent{
  public Child(String name,int count){
    super(name);
  }    
}
4个回答

4

这里使用“父级”和“子级”不太合适。一个孩子并不是父母的一种类型(我希望我的孩子至少再过十年才是,但这是另外一回事)。

考虑使用不同的名称来表示相同的代码:

class abstract Animal{
protected String name; 
public Animal(String name){
 this.name=name;
 }
}

class Elephant extends Animal{
public Elephant(String name,int count){
  super(name);
}

}

现在,你如何拥有一只不是动物的大象?

你不能这样做。通过在大象类中声明“extends Animal”,你已经将大象作为动物的子类。所有的大象都将是动物。 - user1091739
1
@Joshua:实际上,大象是子类(名词)。它继承了动物类(动词意义上的)。 - BoltClock

1

子类可以通过super.ParentClassVariable = thingToBeChanged;更改父构造函数中的对象指向。

class Parent
{
    BufferedReader inKeyboard;
    public Parent()
    {
        inKeyboard = new BufferedReader (new InputStreamReader(System.in));
    }
}

class Child extends Parent
{ 
    public Child()
    {
        super.inKeyboard = new BufferedReader(new FileReader(filename)); 
    }//changes the pointer in the parent object to point to a different reader
}

现在,当您创建一个子对象时,父类中的方法不再使用(System.in)作为输入,而是使用...(filename)。

1

当您初始化子对象时,您扩展了父对象,该父对象也会被初始化。作为初始化的要求,父对象需要一个名称。这只能在初始化子对象时给出。

所以回答您的问题,不行。


1
为什么你会创建一个子类但不去构造它?如果你的代码需要这样做,那可能是因为设计有问题。Java确实要求你调用父类的构造函数。

在编写测试时,这可能会很有用。 - xdhmoore
@xdhmoore 能否详细说明一下?我认为需要模拟超类构造函数的测试可能表明设计存在问题。 - Ruan Mendes
昨天我在更新一些单元测试时,发现一个类的构造函数中有一个数据库连接,而这个类是通过Mockito进行监视的。在测试构建过程中,它会抛出异常(并记录和忽略它)。我想覆盖这个构造函数,而不调用父类。最终,我创建了一个带有不同签名的子类构造函数。实际上,我得到了一些反馈,认为这是一个不好的解决方案,但那就是我所考虑的情况。 - xdhmoore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接