Что означает расширение статического класса в 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 - ключевое слово, которое делает это, хотя)