2012-06-27 101 views
1

就我所研究的情况而言,Java中的静态类只有在内部类时才有意义。Java中的公共静态非内部类?

但我只是碰到这种例子来了,我想了解作者的意思是什么,它做什么,以及它是如何工作的:

来自:http://developer.android.com/guide/topics/ui/actionbar.html

public static class TabListener<T extends Fragment> implements ActionBar.TabListener { 
     // a normal class with public constructor and TabListener methods 
     ... 
    } 

什么静态意味着这里为什么它应该工作吗? 为什么他将片段扩展为<T >?而不是正常的方式。

谢谢!

编辑: 哇,这是很多答案很快。 感谢所有在这里分享知识的人。

我会将@npe answer标记为正确的,因为他正确地指出示例中的文本指示此类是成员。

也有一些奇怪的堆栈溢出格式化,我刚刚固定在我原来的问题,并在这里重复: ,为什么他扩展片段与<T >

和@Ahmad回答了那个,但我不能标出两个正确的答案。

+1

这个类绝对必须是内部的 – iozee

回答

3

无法将成员类声明为static - 它会发出编译器错误。 而你的榜样约一个成员类 - 引用the page you linked to

例如,下面的每个选项卡使用自己的听众的情况下,你会如何实现ActionBar.TabListener例如:

所以页面状态,即TabListener是成员类

+0

根据定义,内部类是非静态的。你的意思是一个嵌套类。 – assylias

+1

更改为_“成员”_。 – npe

1
what static means here and why should it work? 

你需要封闭类的实例,如果你不作内部类是静态的。

好吧,听众对某些类通常是特别的...所以为了凝聚力,让他们在课堂上是很好的。

why is him extending Fragment with 

tablistener必须期待在其本身必须是Fragement子类型的对象。阅读有关泛型以了解更多信息。

0

该课程是内在的。关键字static仅适用于内部类。

1

这个类肯定是内在的。 问号是什么,它只是一个通用类型。这意味着这个类使用了一些扩展Fragment类型的类型。当使用这个类,你只需说new TabListener<SomeTypeExtendingFragment>()

2

按照该Java Language Specification,在类的上下文:

修饰符静态仅适用于成员类(第8.5.1节),而不是最高级别或本地或匿名课程。

所以你显示的代码只能是嵌套类,它不能是顶级类。

另请注意,内部类是非静态嵌套类,所以静态类不能是内部类,只能是嵌套类。

1

通常当我们实现一个监听器时,我们使用this。不过,在这种情况下,他们为特定于特定Tab的收听者创建了一个内部类。静态类意味着它是直接访问和创建的,而不是通过创建父类的实例,因此您可以直接实例化TabListener。它也是一个独立的实体,所以它看起来好像是一个独立的班级。 (实际上,你可以在没有static的文件中定义它。)

相关问题