Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Blackberry Screen类中的超级构造函数调用_Java_Compiler Construction_Blackberry - Fatal编程技术网

Java Blackberry Screen类中的超级构造函数调用

Java Blackberry Screen类中的超级构造函数调用,java,compiler-construction,blackberry,Java,Compiler Construction,Blackberry,为什么在扩展任何RIM Screen类时建议调用super()构造函数?据我所知,任何超类的无参数构造函数都是从任何扩展它的类隐式调用的,我错了吗?不,你完全正确。有些人喜欢把它明确地说出来——我个人不是一个粉丝 你能链接到这样一个建议吗,这样我们就可以检查没有更微妙的事情发生了吗?RIM已经实现了自己的Java虚拟机和编译器。它可能会也可能不会完全像标准的JavaVM和编译器那样实现子分类。如果RIM建议用某种方式来做,我会照做 如果您真的想省略对super()的调用,我将对其进行测试,而不是

为什么在扩展任何RIM Screen类时建议调用super()构造函数?据我所知,任何超类的无参数构造函数都是从任何扩展它的类隐式调用的,我错了吗?

不,你完全正确。有些人喜欢把它明确地说出来——我个人不是一个粉丝


你能链接到这样一个建议吗,这样我们就可以检查没有更微妙的事情发生了吗?

RIM已经实现了自己的Java虚拟机和编译器。它可能会也可能不会完全像标准的JavaVM和编译器那样实现子分类。如果RIM建议用某种方式来做,我会照做

如果您真的想省略对
super()
的调用,我将对其进行测试,而不是进行假设


但是,我找不到任何官方文件中提到的你需要这样做,类javadocs没有提到它。

隐式调用no-arg构造函数是正确的。我敢肯定RIM JRE也是这样做的

我猜你偶然发现的只是臭名昭著的“super basic初学者hello world示例”,它甚至显式调用了
super()
,这样每个java noob都知道
MainScreen
的构造函数也被调用了

我浏览了你链接到的页面上的大多数示例,它看起来像是复制粘贴的东西。例如,如果您使用PIM函数签出
示例,您会注意到在这里,无参数子构造函数中缺少对
super()
的调用。

super()将在默认构造函数中被调用,无论您是否实现它

这很容易测试。就几节课:

class ClassA {
    public ClassA() {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.inform("ClassA()");
            }
        });
    }
}

class ClassB extends ClassA {
    public ClassB() {
        super();
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.inform("ClassB()");
            }
        });
    }
}

class ClassC extends ClassA {

}

class ClassD extends ClassA {
    public ClassD() {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.inform("ClassD()");
            }
        });
    }
}
和测试应用程序:

class Scr extends MainScreen {

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);

        menu.add(new MenuItem("class A", 0, 0) {
            public void run() {
                ClassA a = new ClassA();
            }
        });
        menu.add(new MenuItem("class B", 0, 0) {
            public void run() {
                ClassB b = new ClassB();
            }
        });
        menu.add(new MenuItem("class C", 0, 0) {
            public void run() {
                ClassC c = new ClassC();
            }
        });
        menu.add(new MenuItem("class D", 0, 0) {
            public void run() {
                ClassD d = new ClassD();
            }
        });
    }
}

你看,ClassA()和ClassC()中的对话框调用没有区别,ClassB()和ClassD()之间也没有区别。

当然,这是RIM的hello world演示:原始来源:因为这是一个hello world示例,我认为作者是明确的。这个例子并没有说它实际上是必需的。是的,但它会在其他几个例子和他们的大部分PDF文档中弹出。我相信这是有原因的,即使这只是整个公司的政策。在字段类显式地需要一个长参数来设置其样式的情况下,这似乎是有意义的,(您经常会看到super(0)),但对于一般用途来说,这只是有点令人困惑。在示例中显示它与推荐的不太一样。我仍然在遇到它,本入门指南的第20页:内容如下:2.在内部类的构造函数的第一行中,调用MainScreen类的构造函数。超级();这可能只是一个严格遵守的代码样式吗?很好。我已经多次将其从代码中排除,没有明显的不良影响。显然,为了安全起见,我应该把它包括在内,但我仍然想知道它背后的原因。嗯,你为什么接受这个答案?首先你是怀疑论者,然后接受这样一个回答:只是为了确保call
super()
对不起,这里是新的,我认为需要选择一个答案作为已接受的答案。您暗示自定义RIM虚拟机可能需要它,这听起来似乎是一个很好的理由,可以关闭并键入super();-我将取消选择您的答案(无意冒犯),希望RIM开发人员能够提供一些信息。对super()的调用将在发出的字节码中,因此这是一个编译器问题,而不是VM问题。好的一点是,RIM也有一个专有编译器,其行为可能与标准编译器相同,也可能与标准编译器不同。