为什么在扩展任何RIM Screen类时建议调用super()构造函数?我的理解是任何超类的no-arg构造函数都是从任何扩展它的类中隐式调用的,我错了吗?
答案 0 :(得分:1)
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()之间也没有差异。
答案 1 :(得分:0)
不,你是对的。有些人喜欢明确地说明这一点 - 我个人并不是粉丝。
你可以链接到这样的推荐,所以我们可以检查没有更微妙的进展吗?
答案 2 :(得分:0)
RIM已经实现了自己的Java VM和编译器。它可能会也可能不会像标准Java VM和编译器那样实现子类。如果RIM建议以某种方式进行,我只需遵循它。
如果你真的想省略对super()
的调用,我会测试它而不是做出假设。
但是,我找不到任何官方文档的提法,说你需要这样做。 Field,Manager和Screen类javadocs没有提到它。
答案 3 :(得分:0)
对于隐式调用的无参数构造函数,你是正确的。而且我非常确定RIM JRE也是这样做的。
我猜你偶然发现的只是臭名昭着的“ super basic beginner hello world example ”,它甚至会明确地调用super()
,以便每个java noob都能理解{{1}的构造函数也被称为。
我查看了您链接到的页面上的大多数示例,看起来像是复制粘贴的内容。例如,如果您查看MainScreen
示例,您会注意到此处对无参数子构造函数的Using PIM functions
调用缺失。