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

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

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

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

Q&A

解決済

2回答

2575閲覧

インタフェース、抽象クラスについての問題がわかりません。

wakataku1318

総合スコア19

Java

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

0グッド

0クリップ

投稿2017/01/05 09:03

###前提・実現したいこと
javaを使用した課題に取り組んでいます。
インタフェース、抽象クラスを使用して以下の実行例通りに表示をしたいです。
[実行例]
$javac Kadai64.java
$java Kadai64
24インチディスプレイ:60000

またmain関数の中の手順が以下になります。

  1. MyFactory

クラスのオブジェクトを作成し,参照をFactory型の変数fに代入する
2. f引数に与え,FactoryViewerクラスのオブジェクトを作成し,参はVisible型の変数vに代入する
3. vを用いてviewメソッドを実行する

おそらくtoString()メソッドの戻り値がうまく返せていないので、違う結果になっていると思うのですが、解決方法がわかりません。
また参照変数についてもよく理解できていません。

###発生している問題・エラーメッセージ

Kadai64.java:48: ';' がありません。 return product:price; ^ Kadai64.java:48: 文ではありません。 return product:price; ^ エラー 2 個 (以上の文章を以下のように変更して、実行した結果) return "product:price"; FactoryViewer@3bba1894

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

public class Kadai64 { public static void main(String arg[]) { MyFactory f = new MyFactory("24インチディスプレイ",600000); FactoryViewer v = new FactoryViewer(f); v.view(); } } /** *Factory抽象クラス */ abstract class Factory{ /** *フィールドを文字列にして戻す抽象メソッド */ abstract public String toString(); } class MyFactory extends Factory{ /** *製品名を表します */ protected String product; /** *価格を表します */ protected int price; /** *参照変数を表します */ protected Factory f; /** *製品名、価格を引数にとるコンストラクタ */ public MyFactory(String pro,int pri){ product = pro; price = pri; } /** *”製品名:価格”の文字列で返すコンストラクタ */ public String toString(){ return "product:price"; } } /** *表示する性質をクラスに付加するインタフェースVisible */ interface Visible{ /** *表示する抽象メソッド */ abstract void view(); } /** *Factoryの内容を表示するクラスFactoryViewer */ class FactoryViewer implements Visible{ /** *フィールドの値を引数に受け取るコンストラクタ */ public FactoryViewer(Factory f){ } /** *toStringメソッドの戻り値を表示するメソッド */ public void view(){ System.out.println(toString()); } }

###試したこと
エラー箇所をエラーにならないように変更してみた。

###補足情報(言語/FW/ツール等のバージョンなど)
java言語

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

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

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

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

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

guest

回答2

0

ベストアンサー

ソースを一読させていただきました。初学者のようなので仕方がないことだと思いますが、まだまだ基本的理解が未熟な印象を受けます。
まず、 String product と int price の値を "[productの値]:[priceの値]" として連結した文字列を返すメソッドを例としておいておきます。

Java

1public String test() { 2 String product = "24インチディスプレイ"; 3 int price = 600000; 4 5 return product + ":" + price; 6}

実を言うと、このやりかたはあまり好まれないのでStringBuilderというものを使うのですが、それはもうすこし学習が進んでからでしょう。(私的の開発では面倒で省いちゃいますが 笑)

また

Java

1/** 2*Factory抽象クラス 3*/ 4abstract class Factory{ 5 6 /** 7 *フィールドを文字列にして戻す抽象メソッド 8 */ 9 abstract public String toString(); 10}

とありますが、とくに理由がなければinterfaceで書くべきです(課題ということなのでわざとですかね?)
interfaceはすべて抽象メソッドですが、抽象クラスはabstractではないメソッドも記述できます。
もし課題かなんかの関係で、これを抽象クラスとして運用させたい場合、なんらかのフィールド(変数)を持たせておいてください。それが正しい抽象クラスの使い方です。
抽象クラスは、ある程度の骨組みを作っておき、そこから拡張していくためのものです。
interfaceは、それひとつで性質を示すことができ、これらを実装するすべてのクラスの共通性質を示すことができます。そういうわけでinterfaceを実装するクラスはそれをすべて実装しなければコンパイル・エラーとなります(いいかえればさっき述べたようにすべてabstractのメソッドです)。まだその使いみちはわからないかもしれませんが、気づいた時にはなんて便利なものだと思うでしょう。
またinterface内ではabstractを明示する必要がありません。
ですので、

Java

