質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

6048閲覧

オーバーロードしたメソッドの引数が継承関係にあるとき、どのメソッドが呼ばれるか

inabajunmr

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2グッド

2クリップ

投稿2015/12/20 05:03

以下のようなソースで、引数の型に対してどのメソッドが呼ばれるか?の定義がよくわかりません。

  • 引数がnullの時にどういう基準で呼ばれるメソッドが決まるの?
  • 継承の階層?がより近い方のメソッドが呼ばれる、という認識であっているのか

あたりが特に気になっていますが、この辺りの定義がまとまったドキュメントがあれば教えていただきたいです。
よろしくお願いします。

java

1public class OverloadTest { 2 3 public static void method(Sexy sexy){ 4 System.out.println("メソッドA"); 5 } 6 7 public static void method(SuperSexy superSexy){ 8 System.out.println("メソッドB"); 9 } 10 11 public static void method(SexyInterface superSexy){ 12 System.out.println("メソッドC"); 13 } 14 15 public static void main(String[] args){ 16 Sexy sexy = new Sexy(); 17 method(sexy); //メソッドAがよばれる 18 19 SuperSexy superSexy = new SuperSexy(); 20 method(superSexy); //メソッドBがよばれる 21 22 SexyInterface intarfaceSexy = new Sexy(); 23 method(intarfaceSexy); //メソッドCが呼ばれる 24 25 26 } 27} 28 29class Sexy extends SuperSexy implements SexyInterface{ 30} 31 32class SuperSexy implements SexyInterface { 33} 34 35interface SexyInterface{ 36}
gachakra, TetsuyaZama👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

優先順位はサブクラス→基底クラス→インターフェースの順番だったかと記憶しています。
ですので

Java

1Sexy sexy = new Sexy(); 2method(sexy); //メソッドAがよばれる 3 4SuperSexy superSexy = new SuperSexy(); 5method(superSexy); //メソッドBがよばれる 6 7SexyInterface intarfaceSexy = new Sexy(); 8method(intarfaceSexy); //メソッドCが呼ばれる 9 10method(null); //何が呼ばれる???

の結果は

メソッドA
メソッドB
メソッドC
メソッドA

になると思います。

ちなみに、上記は SuperSexy クラスのサブクラスが一つしか存在しないので実行可能ですが、サブクラスが二つ以上存在する場合はエラーとなります。

投稿2015/12/21 01:40

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inabajunmr

2015/12/25 23:29

ありがとうございます。引数がnullの場合は特定の優先順位に従って動く(その上であいまいな場合はコンパイルエラー)んですね。
guest

0

単純に、与えられた引数が何の型なのかで呼ばれるメソッドが決まります。

・method(Sexy sexy) ⇒ Sexy型のインスタンスが渡されると呼ばれる。
・method(SuperSexy superSexy) ⇒ SuperSexy型のインスタンスが渡されると呼ばれる。
・method(SexyInterface superSexy) ⇒ SexyInterface型のインスタンスが渡されると呼ばれる。

引数がnullの時にどういう基準で呼ばれるメソッドが決まるの?

method()ということですかね? これは定義されていないメソッドなので、コンパイルエラーになってしまうと思います。

投稿2015/12/20 05:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inabajunmr

2015/12/25 23:30

ありがとうございます!
guest

0

似たことを実際にやってみるとコンパイルエラーになりました。
Exception in thread "main" java.lang.Error: Unresolved compilation problem: メソッド othergene(Double) は型 子 であいまいです とでました。
(コメント文内の「※」のところです。9行目)

以下、参考までに、昔に遺伝のシミュレーションを書い(てみようとし)たときのコードを載せます。

java11

1public class Main 2{ 3 String sex="女"; 4 public static void main(String...args) 5 { 6 new 子().mitochondria();//母親のmitochondria()が継承されます 7 new 子().othergene(new Double(0));//父親のothergene(Double)が呼ばれます 8 new 子().othergene(new Integer(0));//母親のothergene(Integer)が呼ばれます。要は名前が同じでも、シグネチャが一致しなければよい。 9 //new 子().othergene(null); これをやるとコンパイルエラーです。※ 10 if sex.equals("男") 11 new 子().y();//子が男児なら、父親も母親も単独で遺伝ができる 12 else if sex.equals("女") 13 ;//子が女児なら、母親しか単独遺伝できない 14 } 15 16} 17 18class 子 implements 父親, 母親 19{ 20 @Override 21 public void mitochondria() {母親.super.mitochondria();} 22 //両親のシグネチャがぶつかった場合、どちらを優先させるか、あるいはどんな対応をとるか、明示しないとコンパイルエラーになります。 23 //また、継承元(インタフェースなので必ずpublic)よりも可視性を下げることが許されない都合上、「public」が必須だ。 24 25 26} 27 28interface 父親 29{ 30 default void mitochondria(){System.out.println("父親のミトコンドリアは子へ遺伝しません。");} 31 default void othergene(Double dbl){System.out.println("父親.othergene(Double)");} 32 default void y(){System.out.println("父親が単独で残せるのは男の子へのy染色体だけです。女の子へ単独で残せる情報は見つかっていません");} 33} 34 35interface 母親 36{ 37 default void mitochondria(){System.out.println("母親は、子の性別に拠らず、単独で(配偶者の情報と混ざらずに)ミトコンドリアの情報を残せます");} 38 default void othergene(Integer inte){System.out.println("母親.othergene(Integer)");} 39}

投稿2020/02/19 04:21

17ec084

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問