-PR-
解決済み

(クラス名.this.メソッド)って・・・?

  • すぐに回答を!
  • 質問No.43339
  • 閲覧数418
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 93% (40/43)

次のようなクラスで

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)は一体なんの
インスタンスを指すのでしょうか

急ぎのプログラムを作っているので
たいへん不躾ですが、なるべく早くお答えをお願いします
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル8

ベストアンサー率 33% (10/30)

this というのは通常自分自身を指す参照ですが、インナークラスの場合
自分を保持している親にアクセスするときも this を使います。で、
自分自身を指すthisと親を指すthisを区別するために 親のクラス名.this
という書き方をします。インナークラスが入れ子になっているときもこの
方法で好きな親に一発でアクセスできます。

なのでClassA.thisは構築Aで生成されたインスタンスであってます。

インナークラスは親クラスを必要とします。なぜわざわざクラスの中にまた
クラスを書くなどと言うややっこしいことをするのかというとインナークラス
が親クラスを知っている必要があるからです。(親を必要としていない場合は
親の外で定義しましょう)

で、インナークラスは暗に親の参照を持っていることになります(多分)。
この辺は予想ですがその関係で親のわからないインナークラスは生成出来ない
んじゃないでしょうか。(javaは参照の初期化を強要する言語です。)つまり
他のクラスからはインナークラスのインスタンスを生成できないと思います。
本来は他のクラスからインナークラスを生成する必要性もないはずです。

以上の話はちゃんと調べたわけではないので間違っているかもしれませんが
おおむねあっていると思います。
お礼コメント
bluesky

お礼率 93% (40/43)

ありがとうございます

なるほど!
大変参考になりました
(クラス・this)という記述が不気味で仕方なかったのです
(私の読んでる参考書にも書いてなかったので・・・)

Javaをはじめたのが一昨年の夏でそのころはまだ
swingが出たばかりでした

最近になってまたJavaをやり始めたんですが
あちこち仕様が変わって
驚いてます

当時のプログラムはJDK1.3では動かないし・・・
Javaの仕様ってまだかたまってないんでしょうか・・・
投稿日時 - 2001-02-22 19:24:19
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル8

ベストアンサー率 33% (10/30)

コピーして試してみたところ、コンパイルが通りません。

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");
}
}

だと思うんですけど,そう考えて良いのでしょうか。
補足コメント
bluesky

お礼率 93% (40/43)

そうです
もうしわけありません
あわてて書いたので間違えてしまいました
投稿日時 - 2001-02-22 19:16:36


このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