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

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

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

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

4回答

2607閲覧

インターフェース、コマンドプロンプトからの文字受付けなどについて Java

noto

総合スコア11

Java

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2016/05/14 07:27

編集2016/05/15 03:08

###実現したいこと
Javaの課題にいきづまっています。初心者です。
⑴AnimalインターフェースをインプリメントしたCatクラスおよびDogクラスを作成
⑵引数で受け取ったAnimalインターフェースのanimalメソッドを実行する
⑶コマンドプロンプトから文字列を受け付け、CatかDogのどちらかを入力してもらい、入力されたほうのインスタンスを生成し、Cat(またはDog)クラス内にあるメッセージを表示する

戻り値はすべてvoid指定です。

###発生している問題

⑵について。Animalインターフェースの引数をどこで受け取り、animalメソッドを実行するのかがわかりません。 問題の意図としてはおそらく、「選択されたクラスはAnimalインターフェースをインプリメントしているのでanimalメソッドを受け継いでいる。だからCatクラスでもDogクラスでもそのメソッドが実行できることを証明する」ということなのかな?と考えているのですが…。 ⑶コマンドプロンプトからJavaへ文字列入力を受け付けるには以下のコードなのか、実際に実行したいのですが、Javaのファイル保存がうまくいきません。手順をご教授願います。入力については参考にしたURLを張り付けておきます。

###該当のソースコード

//メインクラス //ここでAnimalインターフェースのAnimalメソッドの実行および、コマンドプロンプトからの入力をうけつけます public class Main { public static void main(String[] args) { BufferedReader L00 = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("Please enter test or Production"); String msg = L00.readLine(); System.out.printf("入力 = %s%n長さ = %d文字%n", msg, msg.length()); } catch(IOException L02) { System.out.println("入力エラー"); } //このあたりの記述の仕方に悩んでいます。 public void animlal(Animal animal){ return } ______________________________________________ //Animalインターフェースです public interface Animal { public void animal(); } ______________________________________________ //Catクラスです public class Test implements Animal { public void animlal() { System.out.println("Catクラスです。"); } } //Dogクラスです public class Test implements Animal { public void animal() { System.out.println("Dogクラスです。"); } }

###どなたか
お詳しい方お教えいただけると幸いです。

###追記
http://www.groovy-number.com/java/sample/LineInput.html
申し訳ありません、URLを貼り忘れていました。
コマンドプロンプトからの入力を受け付けるのはこのやり方を参考にいたしました。

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

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

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

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

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

HogeAnimalLover

2016/05/14 07:44

(2)の問題文がよくわからないですね。多分、こういうことだと思います。「Animalインタフェースにメソッドanimalを用意し、Dog、Catクラスでこれを『実装』(実行ではない)する」これなら意味が通ります。「私の名前的」には興味深いですね(ww)
swordone

2016/05/14 15:05

>手順を参考にしたURLを張り付けておきます。 どこに?
swordone

2016/05/15 05:27

「ファイル保存がうまくいかない」というのはどういう状況ですか?
noto

2016/05/20 09:47

勘違いをしておりました。STSから、run asでコマンドプロンプトからの入力と同じことができたので、解決いたしました。 デスクトップなどにパッケージか何かを保存しないと、コマンドプロンプトから入力ができないのかな…と思っておりました。
guest

回答4

0

必ず、

Java

