
次のようなクラスで
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で質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#にて別クラスの関数を使いたい
-
親クラスから子クラスへアクセス。
-
そんなにお金がなくても年に1度...
-
今日は こどもの日 で、良い天...
-
EXCEL VBAにて動的にCheckBOXを...
-
DBunitの期待値についての質問...
-
「タイプ初期化子が例外をスロ...
-
0歳児の指しゃぶりに関して
-
BMP画像を画像処理して連続に表...
-
エクセルVBAで、条件に一致する...
-
恋愛
-
DirectXのスプライト機能で3D回転
-
VBAでの[]
-
C++BuilderのMemoコンポーネン...
-
中学生です。 私は教室の黒板に...
-
簡単な説明で結構です
-
ファイル読み込み/書き込み速度...
-
「隣の芝生は青く見える」現象...
-
VBAクラスで、プロパティを使わ...
-
VBA 同じ名前のオブジェクトを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
構造 他のクラスの構造体を別...
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
import と extends について
-
Java リフレクションについて
-
無名パッケージからのインポート
-
visual studioのデザイナ画面で...
-
ひとつのファイルにクラスは1つ?
-
違うクラスからの変数の共有化
-
C#のクラスライブラリでメッセ...
-
継承したクラス側のクラス名の取得
-
Java
-
java-別クラスの変数の使い方を...
-
C# インターフェイスの実装
-
デシリアライズでオブジェクト...
おすすめ情報