Что означает расширение статического класса в Java?

Посмотрев несколько примеров кода 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 {
        //...
    }
 }

 //...
}

Исходя из фона С#, где статические классы не могут наследовать из другого класса, я немного смутился по поводу ключевого слова extends после класса Map. Что означает расширение статического класса и какие преимущества оно предоставляет?

Ответ 1

В Java нет такой вещи, как статические классы (не так, как в С#). Это вложенный внутренний класс, а статический атрибут означает, что он может использоваться без экземпляра внешнего класса.

Примеры

Статический вложенный класс может быть создан таким образом:

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

Однако нестатический внутренний класс необходимо создать относительно экземпляра внешнего:

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

Код, взятый из Java-документация по вложенным классам.

Ответ 2

Статический модификатор, применяемый к классам, означает две очень разные вещи в С# и java. В С# статический модификатор класса обеспечивает выполнение всех этих членов класса static. Таким образом, в С#:

  • расширение статических классов не имеет смысла, поэтому оно не разрешено
  • статический модификатор может использоваться для любого класса, а не только для вложенных классов.

Однако в java статический модификатор, применяемый к классу, означает, что класс является статическим членом класса, в котором он вложен, а не того, что его члены должны быть статическими. Таким образом, в java:

  • расширение статических классов допускается, так как его члены не обязательно являются статическими
  • статический модификатор может использоваться только для вложенных классов, потому что его можно использовать только для членов класса (и только вложенные классы могут быть членами класса).

Ответ 3

В этом контексте static означает, что для класса Map не требуется экземпляр WordCount, который должен быть инстанцирован.

Это не имеет никакого отношения к наследованию (final - ключевое слово, которое делает это, хотя)