超级中的超级方法

时间:2014-06-18 06:08:54

标签: java

请考虑以下课程:

class MyClass extends Parent {
    private AnotherClass property;

    public MyClass(int value) {
        super(new AnotherClass(value));
        this.property = new AnotherClass(value);
    }
}

class AnotherClass {
    /* Implementation not shown */
}

class Parent {
    /* Implementation not shown, and may not be changed */
}

在不更改构造函数参数的情况下(例如:MyClass(AnotherClass value)),我如何构造它以便new AnotherClass()不会被调用两次?

以下是不起作用的示例:

public MyClass(int value) {
    AnotherClass anotherClass = new AnotherClass(value);
    super(anotherClass);
    this.property = anotherClass;
}

它引发了一个错误,指出对super的调用必须是第一行。

我正在创建需要我进行双重调度的内容,而且我可能不会更改实例化MyClass的方式。 (new MyClass(0))。我也许不会碰到超级班。

是否可以只调用一次AnotherClass?

4 个答案:

答案 0 :(得分:4)

将其移动以使用两个构造函数

public MyClass(int value) {
    this (new AnotherClass(value));
}

public MyClass(AnotherClass a) {
    super(a);
    this.property = a;
}

注意

@alfasin

也提出了这一点

答案 1 :(得分:1)

你不能这样做,因为必须在第一行调用super()。那说, 您可以在调用AnotherClass之前使用依赖注入并实例化new MyClass(new AnotherClass())。然后构造函数将如下所示:

public MyClass(AnotherClass a) {
    super(a);
    this.property = a;
}

如果您无法更改MyClass,可以使用包装类将其包装并应用相同的“技巧”。

答案 2 :(得分:1)

您可以尝试这样的事情:

private static AnotherClass temp;

public MyClass(int value) {
    super(temp = new AnotherClass(value));
    this.property = temp;
    temp = null;
}

答案 3 :(得分:0)

首先让我修复编译错误。

Class MyClass {

错了。你应该写

class MyClass {

代替。

其次,当你从类的构造函数中调用suprer(something)时,你实际上会调用显然必须存在的超类的构造函数。否则您将收到编译错误。由于java中的所有类都隐式扩展java.lang.Object(除非定义了其他基类)并且java.lang.Object没有能够获得类型AnotherClass的参数的构造函数,因此行super(new AnotherClass())不能编译。

第三,超类的构造函数的调用必须是构造函数的第一行。否则,实例的创建可能不一致,因为子类可能使用超类的状态。

因此,以下代码将编译并运行。

class MyBaseClass {
    protected MyBaseClass(AnotherClass ac) {
        // some initialization code
    }
}

class MyClass extends MyBaseclass {
    private AnotherClass property;

    public MyClass(int value) {
        super(new AnotherClass(value));
        this.property = new AnotherClass(value);
    }
}

我希望这个答案有所帮助。