(クラス名.this.メソッド)って・・・?
- (クラス名.this.メソッド)とは、Javaの特殊な構文の一つで、インナークラス内で外部クラスのメソッドを呼び出すための方法です。
- クラスA内で定義されているインナークラスClassIのメソッド内で、ClassA.this.MethodA()と書かれている部分は、ClassAのメソッドMethodAを呼び出しています。
- インナークラスは、外部クラスのインスタンスからのみ生成できます。他のクラスからは直接インナークラスを生成することはできません。
- ベストアンサー
(クラス名.this.メソッド)って・・・?
次のようなクラスで 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)は一体なんの インスタンスを指すのでしょうか 急ぎのプログラムを作っているので たいへん不躾ですが、なるべく早くお答えをお願いします
- bluesky
- お礼率93% (40/43)
- Java
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
this というのは通常自分自身を指す参照ですが、インナークラスの場合 自分を保持している親にアクセスするときも this を使います。で、 自分自身を指すthisと親を指すthisを区別するために 親のクラス名.this という書き方をします。インナークラスが入れ子になっているときもこの 方法で好きな親に一発でアクセスできます。 なのでClassA.thisは構築Aで生成されたインスタンスであってます。 インナークラスは親クラスを必要とします。なぜわざわざクラスの中にまた クラスを書くなどと言うややっこしいことをするのかというとインナークラス が親クラスを知っている必要があるからです。(親を必要としていない場合は 親の外で定義しましょう) で、インナークラスは暗に親の参照を持っていることになります(多分)。 この辺は予想ですがその関係で親のわからないインナークラスは生成出来ない んじゃないでしょうか。(javaは参照の初期化を強要する言語です。)つまり 他のクラスからはインナークラスのインスタンスを生成できないと思います。 本来は他のクラスからインナークラスを生成する必要性もないはずです。 以上の話はちゃんと調べたわけではないので間違っているかもしれませんが おおむねあっていると思います。
その他の回答 (1)
- nagata
- ベストアンサー率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"); } } だと思うんですけど,そう考えて良いのでしょうか。
補足
そうです もうしわけありません あわてて書いたので間違えてしまいました
関連するQ&A
- 参照メンバを持つクラス
ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }
- 締切済み
- C・C++・C#
- [Obj-c]元クラスからサブクラスのメソッド
Objective-Cの勉強をしています。 ClassAは元クラス(スーパークラス)です、 ClassB1、B2はClassAを継承(サブクラス)しています。 ClassAとClassB1にはiMethodというメソッドが存在します。 最下部にソースと実行結果があります。 ●そこで質問なのですが、 ClassAのインスタンスにClassB1のインスタンスをセットすると、 同じ名前のメソッドがあるだけでなぜClassB1のメソッドが呼ばれるのでしょうか? (下記ソースの[bangai iMethod]; の部分です。) ClassB1のインスタンスを渡すとClassAのインスタンスが ClassB1のメソッドを使用できる理由がわかりません、 継承しているとはいえ型が違うものを参照渡しできる理由も今ひとつわからないです。 またこれはどういう機能を言うのでしょうか? (例えば ポリモーフィズム、動的バインディングなど) ★ソース ------------------------------------------------------------------------------ #import <Foundation/Foundation.h> // ClassA @interface ClassA : NSObject { } @end @implementation ClassA -(void) iMethod { NSLog(@"スーパークラスのインスタンスメソッドです。\n"); return; } @end // ClassB1 @interface ClassB1 : ClassA @end @implementation ClassB1 -(void) iMethod { NSLog(@"サブクラスのインスタンスメソッドです。\n"); return; } @end // ClassB2 @interface ClassB2 : ClassA @end @implementation ClassB2 @end int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... ClassB1 *instance_B1 = [[ClassB1 alloc]init]; ClassB2 *instance_B2 = [[ClassB2 alloc]init]; [instance_B1 iMethod]; [instance_B2 iMethod]; // 親には子のクラスが入れられる ClassA *bangai = instance_B1; [bangai iMethod]; } return 0; } ------------------------------------------------------------------------------ ★実行結果 サブクラスのインスタンスメソッドです。 スーパークラスのインスタンスメソッドです。 サブクラスのインスタンスメソッドです。
- ベストアンサー
- C・C++・C#
- 条件によって別のクラスのインスタンスを作成する場合
大きな条件分岐があって、その条件によって別のクラスを同じ名前でインスタンス化し、以降で使いたいのですが、うまくコンパイルが通りません。考えてみればifブロックの中だけで有効なインスタンスになってしまうので、当たり前かも知れません。どのようにすれば、使えるようになるのでしょうか。 以下にコードを載せます。正しい書き方を教えて下さい。 よろしくお願いします。 if(条件A){ classA object; // objectという名前でclassAをインスタンス化 }else{ classB object; // objectという名前でclassAとは別のclassBをインスタンス化 } object.methodA(); // objectのmethodA関数を使用したい
- ベストアンサー
- C・C++・C#
- 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)
下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・
- 締切済み
- C・C++・C#
- クラス、インスタンスメソッドについて
JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。
- ベストアンサー
- Java
- 親クラスのフリをした子クラスの使い方を教えて下さい
以前、QNo.3479089でお世話になった者です。類似というか、続きの質問です。 ClassAを継承するClassBがあり、条件によって、ClassAまたはClassBをインスタンス化して使います。 (ClassBは、ClassAのメソッドの一部をオーバーライドして、ClassB固有のメソッドも追加しています) ClassA* pObj = NULL; if( ある条件 ) { pObj = new ClassA(); } else( その他の条件 ) { pObj = new ClassB(); } pObj->common_method(); これが常套手段と伺ったのですが、ClassBがインスタンス化された場合、ClassB固有のメソッドmethodBを呼び出そうとすると、「ClassAにはmethodBが存在しない」といったようなコンパイルエラーが出ます。 pObj->methodB(); // ここで、エラー それで、エラーを解消するために、「その他の条件」の時に、dynamic_castを使ってみました。 if( その他の条件 ) { ClassB* pObj2 = dynamic_cast<ClassB*>( pObj ); pObj2->methodB(); } 上記でコンパイルエラーは解消したのですが、なにか、非常にめんどくさいです。 また、ClassAのフリをした実体ClassBを使っているのだから、オーバーライドしているメソッドもdynamic_castをしないと呼び出されないような気がします。 結局、親のフリした子クラスを作成する場合、こんなにめんどくさいことをしないといけないのでしょうか? それともこのやり方はおかしいですか? この場合、どういうふうにするものなのか、教えて下さい。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 継承元クラスのプロパティを参照する手段
お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package { // インポート記述は省略 public class ClassA { var ppt1:String; var ppt2:String = "かきくけこ"; // コンストラクタ public function ClassA() { } public function goNext():void { var classb:ClassB = new classB(); } } } /* ClassBの処理 -----------------------*/ package { // インポート記述は省略 public class ClassB extends ClassA { // コンストラクタ private function ClassB() { trace(ppt1); trace(ppt2); } } }
- ベストアンサー
- Flash
- 現在のクラスを生成したクラスに渡したい
親クラスで生成した子クラス(ダイアログ)から親クラス(ダイアログ)の関数などを使えるようにしたいと思っております。 ちなみに継承クラスで親クラスの関数を使うのではなく、親クラスそのもの(ダイアログ表示)を子クラスから変更できるようにしたいです。 (簡単になりますが…)プログラムの構成は以下のようになっており、thisポインタを渡すか所でエラーが起こってしまいます。 ------------------------------------------------ class AAA { BBB *b; void classBBB{ b = new BBB(this); // こういうことがしたいが、できない void fun( int a ); // ダイアログの表示が変更する(予定) }; class BBB { AAA *a; BBB(AAA *pDlg){ a==pDlg; } void fun(){ int b; a->fun(b); } // 親クラスの関数を呼び出したい }; ------------------------------------------------ ただし、class Aとclass Bを生成する上位階層のプログラム構築をすることはなしとします。 ------------------------------------------------ こんな感じ AAA *a = new AAA(); BBB *b = new BBB(a); ------------------------------------------------ どうしてもclass AAAからclass BBB呼び出したいと思ってます。 何か良い解決法があれば、教えていただきたいです。 宜しくお願い致します。
- 締切済み
- C・C++・C#
- 無名パッケージのクラス
パッケージ化されたクラス(pacA.ClassA)から、無名パッケージ(ClassB)のクラスを参照できるのでしょうか。 状況を詳しく書きますと、 ClassB はコンパイル済みで、pacA.ClassA の中で ClassB を new しています。 pacA.ClassA をコンパイルしたいのですが、ClassB を import できません(コンパイルエラー)。 それとも、ClassB は import する必要がなく、単に私のコンパイルの仕方(classpathの通し方等)が悪かったのでしょうか。 どなたか教えて頂けませんか。
- ベストアンサー
- Java
- new クラス名(Activity名.this);
Android ・下記のようなコードがあるのですが、このとき「.this」の意味を教えてください ・Activityクラス自身? ・「.」で繋いでいる意味も、「this」の意味も良く分かりません ・thisだけでは駄目? ・引数は1つ? public class Hoge extends Activity { public class C1 {//インナークラス? protected m1method(略) { 略 = new クラス名(Hoge.this);
- ベストアンサー
- Java
お礼
ありがとうございます なるほど! 大変参考になりました (クラス・this)という記述が不気味で仕方なかったのです (私の読んでる参考書にも書いてなかったので・・・) Javaをはじめたのが一昨年の夏でそのころはまだ swingが出たばかりでした 最近になってまたJavaをやり始めたんですが あちこち仕様が変わって 驚いてます 当時のプログラムはJDK1.3では動かないし・・・ Javaの仕様ってまだかたまってないんでしょうか・・・