2017-01-14 5 views
-1

私はs1.dub(7)またはs2.dub(7)を呼び出すと を呼び出すことはできませんが、s2.dub( "9")のような文字列を呼び出して2倍の文字列を出力します多相誤解

いずれかの理由を教えてください。

ここでコード

interface Inter { 
    int number(); 
} 
abstract class Abs { 
static int foo = 12; 
    int number() { return 5; } 
    abstract int ace(); 
} 
final class Sub extends Super { 
    Sub(int bar) { foo = bar; } 
    public int number() { return 10; } 
    int ace() { return 13; } 
    int dub(int i) { return 2 * i; } 
} 
public class Super extends Abs implements Inter { 
    public int number() { return 11; } 
    public static void main(String args[]) { 
     Super s1 = new Super(); 
     Super s2 = new Sub(16); 
     //System.out.println(s1.dub(7));  //doesn't work 
     //System.out.println(s2.dub(7));  //doesn't work 
     //System.out.println(s1.dub("7")); //works giving 77 
     //System.out.println(s2.dub("7")); //works giving 77 
    } 
    int twice(int x) { return 2 * x; } 
    public int thrice(int x) { return 3 * x; } 
    int ace() { return 1; } 
    String dub(String s) { return s + s; } 
} 
+0

私は少し疲れているが、私は考えますこれはコンパイルすべきではありませんか? –

+0

編集しました、再チェックしてください! –

+0

スーパーオブジェクト内の唯一のダブメソッドが文字列を要求している間に、s1.dub(7)はint値を渡すとコンパイルされません。 s2.dub(7)もコンパイルされませんが、intを予期するメソッドを持つSubオブジェクトを作成している間は、Superとして参照を保持しています。また、Stringを期待するダブメソッドしかありません。つまり、なぜs1.dub( "7")とs2.dub( "7")がコンパイルされるのかを理解できるはずです。 –

答えて

0

非常に簡単..あなた級スーパーでメソッドを定義します。その後、

Super s1 = new Super(); // this has a dub(String) method 

あなたがしよう:あなたはスーパーのインスタンスを、あなたのメインの方法で

String dub(String s) { return s + s; } 

は、文字列の代わりに整数を渡すこのメソッド(ダブ)を呼び出す:

System.out.println(s1.dub(7)); // s1.dub(...) takes a String, not a number 

EDIT:dub(int)メソッドを定義していないSuperクラスSuperに両方のインスタンスを割り当てているため、このコードはコンパイルまたは実行しないでください。

どのように例外が発生するのかよくわからないのですか?

@ Jean-FrançoisSavardありがとうございました - 私はそれを完全に逃しました!

EDIT2:元の質問が変更され、例外がスローされたことを示すことはなくなりました。これは、コードをまったくコンパイルしないでください。

EDIT3:(原因元の質問の変更への最後の1、)

System.out.println(s1.dub(7)); //- this will never work unless you change your class' definition 

System.out.println(s2.dub(7)); //- will work if you also change the following line: 

から:

Super s2 = new Sub(16); 

へ:

Sub s2 = new Sub(16); 
+1

* "数値ではなく文字列を取ります" *次にコンパイルしないでください。 OPは例外について話しています。あなたの答えの2番目の部分も間違っています –

+0

あなたは正しいです!私のコンパイラではコンパイルされません。コンパイルしようとすると、数値を渡す両方の行にエラーがあります。このコードをどうやってコンパイルしていますか? –

+1

あなたは答えを削除し、その質問の下のコメントで議論を続行することをお勧めします。そうすれば、あなたは下降音を避けることができ、他の人が質問を理解するのに役立ちます。彼らは答えのコメントではなく、問題のコメントに関する情報を探す可能性が高いからです。 –