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

时间:2009-11-24 15:08:03

标签: java compiler-construction blackberry

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

4 个答案:

答案 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()的调用,我会测试它而不是做出假设。

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

答案 3 :(得分:0)

对于隐式调用的无参数构造函数,你是正确的。而且我非常确定RIM JRE也是这样做的。

我猜你偶然发现的只是臭名昭着的“ super basic beginner hello world example ”,它甚至会明确地调用super(),以便每个java noob都能理解{{1}的构造函数也被称为。

我查看了您链接到的页面上的大多数示例,看起来像是复制粘贴的内容。例如,如果您查看MainScreen示例,您会注意到此处对无参数子构造函数的Using PIM functions调用缺失。