web-dev-qa-db-ja.com

Javaで静的クラスを拡張するとはどういう意味ですか?

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キーワードについて少し混乱しました。静的クラスを拡張することはどういう意味ですか、そしてそれはどのような利点を提供しますか?

14
Yeonho

Java(C#と同じ方法ではありません)には静的クラスのようなものはありません。これは 内側 ネストされたクラスと静的属性は、外部クラスのインスタンスがなくても使用できることを意味します。

静的にネストされたクラスは、次のようにインスタンス化できます。

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

ただし、非静的内部クラスは、外部クラスのインスタンスに関連して作成する必要があります。

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

ネストされたクラスに関するJavaドキュメント から取得したコード。

13

静的修飾子は、クラスに適用されると、c#とJavaで2つの非常に異なることを意味します。 C#では、クラスの静的修飾子そのクラスのすべてのメンバーを静的にすることを強制します。したがって、c#では:

  • 静的クラスを拡張することは意味がないため、許可されていません
  • 静的修飾子は、ネストされたクラスだけでなく、任意のクラスで使用できます。

ただし、Javaでは、クラスに適用される静的修飾子は、そのメンバーが静的である必要はなく、ネストされているクラスのクラスは静的メンバーであることを意味します。したがって、Javaでは:

  • メンバーは必ずしも静的ではないため、静的クラスの拡張は許可されます
  • 静的修飾子は、クラスメンバーでのみ使用できるため、ネストされたクラスでのみ使用できます(ネストされたクラスのみがクラスメンバーになることができます)。
25
James Dunn

このコンテキストでは、静的とは、Mapクラスがインスタンス化されるためにWordCountのインスタンスを必要としないことを意味します。

継承可能であることとは何の関係もありません(ただし、finalはそれを行うキーワードです)

11
njzk2