在Java中扩展静态类是什么意思?

时间:2013-05-28 15:03:57

标签: java inheritance static

查看Web中的一些java示例代码,我遇到了以下语法:

public class WordCount {

 public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //...
    }
 }

 //...
}

来自C#后台,静态类无法从其他类继承,我对extends类之后的Map关键字感到有些困惑。扩展静态类是什么意思,它提供了哪些优势?

3 个答案:

答案 0 :(得分:24)

静态修饰符在应用于类时,意味着c#和java中有两个非常不同的东西。 在c#中,类上的static修饰符强制使该类的所有成员静态。因此,在c#中:

  • 扩展静态类是没有意义的,所以不允许这样做
  • static修饰符可用于任何类,而不仅仅是嵌套类。

但是,在java中,应用于类的静态修饰符意味着该类是嵌套它的类的静态成员,而不是它的成员必须是静态的。因此,在java:

  • 允许扩展静态类,因为其成员不一定是静态的
  • static修饰符只能用于嵌套类,因为它只能用于类成员(并且只有嵌套类可以是类成员)。

答案 1 :(得分:12)

Java中没有静态类(不像C#中那样)。这是一个 inner 嵌套类,静态属性意味着它可以在没有外部类的实例的情况下使用。

实施例

静态嵌套类可以像这样实例化:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

但是,需要创建与外部实例相关的非静态内部类:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

代码取自Java documentation on nested classes

答案 2 :(得分:10)

在此上下文中,static表示Map类不需要实例化WordCount实例。

它与可继承无关(尽管是最终的关键字)