人生最悪の忘れ物

次のようなクラスで

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

急ぎのプログラムを作っているので
たいへん不躾ですが、なるべく早くお答えをお願いします

A 回答 (2件)

this というのは通常自分自身を指す参照ですが、インナークラスの場合


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

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

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

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

以上の話はちゃんと調べたわけではないので間違っているかもしれませんが
おおむねあっていると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます

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

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

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

当時のプログラムはJDK1.3では動かないし・・・
Javaの仕様ってまだかたまってないんでしょうか・・・

お礼日時:2001/02/22 19:24

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



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

だと思うんですけど,そう考えて良いのでしょうか。

この回答への補足

そうです
もうしわけありません
あわてて書いたので間違えてしまいました

補足日時:2001/02/22 19:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報