2009-11-24 70 views
2

为什么在扩展任何RIM屏幕类时建议调用super()构造函数?我的理解是任何超类的无参数构造函数都是从任何延伸它的类中隐式调用的,我错了吗?Blackberry屏幕类中的超级构造函数调用

+0

好的,这是RIM公司的hello world演示: http://pastebin.com/m48ebd7de 原始来源: http://na.blackberry.com/eng/developers/resources/developer_labs.jsp#tab_tab_jde – HughOBrien 2009-11-24 15:14:20

+0

由于这是一个Hello World示例,我认为作者是明确的。这个例子并没有说它实际上是* required *。 – 2009-11-24 15:17:12

+0

确实如此,但它在其他几个示例中以及大多数PDF文档中弹出。我相信这是有原因的,即使这只是一个公司风格的政策。 在场类明确需要一个很长的参数来设置它们的样式的情况下(你经常会看到super(0)),但是对于一般用途来说,这似乎有意义。 – HughOBrien 2009-11-24 15:20:16

回答

1

无论您是否实施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的之间也没有diff文件()和ClassD()。

0

不,你是对的。有些人喜欢明确地表达清楚 - 我个人不是粉丝。

你可以链接到这样的建议,所以我们可以检查没有什么更微妙的事情吗?

0

RIM已经实现了自己的Java VM和编译器。它可能或可能不会像标准Java VM和编译器那样实现子分类。如果RIM推荐以某种方式进行,我会简单地遵循它。

如果你真的想省略呼叫super()我会测试它,而不是做出假设。

但是,我找不到任何官方文档的参考,说你需要这样做。 Field,ManagerScreen class javadocs没有提及它。

+0

好点。我已经从我的代码中排除了它很多次,没有明显的不良影响。很明显,我应该把它包括在内以保证安全,但我仍然想知道背后的原因。 – HughOBrien 2009-11-24 15:17:25

+0

嗯你为什么接受这个答案?首先,你是怀疑的,然后接受一个答案,说:只要确保调用'super()' – jitter 2009-11-24 15:32:02

+0

对不起,在这里新的,认为有必要选择一个答案接受。这意味着定制的RIM虚拟机可能需要它听起来像是一个足够好的理由来闭嘴并输入super(); - 我会取消选择你的​​答案(不要冒犯),希望RIM开发者能够说出一些亮点。 – HughOBrien 2009-11-24 15:40:17

0

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

我猜你偶然发现仅仅是个臭名昭著的“超级初学者的Hello World示例”甚至呼吁super()明确,使每一个Java小白明白的MainScreen调用构造函数了。

我浏览了您链接到的页面上的大部分示例,它看起来像复制粘贴的东西。例如,如果您结算Using PIM functions样本,则会注意到在这里,no-arg子构造函数中缺少对super()的调用。

相关问题