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

问题描述 投票:0回答:4

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

java blackberry
4个回答
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() 之间也没有区别。


0
投票

不,你说得完全正确。有些人喜欢为了清楚起见而明确地把它放进去 - 我个人不是粉丝。

您可以链接到这样的建议,以便我们检查是否没有更微妙的事情发生?


0
投票

您关于隐式调用无参数构造函数的说法是正确的。我非常确定 RIM JRE 也是这样做的。

我猜你偶然发现的只是臭名昭著的“超级基础初学者你好世界示例”,它甚至显式调用

super()
,以便每个java菜鸟都明白
MainScreen
的构造函数也被调用。

我浏览了您链接到的页面上的大部分示例,它看起来像是复制粘贴的东西。例如,如果您检查

Using PIM functions
示例,您会注意到这里的无参数子构造函数中缺少对
super()
的调用。


0
投票

RIM 实现了自己的 Java VM 和编译器。它可能会也可能不会像标准 Java VM 和编译器一样实现子类化。如果 RIM 建议以某种方式去做,我就会遵循它。

如果您真的想省略对

super()
的调用,我会对其进行测试而不是做出假设。

但是,我找不到任何官方文档说明您需要这样做。 FieldManagerScreen类javadocs没有提及。

© www.soinside.com 2019 - 2024. All rights reserved.