Javaの基本的な質問

このQ&Aのポイント
  • Javaの基本的な質問についてまとめました。
  • testtestクラスの違いにより出力結果に何が違うのか、抽象クラスの場合はどうなるのかを解説します。
  • インターフェースと抽象クラスの使い方についても触れています。
回答を見る
  • ベストアンサー

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

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

結論からいうと、このケースでは何も違いは有りません。 ただし、変数の型を抽象クラスやインターフェイスにした方が嬉しい場合も有ります。 表示処理を別のメソッドに切り出した場合を考えて見ましょう。 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つのクラスはいくつでもインターフェースを実装する事ができる。 変数の型に関してはどちらも違いは有りません。 (本当は具象クラスでも違いは無く、継承階層のどの位置にあるかが重要)

asdfasdf1213
質問者

お礼

読みやすくて丁寧な回答ありがとうございます。 まさに僕の知りたかったことが理解できました。

関連するQ&A

  • 現在のクラスを生成したクラスに渡したい

    親クラスで生成した子クラス(ダイアログ)から親クラス(ダイアログ)の関数などを使えるようにしたいと思っております。 ちなみに継承クラスで親クラスの関数を使うのではなく、親クラスそのもの(ダイアログ表示)を子クラスから変更できるようにしたいです。 (簡単になりますが…)プログラムの構成は以下のようになっており、thisポインタを渡すか所でエラーが起こってしまいます。 ------------------------------------------------ class AAA { BBB *b; void classBBB{ b = new BBB(this); // こういうことがしたいが、できない void fun( int a ); // ダイアログの表示が変更する(予定) }; class BBB { AAA *a; BBB(AAA *pDlg){ a==pDlg; } void fun(){ int b; a->fun(b); } // 親クラスの関数を呼び出したい }; ------------------------------------------------ ただし、class Aとclass Bを生成する上位階層のプログラム構築をすることはなしとします。 ------------------------------------------------ こんな感じ AAA *a = new AAA(); BBB *b = new BBB(a); ------------------------------------------------ どうしてもclass AAAからclass BBB呼び出したいと思ってます。 何か良い解決法があれば、教えていただきたいです。 宜しくお願い致します。

  • JAVAのComparableについて・・・

    compareto()を使って名前、身長、体重を「身長昇順」拡張for文でだしたいのですが・・・ (1)returnを使って何を返せばいいのか? (2)System.out.println()でなにをすればいいのか? (3)他の文で間違っているのか? この3点が分かりません。JAVAに詳しい方よろしくお願いします。。。 package class; public class NewClass { public static void main(String[] args) { NewClass2 A = new NewClass2("aaa", 160, 40); NewClass2 B = new NewClass2("bbb", 170, 60); NewClass2 C = new NewClass2("ccc", 150, 70); System.out.println("---Comparable---"); Set<Comparable> ts3 = new TreeSet<Comparable>(); ts3.add(A); ts3.add(B); ts3.add(C); for(Comparable cm : ts3) { System.out.println(?????????????); } package class; public class NewClass2 implements Comparable< NewClass2> { private String name; private int Weight; private int Height; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getWeight() { return this.Weight; } public void setWeight(int Weight) { this.Weight = Weight; } public int getHeight() { return this.Height; } public void setHeight(int Height) { this.Height = Height; } public StudentBean(String name, int Height, int Weight) { this.name = name; this.Weight = Weight; this.Height = Height; } @Override public int compareTo(Object arg0) { StudentBean sb = (StudentBean)arg0;     String name1 = this.name; int Height1 = this.Height; int Weight1 = this.Weight;     int returnval = 0; if(Height1 > sb.getHeight()) { returnval = 1; } else if(Height1 < sb.getHeight()) { returnval = -1; } else returnval = 0; } return ???????; } 文は以上です 出力は aaa 160 40 ・ ・ ・ なかんじでお願いします。

  • JAVAのComparableについて・・・

    compareto()を使って名前、身長、体重を「身長昇順」拡張for文でだしたいのですが・・・ (1)returnを使って何を返せばいいのか? (2)System.out.println()でなにをすればいいのか? (3)他の文で間違っているのか? この3点が分かりません。JAVAに詳しい方よろしくお願いします。。。 package class; public class NewClass { public static void main(String[] args) { NewClass2 A = new NewClass2("aaa", 160, 40); NewClass2 B = new NewClass2("bbb", 170, 60); NewClass2 C = new NewClass2("ccc", 150, 70); System.out.println("---Comparable---"); Set<Comparable> ts3 = new TreeSet<Comparable>(); ts3.add(A); ts3.add(B); ts3.add(C); for(Comparable cm : ts3) { System.out.println(?????????????); } package class; public class NewClass2 implements Comparable< NewClass2> { private String name; private int Weight; private int Height; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getWeight() { return this.Weight; } public void setWeight(int Weight) { this.Weight = Weight; } public int getHeight() { return this.Height; } public void setHeight(int Height) { this.Height = Height; } public StudentBean(String name, int Height, int Weight) { this.name = name; this.Weight = Weight; this.Height = Height; } @Override public int compareTo(Object arg0) { StudentBean sb = (StudentBean)arg0;     String name1 = this.name; int Height1 = this.Height; int Weight1 = this.Weight;     int returnval = 0; if(Height1 > sb.getHeight()) { returnval = 1; } else if(Height1 < sb.getHeight()) { returnval = -1; } else returnval = 0; } return ???????; } 文は以上です 出力は aaa 160 40 ・ ・ ・ なかんじでお願いします。

  • オブジェクトの関連について

    クラスAAAとクラスBBBをインスタンス化し、それぞれ、aとbのオブジェクトとします。 mainメソッドから、bのbmethメソッドを呼び出し、さらに、Amethメソッドを呼び出し また、mainからもaのAmethメソッドを呼び出し可能にする方法はありませんでしょうか? まだ、Java初心者なもので説明も不十分かと思いますがよろしくお願いします。 class AAA{ void Ameth() { System.out.println("Aメソッド"); } } class BBB{ public AAA a; void bmeth(){ a.Ameth(); } } public class test{ public static void main(String arg[]) { AAA a = new AAA(); BBB b = new BBB(); b.bmeth(); a.Ameth(); } }

  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • Javaのプログラムに関する質問です。

     以下のプログラムはコマンドライン引数で複数の数字を  受け取り、int型配列arrayに受け取った値を代入して  arrayの先頭から順番に表示しています。    変換クラスと、表示クラスを作成し  (1)の部分を変換クラスで、  (2)の部分を表示クラスで行うように修正してください。 */ class ClassAdd08{  public static void main(String[] args){   HenkanClass subA = new HenkanClass();//HenkanClassのインスタンス化   subA.henkan(len,array);//変換メソッドの呼び出し   HyoujiClass subB = new HyoujiClass();//HyoujiClassのインスタンス化   subB.hyouji();//表示メソッドの呼び出し  } }   //****************************     (1)     ********************************** class HenkanClass{//変換クラスを新規作成  public void henkan(){//変換メソッド   int len = args.length;   int[] array = new int[len];   for(int i = 0; i < len; i++){    array[i] = Integer.parseInt(args[i]);   }  } }    //****************************     (1)     **********************************    //****************************     (2)     ********************************** class HyoujiClass{//表示クラスを新規作成  public void hyouji(){//表示メソッド   System.out.println("受け取った引数:" + len + "個");      for(int i = 0; i < len; i++){    System.out.println((i + 1) + "個目の数:" + array[i]);   }  }   //****************************     (2)     ********************************** } クラスのインスタンス化と、対応するメソッドまでは作成したのですが、その後どうすればいいか分かりません。考え方やヒントなど、皆様の知恵をどうかお貸しください。お願い致します。

  • java 戻り値なしの乗算について

    最近javaを習い始めたのですが、今やっている戻り値なしの乗算の実行コマンドの書き方が解りません。 問題の内容が、 class SampleB{ int data=100; void kakezan(int a){ int ans; ans=a*data;       System.out.println(a+"*"+data+"="+ans); } } class Jikko{ //ここ } 問題 (引数 あり 戻り値 なし) Jikkoクラスの//ここに実行するためのメソッドをつくり、 ・SampleBクラスのkakezan()メソッドに「3」、「8」、「10」を渡して呼出 なのですが、 class JikkoB{ public static void main(String[]args); SampleB b=new SampleB(); int ans=a*data; System.out.println("a+*data=+"ans); b.a(3); } } ここまで書きましたがエラーが7つも出てコンパイルできません。 色々と調べましたが正しいメソッドが解りません。 どなたか詳しい解答と解説を教えていただければ幸いです。

    • ベストアンサー
    • Java
  • Javaのインタフェースについて教えてください!

    interface Area{ String str = "計算結果は"; String str2 = "です。"; } class VArea implements Area{ int vertical, horizon; VArea(int a, int b){ vertical = a; horizon = b; } System.out.print(str);//1 public void getArea(){ System.out.println(vertical * horizon); }; System.out.print(str2);//2 } public class Main{ public static void main(Stirng[] args){ VArea va = new VArea(10,3); } } Javaのインタフェースを実装してコンソールに >計算結果は30です。 というように出力したいのですが、”計算結果”と”です。”と出力する方法が見出せません。 わかる方教えてください。 エラーの出ている箇所は1と2です。

    • ベストアンサー
    • Java
  • NoSuchMethodErrorが解決できません。

    実行時エラーNoSuchMethodErrorが出て困っています。 どこを修正すればいいのでしょうか? class A implements Runnable{ int x; int y; public void run(){ for(int i = 0;i < 100;i++){ x++; y++; System.out.println("x="+x+"y="+y); } } } class B{ public static void main(String args[]){ new Thread(new A()).start(); new Thread(new A()).start(); } }

    • ベストアンサー
    • Java
  • javaのクラスの作り方、エラーの原因が不明です

     今晩は、javaの初心者です。宜しく願いします。  下のようなコードを書いたら、「アクセス可能な型 C1 のエンクロージング・インスタンスが ありません。  型 C1 のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は C1 のインスタンス)。」 とエラーが出ました。  eclipseでは、「C2 c_2 = new C2() ;」の箇所で赤いエラーマークが表示されています。  C1クラスとC2クラスを分けてやると正常に実行されます。  C1クラスの中にC2クラスを作ると文法的にどこがまずいのでしょうか。  あるクラスの中に別のクラスを書いているプログラムを見たような気もするのですが。  C1クラスとC2クラスをわかるのとはJAVA的に何がいけないのでしょうか。  原因がさっぱり分りません、宜しくお願いいたします。 ======================================================================= public class C1 { int a = 9 ; int b = 8 ; int c = 7 ; int d = 6 ; // C2 c_2 ; public void Calc1() { System.out.println("a+b= " + (a+b)) ; } public static void main(String[] args) { C2 c_2 = new C2() ; c_2.Calc2() ; C1 c_1 = new C1() ; c_1.Calc1(); // c_1.Calc2(); } class C2 { // int c = 7 ; // int d = 6 ; public void Calc2() { System.out.println("c-d= " + (c-d)) ; } } } =========================================================================

専門家に質問してみよう