17

查看网络中的一些 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。扩展静态类是什么意思,它提供了哪些优势?

4

3 回答 3

29

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

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

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

  • 允许扩展静态类,因为它的成员不一定是静态的
  • static 修饰符只能用于嵌套类,因为它只能用于类成员(并且只有嵌套类可以是类成员)。
于 2013-05-28T15:29:58.707 回答
16

Java 中没有静态类之类的东西(与 C# 中的方式不同)。这是一个内部嵌套类,静态属性意味着它可以在没有外部类实例的情况下使用。

例子

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

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

但是,需要相对于外部实例创建一个非静态内部类:

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

代码取自关于嵌套类的 Java 文档

于 2013-05-28T15:07:09.633 回答
11

在这种情况下,静态意味着 Map 类不需要实例化 WordCount 的实例。

它与可继承无关(尽管 final 是这样做的关键字)

于 2013-05-28T15:06:03.400 回答