为什么我不能在我的extreme()调用周围使用一个镜头块?

因此,在Java中,您的竖立装置的第一行是非常的电话呼叫...无条件地调用extreme(),或者明确地调用另外的竖立器。 我需要知道的是,为什么我不能放置一个挡块?

我的细节实例是我有一个模拟课程进行考试。 没有默认的竖立装置,但我希望能够使考试不那么复杂。 我还打算将从竖立器权利中删除的豁免权纳入RuntimeException。

所以,我打算这样做是正确的:

public class MyClassMock extends MyClass {
    public MyClassMock() {
        try {
            super(0);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // Mocked methods
}

但Java抱怨说这不是第一个声明。

我的解决方法:

public class MyClassMock extends MyClass {
    public static MyClassMock construct() {
        try {
            return new MyClassMock();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public MyClassMock() throws Exception {
        super(0);
    }

    // Mocked methods
}

这是最有效的解决方法吗? 为什么Java不允许我以前做过?


我对“为什么”的理想预感是,Java并不打算允许我在一个可能不规则的状态下实际创建一个对象......尽管如此,在进行模拟时,我没有提到这一点。 看来我需要有能力做到这一点......或者至少我认识到上面对于我的实例是安全的......或者看起来好像无论如何都需要。

我绕过了我从被检查类中使用的任何方法,因此没有威胁我正在使用未初始化的变量。

0
2019-05-13 02:38:54
资源 分享
答案: 3

遗憾的是,编译器无法处理学术概念,并且尽管您可能认识到它在您的实例中是安全的,但如果它们允许,它肯定需要对所有实例都是安全的。

简单地说,编译器不是简单地退出你,而是退出每个人,包括所有那些不认识它是有害的并且还需要特殊交付的人。 对此也有各种其他因素,因为所有语言通常都有办法 有害 如果一个人认识到如何管理它们,那么就要分

在C#中。 NET有类似的规定,并且宣布召唤基础竖立装置的唯一方法是:

public ClassName(...) : base(...)

这样做,基础竖立器肯定会在竖立器的主体之前被调用,而且你也无法改变这个顺序。

0
2019-05-17 12:22:36
资源

我不能假设对Java内部有深入的理解,但我的理解是,当编译器需要实例化一个获得的类时,它需要首先创建基础(以及它之前的基础(...) )然后添加细分中的扩展。

所以它也不是非连续变量的威胁或类似的东西。 当您尝试在细分'竖立器中执行某些操作时 之前 基类' 安装工人 ,您主要是要求编译器扩展尚不存在的基础对象实例。

修改:在您的实例中, 我的课 成为基础对象,也是 MyClassMock 是一个细分。

0
2019-05-17 12:18:09
资源

我不认识Java是如何应用于内部的,但是如果超类的竖立器抛出异常,那么之后就没有扩展的类的实例。 作为一个例子,调用toString()equals()方法肯定很难,因为它们大多数时候都被获取。

如果1.你绕过超类中的所有方法,并且你没有使用super.XXX()条件,那么Java可能允许在extreme()调用erector周围尝试try / catch,但是所有音频也都是对我很复杂。

0
2019-05-17 12:07:22
资源