こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaの基本的な質問です

以下ソースコード(ただし、testtest クラスはどちらかを採用)

public interface taberu {
int doit ();
}

class taberu1 implements taberu{
@Override
public int doit () {
return 1;
}
}

public class taberu2 implements taberu{
@Override
public int doit(){
return 2;
}
}

public class testtest{
public static void main(String[] args){
taberu1 a = new taberu1();
taberu2 b = new taberu2();
int aaa = a.doit();
int bbb = b.doit();
System.out.println(aaa + " and " + bbb);
}
}

public class testtest{
public static void main(String[] args){
taberu a = new taberu1(); //ここが違う
taberu b = new taberu2(); //ここが違う
int aaa = a.doit();
int bbb = b.doit();
System.out.println(aaa + " and " + bbb);
}
}

出力結果
1 and 2


質問は testtest クラスの //ここが違う と書かれているところです
出力結果はどちらも同じなのですが、その違いにより何が違うのか教えてほしいです。それと、抽象クラスにおける場合でもどのような違いがあるのか教えてほしいです><
インターフェースは振る舞いを記述すべきなので抽象クラスを使えと怒られそうなんですが簡単にしたかったのでこうしました。
本を読んでもあまりしっくりと理解できなかったので質問します。
基本的なことを質問してしまいすみません。

投稿日時 - 2012-08-30 02:43:52

QNo.7670850

困ってます

質問者が選んだベストアンサー

結論からいうと、このケースでは何も違いは有りません。

ただし、変数の型を抽象クラスやインターフェイスにした方が嬉しい場合も有ります。
表示処理を別のメソッドに切り出した場合を考えて見ましょう。

public class testtest {
public static void main(String[] args){

taberu a = new taberu1(); //ここが違う
taberu b = new taberu2(); //ここが違う
display(a, b);// 表示処理は別のメソッドに切出した

display(b, a);// 順番を入替えて表示
}

private static void display(taberu a, taberu b) {
int aaa = a.doit();
int bbb = b.doit();
System.out.println(aaa + " and " + bbb);
}
}

「順番を入替えて表示」の行は新たに付け加えましたが、もし display メソッドの引数の型が「display(taberu1 a, taberu2 b)」の様に具象クラスになっていたら、別にそれ用の処理を書かなければなりません。また、taberu を継承した taberu3 を新たに作った際には、display を書き換えたり、組合せごとの display を作る必要が出てきてしまうかも知れません。


インターフェースと抽象クラスの違いですが、大まかにいうと下記の様な感じでしょうか。

■ 抽象クラス
・メソッドの実装や状態(フィールド)を持てる。
・static メソッドを持てる。
・1つのクラスは1つの抽象クラスまでしか継承できない。

■ インターフェース
・メソッドの実装や状態(フィールド)は持てない。
 (定数フィールドは持てる)
・static メソッドに関しては何もできない。(シグネチャーの定義もできない)
・1つのクラスはいくつでもインターフェースを実装する事ができる。


変数の型に関してはどちらも違いは有りません。
(本当は具象クラスでも違いは無く、継承階層のどの位置にあるかが重要)

投稿日時 - 2012-08-30 07:55:56

お礼

読みやすくて丁寧な回答ありがとうございます。

まさに僕の知りたかったことが理解できました。

投稿日時 - 2012-09-01 11:39:05

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問