クラスのメソッドと言った場合継承したものを含むか
- クラスのメソッドと言った場合、継承したメソッドを含むか疑問に感じました。
- 問題の表現には不備がある可能性があります。
- 一般的には、「クラスのメソッド」と言った場合は、継承したメソッドは含まないと解釈されます。
- ベストアンサー
~クラスのメソッドと言った場合継承したものを含むか
お世話になります。 OJC-Pの勉強中、以下の模試問題が出題されました。 ------------------- Threadクラスのメソッドとして正しいものを全て選びなさい wait() notify() run() start() ------------------- 解答はrun()、start()の2つだったのですが、 この場合、Objectクラスから継承したメソッドは Threadクラスのメソッドとは言わないのかを疑問に感じました。 (外部クラスから見た場合、 継承したメソッドもThreadクラスで新しく定義されたメソッドも区別は ないのでは、と考えたためです。) 問題文の表現に不備があるのでしょうか、 それともやはり 「~クラスのメソッド」と言った場合、継承したものは含まないとするのが 一般的な解釈なのでしょうか。 また、後者の場合、それはどうしてなのか理由なども添えていただけると 嬉しいです。 よろしくおねがいいたします。
- michizuka
- お礼率100% (1/1)
- Java
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>この場合、Objectクラスから継承したメソッドは >Threadクラスのメソッドとは言わないのかを疑問に感じました。 いわないでしょう。それはObjectクラスのメソッドですから。どのドキュメントを見ても、それらをThreadクラスのメソッドとしているものはないはずです。例えば公開されているJavadocを見ても、Threadクラスのところにはnotifyやwaitは書かれていないはずです。 >継承したメソッドもThreadクラスで新しく定義されたメソッドも区別はないのでは 利用する上で、区別なく使えるということと、「そのメソッドがどのクラスにあるか」はイコールではないでしょう。
関連するQ&A
- 構造体がObjectクラスを継承していることについて
本を読んでいましたら、構造体はObjectクラスを継承している とありました。 実際構造体を定義して使用してみると、 「ToString」メソッドが存在するなどで、継承されているのだな と思うのですが、 構造体はObjectクラスを継承しています という情報はどのように確認すれば良いのでしょうか? 同じようにクラスがどのクラスを継承していますという情報も確認できたら嬉しいです。 Structure ステートメントのヘルプを見ても載っていないように感じました。 確認方法が知りたいです。 もし宜しければ、ご回答お願い致します。
- ベストアンサー
- Visual Basic
- 【継承】親のメソッドの実行
C++、VB.net、Java、Delphiなど色々なオブジェクト指向言語がありますが、 以下のようなとき、「子クラスのrunメソッド」を実行したとき、 (1)「親」と表示されてから「子」と表示される。 (2)「子」とだけ表示される。 のそれぞれどちらの仕様なのでしょうか? 親クラス runメソッド コンソールに「親」と表示 子クラス runメソッド コンソールに「子」と表示 ※私は、 子クラス側で、わざわざ、super.run と書かずとも、 勝手に「(1)「親」と表示されてから「子」と表示される。」になる言語が多いと認識していたのですが、 誤った認識でしょうか? (C++は、明示的に親の同名メソッドをコールしなければ、処理が実行されないと認識していますがC++の仕様は少数派でしょうか?多数派でしょうか?)
- ベストアンサー
- Visual Basic
- 交互にスレッド実行 (どうしてちゃんと動いてる?)
http://oshiete1.goo.ne.jp/qa2968378.html で質問した者です。 2つのスレッドで1と2を交互に実行する以下のプログラム。 final Object obj1 = new Object(); //スレッド間通信用のobject final Object obj2 = new Object(); //スレッド間通信用のobject2 Thread t1 = new Thread() { public void run() { try { while(true) { System.out.print("1"); synchronized (obj1) { synchronized (obj2) { obj2.notify();//相手をnotifyして } obj1.wait();//自分はwait } } } catech (Exception e){} }; Thread t2 = new Thread() { public void run() { try { while(true) { System.out.print("2"); synchronized (obj2) { synchronized (obj1) { obj1.notify(); } obj2.wait(); } } } catch (Exception e){} } }; Thread t1 = new Test1(); Thread t2 = new Test2(); t1.start(); while(t1.getState() != Thread.State.WAITING); t2.start(); が思ったように動いてはいるものの、なぜ正常に動いているかがわかりません。 t1が wait() したときはobj1のロックをもっていて、t2の synchronized (obj1){obj1.notify()} ブロックに入れず待機するはずだと思うのですが。 なぜちゃんと動いているのでしょう?
- ベストアンサー
- Java
- 継承について
下の質問の回答、間違ってませんか? -------------------------------------------- 親クラスのフィールドをメソッドを全て継承することになります。よって、サブクラス2は、サブクラス1とスーパークラスのメンバーを全て持つことになります。サブクラス2をインスタンス化すると、サブクラス1とスーパークラスが全てインスタンス化(コンピューターのメモリ上等に配置)されます。 ただ、可視性というものがあり、サブクラスから親クラスのメンバーを直接取り扱えない場合があります。privateや可視性修飾子無しの場合、サブクラスから直接取り扱えません。ただ、継承はされているので、インスタンスとしては存在します。例えば、 class スーパークラス{ private int abc; public int getAbc(){ return this.abc; } というクラスがあり、これを継承したサブクラスがあったとします。 サブクラスからは、privateなメンバー変数abcは直接取り扱うことができません。ただ、publicなgetAbcメソッドはサブクラスから取り扱えます。これで何が分かるかといいますと、privateなメンバーでもサブクラスに継承されるのです。単に可視性の問題で直接取り扱えないだけなのです。 また、オーバーライドされたメソッドがあったとしても、super.メソッド()で親のメソッドも呼べますので、これも継承されているのです。
- 締切済み
- Java
- スレッド1とスレッド2を交互に実行するには?
スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか? どうしてもデッドロックが発生しうる方法しか思いつかず困っています。 例えば以下のプログラムで1212と交互に表示させたい場合です。 以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。 Object obj; //スレッド間通信用のobject class Test1 extends Thread { public void run() { while(true) { System.out.print("1"); synchronized (obj) { obj.notify();//相手をnotifyして obj.wait();//自分はwait } } } } class Test2 extends Thread { public void run() { while(true) { System.out.print("2"); synchronized (obj) { obj.notify(); obj.wait(); } } } } new Test1().start(); new Test2().start();
- ベストアンサー
- Java
- メソッドの処理の同期化
いつもお世話になっています。 メソッド処理の同期化についてなのですが、 いろいろ調べてみたのですが、いまいちうまく実行できません。 ソースを考えてみたのですが、どこがどう悪いのかご指摘お願いできますでしょうか? 以下のクラスがある場合で public void Add(){ synchronized(this){ System.out.println("待機しています!"); //おそらくここら辺にwait()/notify()処理が来るきがする //同期中に行わない処理をここに記載する? } System.out.println("Addメソッド実行しました"): } public void Change(){ synchronized(this) { //おそらくここら辺にwait()/notify()処理が来るきがする //同期中に行わない処理をここに記載する? //一時停止 処理時間をずらすためループを使用 try { for(int a=0;a<3;a++){ System.out.println("a="+a); Thread.sleep(10000); } }catch (InterruptedException e) { } System.out.println("Changeメソッド完了です"); } } このとき、Add対Change/Add対Addといった形で同期化処理をしたいのですが、どうしてもうまくできません。 仮にThreadを使用して実行してみようとしたのですが、 順番に実行されてしまいます。 したいのが、 1.Addメソッド実行 2・Addメソッド実行 この場合、現状だと a=0 a=0 a=1 a=1 a=2 a=2 と表示されてしまうので、 a=0 a=1 a=2 a=0 a=1 a=2 と表示することはできるのでしょうか? 原因として、wait()/notify()が記載されていないことが影響していると思うのですが。 宜しくお願いします。
- 締切済み
- Java
- javaのwaitしてるスレッドをnotifyで起こすことが出来ない
JDK1.5 WindowsXPです。 現在マルチスレッドを試しています。 A、B、C三つのスレッドがあります。 AはBというスレッドを作るメインスレッドです。 Bは、waitするスレッドです。 public final void run(){ while (true){ try { //notifyが来るまで待機 waitForNotify(); //実際の処理 act(); //スレッド停止させるための割り込み例外 } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace(); } //割り込み受信の場合強制終了する if (Thread.currentThread().isInterrupted()) { break; } } } こんな感じです。 そしてCのスレッドがnotify()を実行します。 しかしnotify()を実行してもスレッドは起きません。 Bに、 public synchronized void notifyM() throws InterruptedException{ wait(); } のようなメソッドを追加して、スレッドのインスタンスメソッドとして実行しても起きません。 notify()がJavaDOCなどを読んでも意味不明なため、 どのような使い方なら動くのか見当がつきませんので質問しました。 notify(スレッドB)みたいなら分かりいいんですが。
- ベストアンサー
- Java
- wait()したスレッドが起こされるタイミング
以下のコードにおいて。 % java ThreadWaitTest 2 の場合はaと表示したまま止まりますが、 % java ThreadWaitTest 1 の場合はスレッドの終了に伴ってwait()が切れ、bまで表示します。 私の望む動作は前者です。 後者の場合、これはつまりスレッドをwaitした際の待機プールがスレッドオブジェクトの場合、そのスレッドの実行が終了すると待機プールにある待機スレッドを自動でnotify()してしまうことを意味していると思うのですが、この解釈はあっていますか? Java のAPIドキュメントに 「別のスレッドが notify メソッドまたは notifyAll メソッドを呼び出してこのオブジェクトのモニター上で待機するスレッドに通知を出すまで待機します」 とあるように、ユーザが明確的にnotifyしないと起こらないと思いこんでいました。 なぜこういう仕様になっているのでしょうか? また、この仕様について詳しく書いてあるサイトやドキュメントなどありませんでしょうか? public class ThreadWaitTest extends Thread { public Object mutex = new Object(); public static void main(String[] args) { try { ThreadWaitTest test = new ThreadWaitTest(); test.start(); System.out.println("a"); switch (new Integer(args[0])) { case 1: synchronized(test) { test.wait(); } break; case 2: synchronized(test.mutex) { test.mutex.wait(); } break; } System.out.println("b"); } catch (InterruptedException ie) { ie.printStackTrace(); } } public void run() { try { Thread.sleep(5000); } catch (InterruptedException ie){ ie.printStackTrace();} } }
- ベストアンサー
- Java
- equals()メソッドの継承について
ある本に ーーーーーーーーーーーーーーーーーーーーー class Car { protected int num; protected double gas; public Car() { num = 0; gas = 0.0; System.out.println("車を作成しました。"); } } class Sample8 { public static void main(String[] args) { Car car1 = new Car(); Car car2 = new Car(); Car car3; car3 = car1; boolean bl1 = car1.equals(car2); boolean bl2 = car1.equals(car3); System.out.println("car1とcar2が同じか調べたところ" + bl1 + "でした。"); System.out.println("car1とcar3が同じか調べたところ" + bl2 + "でした。"); } } JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来るわけです。 ----------------------------------------- JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来る についてですが、 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があるという意味なんでしょうか?
- ベストアンサー
- Java
- c# Equalsメソッドについて
こんにちは、c#初心者です。 以前まで「Object」型から継承される「Equals」メソッドをオーバーライドするときは public bool override Equals(object obj) { if ( obj is 現在の型 または 任意の親クラスの型 や インターフェイスの型 ) { //判断処理 } else return false; } または、クラス限定で public bool override Equals(object obj) { var temp = obj as 現在の型 または 任意の親クラスの型 や インターフェイスの型; if ( temp != null ) { //判断処理 } else return false; } のようにしていたのですが、「is演算子なんて封印してしまえばいいのに」と仰る方がいらしたので、「is演算子を使わない方がよいのか?」と、「現在のメソッドの形式に不備はないのだろうか?」ということが気になり質問させていただきました。 is演算子を使わないとなると、もう「typeof演算子」を利用する事くらいしか思いつきません。 主に「is演算子」を使っているのは「Equals」メソッドなので、とりあえず「Equal」メソッドだけで。上記メソッドに不備、改善点があればご指摘願います。
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。 なるほど、 回答者様の「そのメソッドがどのクラスにあるか」という表現ならばしっくりきました。