• ベストアンサー

javaのクラス関係"$"について

Abc.javaでコンパイルすると、 Abc.classの他に、 Abc$1.class Abc$2.class が作成されます。 "$"これはどういった意味なのでしょうか? また、何と読むのでしょうか? ダラー?ドルマーク?

  • Java
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • zozy
  • ベストアンサー率60% (20/33)
回答No.4

前の回答では答えになっていなかったので補足させてもらいます。 申し訳ないです。 javaのコードをコンパイルすると、classごとにコードを機械語に翻訳したものがclassファイルとして生成されます。 しかし、ここで問題になるのが、classの中にclassがあったら(内部クラス)どうするの?ということです。 ここで同じAbc.classにするわけにはいかないので、Abc$1.classとすることでAbc.classの中にあるけど、別のクラスであることを明記的に区別しているのではないかと思われます。

hello_java
質問者

お礼

>ここで同じAbc.classにするわけにはいかないので、Abc$1.classとすることでAbc.classの中にあるけど、別のクラスであることを明記的に区別しているのではないかと思われます。 なるほど、別のクラスであることを明示的に区別(Abc$1.class)することだったのですね。あえて内部クラス名を書かないということですね。Tacosanの「名前のないクラス」によってAbc$1.classということになるというのが、気がかりだったのですが、わかりました。 ありがとうございます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

本当にそのようなクラスファイルができるかどうかはソース Abc.java を見ないと分かりませんが.... さておき, これは #1 で言われるようにクラス Abc の内部クラスですね. クラス A が内部クラス B をもつ場合, この内部クラス B に対するクラスファイルは A$B.class という名前になります. でもって今の場合は Abc$1.class などとなっていますが, これは「名前のない内部クラス」に対応します. 当たり前ですが「1 という名前の内部クラス」ではありません. ソースファイル上で最初にある「名前のない内部クラス」に対するクラスファイルが Abc$1.class, 2番目のやつが Abc$2.class, という感じだったかな.

hello_java
質問者

補足

確かに、AのなかにBを持つ内部クラスがあります。 「名前のない内部クラス」というと、どういうことなのでしょうか?

  • zozy
  • ベストアンサー率60% (20/33)
回答No.2

Abc$1.classは内部クラスを含むクラスをコンパイルしたときに 生成されるファイルです。 あっても、なんの問題はないかと思われます。

回答No.1

http://www.retrologic.com/innerclasses.doc7.html Names of nested classes are transformed as necessary by the compiler to avoid conflicts with identical names in other scopes. ネストされたクラスの名前はコンパイラにより必要に応じて他のスコープの識別子との衝突を区別するよう,変換される。 Names are encoded to the virtual machine by taking their source form, qualified with dots, and changing each dot `.' after a class name into a dollar sign `$'. (クラスの)名前は仮想マシンによって ソース内でのドットで修飾されている形をとったものに対して,各クラス名の後ろにつくドットをダラーに変更したものへとエンコードされる。 (後略、っつーか理解できるけどうまく日本語にできなかった) 公式ドキュメントを調べたわけじゃないが,上の記事ではそう紹介されている

hello_java
質問者

お礼

$ダラーの意味がわかりました。 ありがとうございます。

