93

IDEとしてEclipseを使用しています。また、アプリケーションを JAR ファイルにエクスポートするためにも使用します。JAR ファイル内の自分のクラスを見ると、いくつかのクラスには、そのクラスの名前、ドル記号、数字が含まれています。例えば:

Find$1.class 
Find$2.class
Find$3.class
Find.class

私はそれがより大きなクラスでこれを行うことに気づきました。これは、クラスが非常に大きくなり、複数のクラスにコンパイルされるためですか? 私はググって複数のフォーラムを調べ、Java ドキュメントを検索しましたが、それに関連するものさえ見つかりませんでした。誰か説明してくれませんか?

4

4 に答える 4

121

クラスに内部クラスが存在する場合はコンパイルされ、クラス ファイルはClassName$InnerClassName. Anonymous 内部クラスの場合、数値として表示されます。クラス (Java コード) のサイズによって、複数のクラスが生成されることはありません。

たとえば、次のコードが与えられた場合:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

生成されるクラスは次のとおりです。

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

アップデート:

匿名クラスを使用することは悪い習慣とは見なされず、使い方によって異なります。

SOに関するこの議論を確認してください

于 2012-07-09T03:45:09.773 に答える
15

これは、この大きなクラス内に匿名クラスがあるためです。この命名規則を使用してコンパイルされます。

匿名クラスの難問を参照してください

于 2012-07-09T03:45:18.757 に答える
12

@mprabhat によって提示された上記のケースに加えて、他のケースは次のようになります。

  1. クラスに列挙型変数が含まれている場合、そのために別のクラスが生成されます。生成される .class の名前はClassName$Name_of_enumになります。
  2. クラスXが別のクラスYを継承、つまり拡張している場合、 ClassName$1.classまたはClassName$1$1.classという名前の .class が生成されます。
  3. クラスXがインターフェースYを実装している場合、 ClassName$1.classまたはClassName$1$1.classという名前の .class が生成されます。

これらのケースは、jar 内の .class ファイルに対する私の検査の派生物です。

于 2015-08-28T15:29:05.450 に答える
0

あなたのコメントに答えるには、匿名クラスは悪いです。彼らは間違いなくそうではありません。JButton にアクション リスナーを割り当てるには、次のようにします。

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

またはこれにより、「名前」プロパティによる大文字と小文字を区別しないソートが行われます

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

また、Runnable および Callable の多くが匿名クラスとして実行されることもわかります。

于 2012-07-11T01:16:20.980 に答える