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