17

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。静的クラスを拡張するとはどういう意味ですか? また、どのような利点がありますか?

4

3 に答える 3

29

static 修飾子をクラスに適用すると、c# と Java では 2 つのまったく異なる意味になります。C# では、クラスの static 修飾子は、そのクラスのすべてのメンバーを static にすることを強制します。したがって、c# では次のようになります。

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

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

  • そのメンバーは必ずしも静的ではないため、静的クラスの拡張は許可されています
  • static 修飾子は、クラス メンバーでのみ使用できるため、ネストされたクラスでのみ使用できます (また、ネストされたクラスのみがクラス メンバーになることができます)。
于 2013-05-28T15:29:58.707 に答える
16

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

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

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 に答える