• 締切済み

Javaの実装方法?Eclipse?ポリモルフィズム?

Javaの実装方法はどうなのかの質問です。 Eclipseで解析しているのですが、解析は「宣言を開く」(F3)で進みながら解析しています。 以下のソースだと、yobidasiクラスのMethodXからMethodAにF3で飛ぶとOyaClassのMethodAにきます。 その後、MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます。 でも、実際の動きは、OyaClassではなくkoClassのMethodBに行きます。 この実装方法ってどうなのでしょうか?こういうものなのですか? 解析ミスに繋がらないかなと思っているんですが。 また、EclipseでkoClassに飛ばす方法はあるんでしょうか? 助言をください。 class yobidasi{  methodX{ koClass cls = new koClass; cls = methodA  } } public class koClass extends OyaClass{  protected methodB{  } } public class OyaClass {  public methodA{ methodB()  }  protected methodB{ //空メソッド  } }

みんなの回答

  • bleis
  • ベストアンサー率68% (11/16)
回答No.2

> OyaClassだけを見たとき、OyaClass内のMethodBに飛ぶと思って対応をおこなったけど、 > 実は、KoClass呼び出しでKoClassのMethodBにジャンプすることになっていた。なんて問題がおきそうな気がするのですが。 確かに、何も考えずに設計してしまうとそういう問題にはまることはありえます。 ただし、もちろんそうならないような努力も可能です。 リスコフの置換原則というのもその1つです。 デザインパターンなどを学ぶのもいいと思います。 > また、koClassがたくさんあったり、koClassのKoClassがあったりしたら 1つのクラスから大量の派生クラスが存在するのは、おそらく良くない設計の可能性が高いです。 そもそも、継承は本当に必要なとき以外には使うべきではありません。 > Eclipseの宣言を開く 宣言を開くではなく、クイック階層を使います。

全文を見る
すると、全ての回答が全文表示されます。
noname#94983
noname#94983
回答No.1

とりあえず、コードを挙げるなら、まともに動くものをあげて欲しい。まともに動くようにするのに手間がかかると読む気がしなくなる。 まず、「MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます」これは正しい反応。なぜなら、メソッドを検索するときは、まずそのクラス内にあるものを検索し実行するのだから。 「実際の動きは、OyaClassではなくkoClassのMethodBに行きます」というのは、間違いではないが、おそらく頭の中で勘違いをしていると思う。なぜkoClassのMethodBにいくかといえば、そのインスタンスがOyaClassではなくkoClassだから。koClassのインスタンス内のメソッドで呼び出せば、同じkoClassにあるメソッドが呼び出されるのは当たり前。methodXでインスタンスを作っているが、 koClass cls = new koClass(); ↓ OyaClass cls = new OyaClass(); こう書き換えて試してみれば、今度はOyaClassのメソッドが使われるようになっているはず。

Haule
質問者

お礼

ありがとうございます。 koClassのインスタンスを作っているのでkoClassのMethodBが呼ばれるのはわかります。 わからないのは、 ・この実装方法は普通なのか? OyaClassだけを見たとき、OyaClass内のMethodBに飛ぶと思って対応をおこなったけど、 実は、KoClass呼び出しでKoClassのMethodBにジャンプすることになっていた。なんて問題がおきそうな気がするのですが。 また、koClassがたくさんあったり、koClassのKoClassがあったりしたら、解析するにも1個1個のメソッドで全部子クラス洗いだして 大規模なソースを解析する場合、とてつもない作業になる気がするのですが、どうなのでしょう。 ・Eclipseの宣言を開く この場合Yobidashiからジャンプしたことを覚えておいて、OyaClassのMethodAからKoClassのMethodBに飛べるようにはできないんでしょうか コンパイルの通るソースに書き直しました。 --MainClass-- package hoge; import hoge.Yobidashi; public class MainClass { public static void main(String[] args) { Yobidashi yobi = new Yobidashi(); yobi.methodX(); } --YobidashiClass-- package hoge; import hoge.KoClass; public class Yobidashi { public void methodX(){ KoClass cls = new KoClass(); cls.methodA(); } } --KoClass-- package hoge; public class KoClass extends OyaClass { public void methodB(){ System.out.println("KoClass MethodB"); } } --OyaClass-- package hoge; public class OyaClass { public void methodA(){ System.out.println("OyaClass MethodA"); methodB(); } public void methodB(){ System.out.println("OyaClass MethodB"); } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • eclipseについて

    いつもお世話になっております。 eclipseを使って開発をしているのですが 最近困った現象に襲われています。 (Ver2.???です) javaソース内に複数のメソッド (publicやprivateやprotectedのメソッド) を記述しています。 例えば、とあるpublicのメソッド内で privateのメソッドを呼んでいるとします。 public内のprivateのメソッド名のところで 「F3」もしくは「宣言を開く」を選ぶと 該当する(private)メソッドしかjavaエディタに 表示されなくなってしまいました。 普通であればただ単にそのメソッドに飛んでjavaファイル内の ソース自体はすべて表示されていますよね? (初心者)なので設定をいじりすぎたのが原因かとは思われますが 何を変更したためにこのような現象になったのかわかりません。 開発の効率が落ちて非常に困っております。 どうかみなさまの知識を教えてもらえませんか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • eclipse でクラスに色

    初歩的なことだと思いますが、調べても見つけられなかったので質問させてください。 eclipseでエディタ上のクラス名に色が付くようにしたいのですがどうすればいいでしょうか。 ウィンドウ > 設定 > Java > エディタ > 構文の色指定 というところに、メソッドの色等を変える項目はあってもクラスが見当たりません。 たとえば、変数宣言のとき、 この部分に色をつけたり ↓ Test test = new Test(); この部分に色をつけたり     ↓       ↓ class SubTest extends Test { ・・・ } したいのですが、どうすればいいでしょうか。 また、自分で決めたキーワード(自前のクラス)にはまた別の色をつけたりとかできますか? eclipse 3.1.1 on windows xp sp2

    • ベストアンサー
    • Java
  • C++で参照カウンタを実装したいのですが

    こんにちは。 C++でクラスに参照カウンタを実装したいのですが、もしも実装する場合、 class CRefCounter {   参照カウンタとAddRef、Releaseメソッドを仮想メソッドとして実装 }; このクラスを継承して直接使う方法と、 class IRefCounter {   参照カウンタとAddRef、Releaseメソッドを純粋仮想メソッドとして宣言 } このクラスを継承して継承側で実装する方法とがあると思うのですが普通はどちらを使うものでしょうか?

  • LingPipeのEclipseでの使用方法

    LingPipeを用いて英単語の形態素解析を行いたいと考えています。 具体的には、 ・英文を一つ一つの単語に分割する ・英単語の品詞を判別する ・英単語の動詞の基本形を調査する ような処理を実装したいと考えております。 その際、Eclipceを用いてJavaコードでプログラムを作成したいと考えます。 現在、LingPipeのページからjarファイルを取得した段階です。 しかし、それを用いたコードの書き方がわかりません。 具体的には、 ・何をimportすればいいのか ・どのようなメソッドがあるのか などです。 形態素解析やEclipse、Javaに関する知識が乏しいため、初歩的・的外れな質問かもしれませんが、 以上を実現するための方法を教えていただきたいと思います。 よろしくお願い致します。

  • Javaでウィンドウ作成について

    下記のJavaのプログラムについて質問です。 ウィンドウを表示するプログラムで、本に書いてあるのを参考にしました。 しかしウィンドウを表示されません。 どうしたらウィンドウを表示できるようになりますか?。 ちなみにコメントアウトしている部分を有効にするとウィンドウが表示されます。 開発環境はEclipse3.4で、Eclipse3.4から実行しています。 もう一点、コメントアウトしているsuper()を有効にすると Eclipse3.4から下記のエラーがでます。 本に書いてある通りにしているつもりですが、これについても教えて下さい。 ”コンストラクター呼び出しは、コンストラクター内の最初のステートメントである必要があります” 以上、よろしくお願いします。 ackage test; import java.awt.Frame; public class P155 extends Frame{ public void P155(){ //super(); this.setSize(300,200); this.setVisible(true); } public static void main(String[] args) { new P155(); // Frame f= new Frame(); // f.setSize(300,200); // f.setVisible(true); } }

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えて下さい

    //Sample.java class Sample void methodA(int temp) if(temp == 0) String str = new String("Exception"); Integer.parseInt(str); else if(temp == 1) int[] array = new int[temp]; else Exception exc = new Exception(); throw exc; //SampleMain.java class ExceptionMain public static void main(string[] args) Sample sam = new Sample(); Int temp = Integer.parseInt(args[0]); Sam.method(temp); } } このプログラムの場合、ExceptionMainに新たにコードを加えて、コマンドライン引数が0,1,その他の場合に例外メッセージを出力するプログラムを教えて下さい。

    • ベストアンサー
    • Java
  • Object指向で考えた場合、このケースはどうなる

    現在JavaでObject指向を取り入れたプログラミングをしているのですが、疑問が出てきたので質問させていただきます。 例をあげて説明させていただくと、 乗り物、車、ベンツ という3つのObjectがあります。 これらを abstract class 乗り物 abstract class 車 extends 乗りもの class ベンツ extends 車 と書いたのですが、乗り物class内で宣言したabstractメソッドが、ベンツで実装されていなくてもエラーが出ませんでした。 この事から、自分は何か設計を間違えているのではないかと疑問を持ちました。 自分の設計はあっているのでしょうか?ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAでのUSB機器検知について

    JAVAでUSB機器の検出の実装をしています。 現在getLogicalDrivesメソッドを用いた実装を考えていますが、コンパイルエラーとなってしまいます。 ソース中の、「stDrives = getLogicalDrives();」の部分で、「メソッド getLogicalDrives() は型 win32 で未定義です」とエラーが出ます。 原因がわからないので、原因と対処法をよろしくお願いします。 もしほかにUSB機器の検知について方法があればそちらの方もお願いしたいと思います。 OSはwindowsXP、eclipseで開発しています。 import java.lang.Object; import org.seasar.uruma.util.win32; public class win32 { public int usb(){ String[] stDrives; stDrives = getLogicalDrives();   return 1; } }

    • ベストアンサー
    • Java