1/** 2*表示する性質をクラスに付加するインタフェースVisible 3*/ 4interface Visible{ 5 /** 6 *表示する抽象メソッド 7 */ 8 abstract void view(); 9}

これを、

Java

1/** 2*表示する性質をクラスに付加するインタフェースVisible 3*/ 4interface Visible{ 5 /** 6 *表示する抽象メソッド 7 */ 8 void view(); 9}

と書きかえると可読性が上がると思います。好きな方で構いませんが。
また抽象メソッドをオーバーライドをする際には、以下のように@Overrideアノテーションをつけると良いでしょう。
間違いをコンパイルの段階で検出してくれます。アノテーションについて詳しいことはまだわからなくてもいいと思います。

Java

1@Override 2public void implementation_required() { 3 return; 4}

ちょっと長くなってしまっていますが、あともう少しお時間をください。
Visible の実装で toString() を用いていますが、 toString という名前を使用は回避すべきです。
なぜなら、 java.lang.Object ですでに定義されているからです。 java.lang.Object はすべてのクラスのスーパークラスです。詳しくはJavaのDocumentationをごらんください → java.lang.Object
そして最後に重大な問題ですが、

Java

1/** 2*Factoryの内容を表示するクラスFactoryViewer 3*/ 4class FactoryViewer implements Visible{ 5 6 /** 7 *フィールドの値を引数に受け取るコンストラクタ 8 */ 9 public FactoryViewer(Factory f){ 10 } 11 12 /** 13 *toStringメソッドの戻り値を表示するメソッド 14 */ 15 public void view(){ 16 System.out.println(toString()); 17 } 18}

view()内で正しく参照が行われていません。これではFactoryViewerのインスタンスのtoString()が呼び出されてしまっています。(これは前述の通りObjectから継承されたものです、FactoryViewerの文字列表現が返ってきているのがわかると思います)期待する動作を実現するためにはこのようにしてください。

Java

1/** 2*Factoryの内容を表示するクラスFactoryViewer 3*/ 4class FactoryViewer implements Visible{ 5 private Factory factory; 6 7 /** 8 *フィールドの値を引数に受け取るコンストラクタ 9 */ 10 public FactoryViewer(Factory f){ 11 factory = f; 12 } 13 14 /** 15 *toStringメソッドの戻り値を表示するメソッド 16 */ 17 public void view(){ 18 System.out.println(factory.toString()); 19 } 20}

以上のことを改善すれば動作しますが、あと2点だけお知らせしておきたいことがあります。
命名に関してですが、「FactoryViewer」の実装が「Visible」だと混乱します。
Viewer→見るもの
Visible→可視
のように、意味が離れているため、どのような実装が第三者から推測できず混乱します。
「Visible」は「Viewer」に改めるべきです。
またコンストラクタの記述ですが、以下のようにできます

Java

1public class Test { 2private int value; 3 4 public Test(int value) { 5 this.value = value; 6 } 7}

あとどうして protected にしているのか...? と気になる部分はありますが
アクセス修飾子について書くと本題からそれすぎるため書けません、これに関しては別途質問するなりご自分で調べてください。
以上です。ご不明な点があればお知らせください

投稿2017/01/05 11:00

編集2017/01/06 03:09
Zooey

総合スコア55

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

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

swordone

2017/01/05 14:20

> String型ではない変数をString型で返すには、String型に変換する必要があります。この型変換をキャストといいます。 誤解を招くので、この言い方は訂正すべき。キャストはある型を別の型として扱うことであり、Stringへの変換はここではキャストと関係ありません。
Zooey

2017/01/06 03:05

ご指摘ありがとうございます。言われてから気づきました。この場合、「文字列と連結」という言葉を使うべきでした。型変換では意味合いが変わってしまいますね。
wakataku1318

2017/01/06 03:23

とても丁寧でわかりやすい回答ありがとうございました。 まだまだjavaについての知識が浅いことを痛感できました。 ご指摘いただいた箇所を修正した結果、実行例通りに表示することができました。 ありがとうございました。
Toshimichi

2019/03/22 15:45

文字列連結に、かんしてですが、処理が一回だけであるならば、+演算子を使っても最適化が自動的にかかりますのでStringBuilderはいりません。
guest

0

MyFactoryクラスとFactoryViewerクラスはインターフェースクラスとか抽象クラスを継承していますか。
もし継承しているのであれば継承元のクラスを引数の型にすることでインターフェースないし、抽象クラスを利用することができます。
ポリモーフィズムで検索するとくらしいことがわかると思います。

投稿2017/01/05 10:53

ky2

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問