実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 3つ以上のクラスを持ち、1つのクラスには戻り値を持つメソッドを含み、別のクラスには戻り値を持たないメソッドを含むプログラムを作成する。
前提
学校の最終課題として取り組んでおります。クラスを拡張し、3つのクラスを作成後、戻り値を持つメソッドと戻り値のないメソッドを打ち込みましたが、実行結果が間違っているようです…。
どこを改善するべきなのかのアドバイスをいただきたいです。
エラーメッセージ
該当のソースコード
package 課題; //ジュースクラス class Juice { //フィールド String color; double weight; int price; //メソッド String getColor() { System.out.println("ジュースの色を調べました。"); return color; } double getWeight() { System.out.println("ジュースの重さを調べました。"); return weight; } int getPrice() { System.out.println("ジュースの価格を調べました。"); return price; } void setColorWeightPrice(String c, double w, int p) { color = c; weight = w; price = p; System.out.println("ジュースの色を"+ color + "に重さを" + weight + "グラムに価格を" + price + "円にしました。"); } void show() { System.out.println("ジュースの色は"+ color +"色です。"); System.out.println("ジュースの重さは"+ weight +"グラムです。"); System.out.println("ジュースの価格は"+price+"円です。"); } } //ケーキクラス class Cakes extends Juice { //フィールド; String color1; double weight1; int price1; //メソッド void setColorWeighhtPrice(String c, double w, int p) { color1 = c; weight1 = w; price1 = p; System.out.println("ケーキの色を" + color1 + "、重さを" + weight1 + "グラム、価格を" + price1 + "円にしました。"); } void show () { System.out.println("ケーキの色は" + color1 + "です。" ); System.out.println("ケーキの重さは" + weight1 + "です。" ); System.out.println("ケーキの価格は" + price1 + "です。" ); } } //お菓子クラス class Sweet extends Juice { //フィールド; String color2; double weight2; int price2; //メソッド void setColorWeightPrice(String c, double w, int p) { color2= c; weight2 = w; price2 = p; System.out.println("お菓子の色を" + color2 + "、重さを" + weight2+ "グラム、価格を" + price2 + "円にしました。"); return; } void show () { System.out.println("お菓子の色は" + color2 + "です。" ); System.out.println("お菓子の重さは" + weight2 + "です。" ); System.out.println("お菓子の価格は" + price2 + "です。" ); } } public class 課題15a { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ Juice juice1 = new Juice(); juice1.setColorWeightPrice("橙", 10, 500); String color = juice1.getColor(); double weight =juice1.getWeight(); int price = juice1.getPrice(); System.out.println("サンプルからジュースを調べたところ"); System.out.println("ジュースの色は"+ color + "、重さは" + weight + "グラム、価格は" + price + "円でした。"); Cakes cakes1 = new Cakes(); cakes1.setColorWeightPrice("白", 300, 1500); String color1 = cakes1.getColor(); double weight1 =cakes1.getWeight(); int price1 = cakes1.getPrice(); System.out.println("サンプルからケーキを調べたところ"); System.out.println("ケーキの色は"+ color1 + "、重さは" + weight1 + "グラム、価格は" + price1 + "円でした。"); Sweet sweet1 = new Sweet(); sweet1.setColorWeightPrice("黄色", 60, 350); String color2 = juice1.getColor(); double weight2 =juice1.getWeight(); int price2 = juice1.getPrice(); System.out.println("サンプルからお菓子を調べたところ"); System.out.println("お菓子の色は"+ color2 + "、重さは" + weight2 + "グラム、価格は" + price2 + "円でした。"); } }
>実行結果が間違っているようです
他人には正しい実行結果が何なのか分からないのですが…。
本来はどのような結果になるはずが、ご提示のコードではどのような結果になるののかを質問を編集して追加して頂けますか。
ついでにコードを囲むマークダウン(```)の始まりのほうの直後(同じ行)にそのコードの言語名を付けてください。
本件なら例えば
```java
package 課題;
(中略)
}
```
とされますと、行番号が付いたり java のキーワードに色が付いたりして見易くなります。
また、余計な空行を削除したりインデントを揃えたりも見易さ=書き間違えによるバグの予防に役立ちます。(teratail には書き込める最大文字数の制限がありますのでその回避にもなります^^;)
質問とは直接関係無いのかもしれませんが…なぜ Cakes クラスと Sweet クラスは Juice クラスを extends しているのでしょうか。
現実的に考えて、 ケーキはジュースですか? スイーツって単体で存在してしかもジュースでしょうか。
また、Cakes も Sweet もぞれぞれ Juice クラスのフィールドは使っておらず、それぞれが定義していないメソッド(=親のメソッド)の使用するフィールドの値が設定されていません。(←それによって結果が違うと言われている?)
継承する意味を把握していないと答えが合っていたとしてもダメなのではないでしょうか。
>3つ以上のクラスを持ち、1つのクラスには戻り値を持つメソッドを含み、別のクラスには戻り値を持たないメソッドを含むプログラムを作成する。
現状では 3 つのクラスはあってもそれぞれのクラスは継承関係にあり同じメソッドを持っているだけです。
ちょっと問題の主旨とは違うのではないでしょうか。
@質問者 oka08さん
いただいたコメントや回答に対して今のところ質問者さんからのレスが無いので詳細は分かりませんが、
> 3つ以上のクラスを持ち、1つのクラスには戻り値を持つメソッドを含み、別のクラスには戻り値を持たないメソッドを含むプログラムを作成する。
この文(課題内容)だけを読むと「継承(extends)を使って作る」、とのような条件は無いように思います。シンプルに、まったく別の性質をもつクラスを3つ作って、それぞれのクラスに課題の条件に合うメソッドを作ればいいだけの話なのではないでしょうか。自分の思うクラスを自力で作れるかどうかを判定する課題なのでは?
継承は初心の方には必要性自体があまり理解されず、適切に使うには意外と難しいようです。まだ充分に理解できていないテクニックを無理に使うことは無いと思うのですがいかがでしょうか。
お返事遅くなって大変申し訳ございません。この課題は一度見ていただいて、再度提出になったのですが、元々は回答者様のおっしゃるように別のクラスを3つ作りました。再提出の理由としてはメインメソッドは1つでとのことだったので、(自分は各クラスごとにメインメソッド、オブジェクト?を作っておりました)継承を使うのかなと思いこのプログラムを作成したのですが、おそらく回答者様がおっしゃるようなプログラムを作るべきなのだと思います… 別の性質のクラスを3種類作って、一つのメインメソッドオブジェクトにまとめることは可能でしょうか?
> 再提出の理由としてはメインメソッドは1つでとのことだったので、(自分は各クラスごとにメインメソッド、オブジェクト?を作っておりました)継承を使うのかなと思い
メインメソッドが1つだからといって継承、と言うことにはなりませんね。(使ってもいいですが、直接的な関係はないです)
出題者の意図としては恐らく、あるひとつのクラスにあるpublic static void main(String[] args) {}のメソッド内で、そのクラスを含んで他の3つ以上のクラスのインスタンスを作り、それぞれのクラスについて課題にあったメソッドを使ってどうこうせよ。その使い方でこれまでの履修内容の理解度を図る、と言うものだったのではないでしょうか。(あくまで私の推測です) 極端な話、メソッドを使ってなくても、定義さえしていれば課題内容の要求は本来満たせているはずです。
尚、3つのクラスがあって、それぞれにmainのメソッドがあっても本来は別に問題ないのですが、課題の主旨としては求めていないことなのでしょう。
> 別の性質のクラスを3種類作って、一つのメインメソッドオブジェクトにまとめることは可能でしょうか?
"メインメソッドオブジェクト"と言う言葉は恐らく不適切です。メソッドのオブジェクトと言うものは存在しません。(いや、正確にはそういった概念のものを作ることはできますが)
単語の使い方が少々間違っているように思うのでご質問の意図を図りかねていますが、まとめると言いますか、前述のようにあるクラスのpublic static void main(String[] args){} の中で他のクラスをどうこうさせるのではないでしょうか。"まとめる"と言ってしまうと、例えばあるクラスで他の2つ以上のクラスのメソッドを、ひとつのメソッドに集約させてしまう、とのように捉えられますが、そういうことではないのですよね?
日本語の問題になってきますし、これまで履修内容の流れにもよると思うのですが、課題の元の説明を読むとそれほどのややこしい話ではない気がしています。
![guest](/img/icon/icnUserSample.jpg)