次のようなクラスで
public class ClassA
{
public static void main(String[]args)
{
new ClassA(); /* 構築A */
}
public ClassA()
{
new ClassI();
}
public class ClassI()
{
ClassA.this.MethodA(); /* 命令A */
}
public void MethodA()
{
System.out.println("HELLO");
}
}
この命令Aの部分の
(クラス名.this.メソッド)というアクセス方法がよくわかりません
とりあえす(ClassA.this)が構築Aの部分で生成された
インスタンスではないかとおもうのですがそれで正しいのでしょうか?
また
インナークラスはインナークラスの定義されているクラス以外から
インスタンスを生成できないのでしょうか?
つまり次のクラスを追加して
public class ClassB
{
public ClassB()
{
new ClassA.ClassI(); /* 構築B */
}
}
ここの構築Bのように(この場合はダメの様ですが)他のクラスから
構築することです
もし仮にできるとしたら
そのときの命令Aの(ClassA.this)は一体なんの
インスタンスを指すのでしょうか
急ぎのプログラムを作っているので
たいへん不躾ですが、なるべく早くお答えをお願いします
No.2ベストアンサー
- 回答日時:
this というのは通常自分自身を指す参照ですが、インナークラスの場合
自分を保持している親にアクセスするときも this を使います。で、
自分自身を指すthisと親を指すthisを区別するために 親のクラス名.this
という書き方をします。インナークラスが入れ子になっているときもこの
方法で好きな親に一発でアクセスできます。
なのでClassA.thisは構築Aで生成されたインスタンスであってます。
インナークラスは親クラスを必要とします。なぜわざわざクラスの中にまた
クラスを書くなどと言うややっこしいことをするのかというとインナークラス
が親クラスを知っている必要があるからです。(親を必要としていない場合は
親の外で定義しましょう)
で、インナークラスは暗に親の参照を持っていることになります(多分)。
この辺は予想ですがその関係で親のわからないインナークラスは生成出来ない
んじゃないでしょうか。(javaは参照の初期化を強要する言語です。)つまり
他のクラスからはインナークラスのインスタンスを生成できないと思います。
本来は他のクラスからインナークラスを生成する必要性もないはずです。
以上の話はちゃんと調べたわけではないので間違っているかもしれませんが
おおむねあっていると思います。
ありがとうございます
なるほど!
大変参考になりました
(クラス・this)という記述が不気味で仕方なかったのです
(私の読んでる参考書にも書いてなかったので・・・)
Javaをはじめたのが一昨年の夏でそのころはまだ
swingが出たばかりでした
最近になってまたJavaをやり始めたんですが
あちこち仕様が変わって
驚いてます
当時のプログラムはJDK1.3では動かないし・・・
Javaの仕様ってまだかたまってないんでしょうか・・・
No.1
- 回答日時:
コピーして試してみたところ、コンパイルが通りません。
public class ClassA
{
public static void main(String[]args)
{
new ClassA(); /* 構築A */
}
public ClassA()
{
new ClassI();
}
class ClassI
{
public class ClassI()
{
ClassA.this.MethodA(); /* 命令A */
}
}
public void MethodA()
{
System.out.println("HELLO");
}
}
だと思うんですけど,そう考えて良いのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java
-
c++,ある関数のクラスから別の...
-
jarファイル内のクラスをインス...
-
C#にて別クラスの関数を使いたい
-
関数内の変数に<summary>コメン...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
VB.NETでのnothing の意義について
-
(vba)他のアプリケーションの右...
-
同じクラスにならない確率を教...
-
エクリプス コンテンツアシスト...
-
VB6.0で、DLLを動的に参照したい
-
Accessの連結・非連結オブジェ...
-
エクセルVBA 画像を貼り付ける...
-
javaのコンパイルができません...
-
時間帯判定をする。
-
VBAでの[]
-
河合塾のクラス分けについて
-
JSPで<SELECT>の中にDBから持っ...
-
WPF C#でF10のイベント取得方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
visual studioのデザイナ画面で...
-
C++でfriendクラスにしているの...
-
import と extends について
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
Java
-
C#でほかのファイルにある自作...
-
ひとつのファイルにクラスは1つ?
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
a href="..." とServlet
-
super.paint(g)を呼び出す意...
-
親クラスから子クラスへアクセス。
-
無名パッケージからのインポート
-
java-別クラスの変数の使い方を...
おすすめ情報