関連するQ&A

  • クラスの参照(同じファイル内 vs 別々のファイルの場合)

    二つの.javaファイルがあります。 <ABC.java> class ABC { public static void main(String args[]) { A obj = new A(); obj.hello(); } } --------------------------------------------- <A.java> class A{ void hello() { System.out.println("Hello from A"); } } --------------------------------------------- ABC.javaファイルでコンパイルすると、「 シンボルを解釈処理できません。」というエラーメッセージが出ます。でも、ABC.javaファイルの中に、class Aを続けて書くとコンパイルできます。なぜ、別々のファイルにすると参照できないのでしょうか? (おなじフォルダ内に入れています) 教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVA 別のプログラムを操作する

    JAVA初心者です。 JAVAで、例えばsample1.classを実行すると、 sample2.javaがコンパイルされる・・・。 というような、実行すると他のプログラムをコンパイル するようなプログラムはどのように書けば良いでしょうか?? ご教授お願いいたします。

  • javaでメインクラスが見つからないエラーが出てしまいます。

    javaでメインクラスが見つからないエラーが出てしまいます。 やさしい簡単なプログラム class test { public static void main(String[] args) { System.out.println("Viva!"); } } をjavacでクラスファイルを作った後に(ここまではできます)java test.class を行うと could not find the main class というエラーが出てしまいます。 教科書の通りにjdkをインストールして、パスを環境変数に通して、コマンドプロンプトでコンパイルしかしていません。 なにが悪いんでしょうか?

    • ベストアンサー
    • Java
  • Javaのコンパイルについて

    どうでもいいことかも知れませんが少し気になったので質問します。以下のようなプログラムを作成しました。 (1) Client.java main()有り、main内でServerのインスタンス作成 (2) Server.java main()無し、インターフェイスの定義のみ (3) ServerImpl.java main()有り、main内で自分自身(ServerImpl)のインスタンス作成 いつもはフォルダ内でjavac *.javaとコンパイルしてきたのですが、たまたま今日は一つずつコンパイルしてみました。一ファイルずつコンパイル出来るものかと思っていたのですがそうではなく、 (2)は単独でコンパイル出来る。 (1)と(3)は単独でコンパイル出来ない。((1)は(2)と同時にコンパイルする必要がある。(3)は(2)と同時にコンパイルする必要がある。) であることを初めて知りました。つまり関連するクラスは一緒にコンパイルしなければならないということだと思うのですが、普通は関連するjavaファイルだけのMakefileをそれぞれ作るのでしょうか?それも大変だと思うのですが。。それともjavac *.javaのように一括でコンパイルするのが普通なのでしょうか?もし毎回全ファイルをコンパイルすると、修正のないものまでコンパイルしてしまうことになると思いますがそういうものなのでしょうか?質問がちょっと意味不明で恐縮ですが一人で小さなプログラムを作成したことしかないので、会社などで大規模なプログラムを作成している現場では普通どうやっているものか知りたくて質問しました。

    • ベストアンサー
    • Java
  • macでjavaをはじめたいのですが・・・

    macOSXにははじめからjavaが使える環境があると 聞いたので早速簡単な下記のソースを書いてコンパイル してみたのですが、 java:1: class または interface がありません。や java:16: <idenfifier>がありません、や java:16:'{'がありません。や java:16:型の開始が不正です。 など27個ものエラーが発生してしまいます。 どうすればコンパイルできるのでしょうか? どなたか助けてください!おねがいします。 ちなみにjavaのversionは1.4.2_09です。 public class Myfirst{ public static void main(String args[]){ System.out.println("はやくmacでjavaを使いたい・・"); } }

    • ベストアンサー
    • Java
  • 自分で作ったクラスを継承するとエラーが出ます。

    サーブレットを勉強しているのですが、自分で作成したクラスを継承した サーブレットを作成してコンパイルするとその継承したクラスの シンボルを解釈できませんというエラーが出ます。 たとえばclass01というクラスを継承したclass02.javaをコンパイルすると シンボルを解釈できません public class02 extends class01{ といったエラーが出てしまいます。 どうも自分で作ったクラスを読み込めていないようなのですが どうしたらよいのでしょうか? 初歩的な質問かもしれませんが、よろしくお願いします。 ちなみにOSはWin2000、サーブレットはJRUNを使用しています。

    • ベストアンサー
    • Java
  • Javaアプレットについての質問です

    Javaアプレット関係の質問です。 Eclipseで「Sample_01.java」ファイルを作成します。→ コマンドプロンプトでコンパイルします。→ 作成した「Sample_01.class」ファイルをデスクトップに移動します→ HTMLファイルを開きます。 …この手順だと問題なくアプレットを表示できるのですが、 Eclipseで「Sample_01.java」ファイルを作成します。→ 「保管」します。→ ナビゲータービューから「Sample_01.class」ファイルを取りだします→ デスクトップに移動します。→ HTMLファイルを開きます。 …この手順だとなぜか×マークが表示されエラーになります。 繰り返しになりますが、どちらのファイルも名前・中身は全く同じものとなっています。コンパイルの方法が違うだけです。 なぜEclipseで自動作成された方のclassファイルだけエラー?が出たのでしょうか?エラーが出ない対策とかはありませんかね? Javaアプレットに詳しい方いましたら教えてください。 //一応ソース乗せておきます import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.*; public class Sample_01 extends Applet{ private static final long serialVersionUID = 1L; public void init(){ } public void paint(Graphics g){ g.drawRect(200,200,25,30); } }

  • クラスファイルについて

    javaで例えばjavac Test.javaと打ち込むとコンパイルできディレクトリにTest.classというファイルができるのにもかかわらず、java Test と打ち込むとエラーがでてしまいます。クラスの定義がないみたいな感じででてきてしまいます。コマンドプロンプトのdir Testr.classと入力しても確かにファイルは存在しているのですが・・・。なぜなのでしょうか?

  • JAVA実行環境とは

    JAVAはOSに依存しない代わりに実行環境に依存しますとよく言われていますが、それに関係する用語を教えてください。 java runtime edition これはjavaをrunさせるのでclassファイルをアセンブラに変換するものだと思いますが、そうですか? java virtual machine これもjavaを動かすものみたいなのでclassファイルをアセンブラに変換するものだと思いますが、そうですか? JREとJVMは同じ意味の言葉ですか? javaソースのコンパイルの時にJREやJVMは参照されないと思いますが、そうですか?

  • javaのコンパイルについて

    javaでコマンドプロンプトを使いコンパイルしようとしたのですがdirを入力したにもかかわらずclassがありませんでした そのあとjavacを入力しても”javac”は受け付けませんと出ました どうしたらコンパイルできるのでしょうか よろしくお願いします ちなみにコンピュータの専門学生です

専門家に質問してみよう