1public class Main { 2 public static void main(String[] args) { 3 BufferedReader L00 = new BufferedReader(new InputStreamReader(System.in)); 4 5 try { 6 System.out.print("Please enter test or Production"); 7 String msg = L00.readLine(); 8 System.out.printf("入力 = %s%n長さ = %d文字%n", msg, msg.length()); 9 10 } catch(IOException L02) { 11 System.out.println("入力エラー"); 12 } 13//このあたりの記述の仕方に悩んでいます。 14 15 public void animlal(Animal animal){ 16 return 17 18 }

で public void animal(...);
としなければならないのですか? (つまり void型でなければいけないのか.)

私なら、デザインパターンの FactoryMethodパターンをつかってやります。

たとえば、

Java

1public class Factory{ 2 static public Animal Create(int n){ 3 if( n == 1 ){ 4 return Dog(); 5 }else{ 6 return Cat(); 7 } 8 } 9}

として、

Java

1// メインメソッド内 2Animal obj; 3if(...){ // Dogクラスが指定された 4 // staticな Factory.Createメソッドで引数によって生成するクラスを分岐 5 // また、interface ( または親クラス ) として取得することで、どのクラスでも使える 6 obj = Factory.Create( 1 ); 7}else{ 8 // 上に同じ 9 obj = Factory.Create( 2 ); 10}

みたいにしてやりますね。

あと、他の方もおっしゃっているように、
クラス名が Dogクラス、Catクラスが Testというクラス名になっています。

FactoryMethodパターンは、
親クラス ( interface 等 ) で取得することで、中身 ( どのクラスのインスタンスなのか ) を気にせずに使えるという利点がある。
プログラムを組むときではなく、起動時 ( あるいは 起動してその地点に来たとき ) にしか、
どのクラスのオブジェクトを生成するかがわからないときに使える。

別に Factoryクラスは staticにする必要はないが、staticじゃないと、いちいちインスタンス化しないといけないので。

もちろん、
Factoryクラスではなく、Mainクラスのメソッドとして

Animal Create(int n);

みたいなものを作ってもいいですが。

投稿2016/05/18 07:35

BeatStar

総合スコア4958

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

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

0

「Javaのファイル保存がうまくいきません。」について。
「該当のソースコード」のとおりなら、Dogクラス・Catクラスにするはずが、共にTestクラスになっています。
開発環境が不明のため推測になりますが、同名クラスの存在、もしくはクラス名とJavaファイル名の不一致が原因ではないでしょうか。

投稿2016/05/15 06:55

dsuzuki

総合スコア1682

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

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

0

ベストアンサー

課題の意図として、そんなに複雑なことは要求していないと思います。
要は入力された文字列が"Cat"か"Dog"か、あるいはそれ以外かを判断して、対応するクラスのインスタンスを生成すればいいのだと思います。
(2)のメソッドは、Animalとして扱えるものならanimalというメソッドを持っていることは確実なので、これを使って表示させればいいのです。

投稿2016/05/14 11:15

swordone

総合スコア20649

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

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

0

こんにちは。
色々な実装方法が考えられますが、一例として

  • コマンドプロンプトからCatやDogなどの動物の表す単語を受けつけ、それを

プログラムで使うために、mainメソッドの引数の args を使用

  • 文字列の"Dog"や"Cat"から、これらのクラスのインスタンスを生成するときに

リフレクションを利用

というやり方でざっと作ってみました。ソースと実行例は以下です。


[ykt68@MacBook Teratail]$ pwd
/Users/ykt68/EclipseWorkspace/Teratail
[ykt68@MacBook Teratail]$ date
2016年 5月14日 土曜日 17時38分34秒 JST
[ykt68@MacBook Teratail]$ cd src/teratail34924/
[ykt68@MacBook teratail34924]$ ls -l
total 32
-rw-r--r-- 1 ykt68 staff 75 5 14 17:20 Animal.java
-rw-r--r-- 1 ykt68 staff 149 5 14 17:20 Cat.java
-rw-r--r-- 1 ykt68 staff 149 5 14 17:21 Dog.java
-rw-r--r-- 1 ykt68 staff 410 5 14 17:35 Main.java
[ykt68@MacBook teratail34924]$ cat Animal.java

java

1package teratail34924; 2 3public interface Animal { 4 public void animal(); 5}

[ykt68@MacBook teratail34924]$ cat Dog.java

java

1package teratail34924; 2 3public class Dog implements Animal { 4 5 @Override 6 public void animal() { 7 System.out.println("Dogクラスです。"); 8 } 9}

[ykt68@MacBook teratail34924]$ cat Cat.java

java

1package teratail34924; 2 3public class Cat implements Animal { 4 5 @Override 6 public void animal() { 7 System.out.println("Catクラスです。"); 8 } 9}

[ykt68@MacBook teratail34924]$ cat Main.java

java

1package teratail34924; 2 3public class Main { 4 5 public static void main(String[] args) { 6 7 if ( args.length != 1) { 8 System.err.println("動物の種類を指定してください。"); 9 System.exit(-1); 10 } 11 12 try { 13 Class<?> clazz = Class.forName("teratail34924." + args[0]); 14 Animal a = (Animal) clazz.newInstance(); 15 a.animal(); 16 } catch (Exception e) { 17 e.printStackTrace(); 18 } 19 } 20}

[ykt68@MacBook teratail34924]$ cd ../..
[ykt68@MacBook Teratail]$ ls
bin src
[ykt68@MacBook Teratail]$ cd bin
[ykt68@MacBook bin]$ ls
teratail34924
[ykt68@MacBook bin]$ java -cp . teratail34924.Main
動物の種類を指定してください。
[ykt68@MacBook bin]$ java -cp . teratail34924.Main Dog
Dogクラスです。
[ykt68@MacBook bin]$ java -cp . teratail34924.Main Cat
Catクラスです。
[ykt68@MacBook bin]$ java -cp . teratail34924.Main Bear
java.lang.ClassNotFoundException: teratail34924.Bear
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at teratail34924.Main.main(Main.java:13)
[ykt68@MacBook bin]$


以上です。参考になれば幸いです。

投稿2016/05/14 08:57

jun68ykt

総合スコア9058

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問