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

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

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

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

Q&A

1回答

535閲覧

Java 3つ以上のクラスを持ち、戻り値を持つメソッド、戻り値を持たないメソッドを持つクラスをどのように作成すればいいのか。

oka08

総合スコア1

Java

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

0グッド

0クリップ

投稿2024/07/23 17:37

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 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 + "円でした。"); } }

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

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

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

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

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

jimbe

2024/07/23 18:32

>実行結果が間違っているようです 他人には正しい実行結果が何なのか分からないのですが…。 本来はどのような結果になるはずが、ご提示のコードではどのような結果になるののかを質問を編集して追加して頂けますか。 ついでにコードを囲むマークダウン(```)の始まりのほうの直後(同じ行)にそのコードの言語名を付けてください。 本件なら例えば ```java package 課題; (中略) } ``` とされますと、行番号が付いたり java のキーワードに色が付いたりして見易くなります。 また、余計な空行を削除したりインデントを揃えたりも見易さ=書き間違えによるバグの予防に役立ちます。(teratail には書き込める最大文字数の制限がありますのでその回避にもなります^^;)
jimbe

2024/07/24 17:40 編集

質問とは直接関係無いのかもしれませんが…なぜ Cakes クラスと Sweet クラスは Juice クラスを extends しているのでしょうか。 現実的に考えて、 ケーキはジュースですか? スイーツって単体で存在してしかもジュースでしょうか。 また、Cakes も Sweet もぞれぞれ Juice クラスのフィールドは使っておらず、それぞれが定義していないメソッド(=親のメソッド)の使用するフィールドの値が設定されていません。(←それによって結果が違うと言われている?) 継承する意味を把握していないと答えが合っていたとしてもダメなのではないでしょうか。 >3つ以上のクラスを持ち、1つのクラスには戻り値を持つメソッドを含み、別のクラスには戻り値を持たないメソッドを含むプログラムを作成する。 現状では 3 つのクラスはあってもそれぞれのクラスは継承関係にあり同じメソッドを持っているだけです。 ちょっと問題の主旨とは違うのではないでしょうか。
dodox86

2024/07/24 05:43

@質問者 oka08さん いただいたコメントや回答に対して今のところ質問者さんからのレスが無いので詳細は分かりませんが、 > 3つ以上のクラスを持ち、1つのクラスには戻り値を持つメソッドを含み、別のクラスには戻り値を持たないメソッドを含むプログラムを作成する。 この文(課題内容)だけを読むと「継承(extends)を使って作る」、とのような条件は無いように思います。シンプルに、まったく別の性質をもつクラスを3つ作って、それぞれのクラスに課題の条件に合うメソッドを作ればいいだけの話なのではないでしょうか。自分の思うクラスを自力で作れるかどうかを判定する課題なのでは? 継承は初心の方には必要性自体があまり理解されず、適切に使うには意外と難しいようです。まだ充分に理解できていないテクニックを無理に使うことは無いと思うのですがいかがでしょうか。
oka08

2024/07/24 18:27

お返事遅くなって大変申し訳ございません。この課題は一度見ていただいて、再度提出になったのですが、元々は回答者様のおっしゃるように別のクラスを3つ作りました。再提出の理由としてはメインメソッドは1つでとのことだったので、(自分は各クラスごとにメインメソッド、オブジェクト?を作っておりました)継承を使うのかなと思いこのプログラムを作成したのですが、おそらく回答者様がおっしゃるようなプログラムを作るべきなのだと思います… 別の性質のクラスを3種類作って、一つのメインメソッドオブジェクトにまとめることは可能でしょうか?
dodox86

2024/07/25 00:57

> 再提出の理由としてはメインメソッドは1つでとのことだったので、(自分は各クラスごとにメインメソッド、オブジェクト?を作っておりました)継承を使うのかなと思い メインメソッドが1つだからといって継承、と言うことにはなりませんね。(使ってもいいですが、直接的な関係はないです) 出題者の意図としては恐らく、あるひとつのクラスにあるpublic static void main(String[] args) {}のメソッド内で、そのクラスを含んで他の3つ以上のクラスのインスタンスを作り、それぞれのクラスについて課題にあったメソッドを使ってどうこうせよ。その使い方でこれまでの履修内容の理解度を図る、と言うものだったのではないでしょうか。(あくまで私の推測です) 極端な話、メソッドを使ってなくても、定義さえしていれば課題内容の要求は本来満たせているはずです。 尚、3つのクラスがあって、それぞれにmainのメソッドがあっても本来は別に問題ないのですが、課題の主旨としては求めていないことなのでしょう。 > 別の性質のクラスを3種類作って、一つのメインメソッドオブジェクトにまとめることは可能でしょうか? "メインメソッドオブジェクト"と言う言葉は恐らく不適切です。メソッドのオブジェクトと言うものは存在しません。(いや、正確にはそういった概念のものを作ることはできますが) 単語の使い方が少々間違っているように思うのでご質問の意図を図りかねていますが、まとめると言いますか、前述のようにあるクラスのpublic static void main(String[] args){} の中で他のクラスをどうこうさせるのではないでしょうか。"まとめる"と言ってしまうと、例えばあるクラスで他の2つ以上のクラスのメソッドを、ひとつのメソッドに集約させてしまう、とのように捉えられますが、そういうことではないのですよね? 日本語の問題になってきますし、これまで履修内容の流れにもよると思うのですが、課題の元の説明を読むとそれほどのややこしい話ではない気がしています。
guest

回答1

0

Cakes / Sweet の両クラスは Juice クラスを継承しているため getColor() / getWeight() / getPrice() の各メソッドはそれぞれで定義しなくても使えますが、これらのメソッドは Juice クラスでしか定義していない color / weight / price フィールドを参照しています。が、 Cakes / Sweet 両クラスは Juice クラスのフィールドに一切値を設定していませんので、これらのメソッドはフィールドの初期値である null や 0 を返すでしょう。
Cakes / Sweet クラスで新たにフィールドを定義するのでは無く、 Juice クラスのフィールドを用いるべきです。また各メソッド内で使っている "ジュース" とか "ケーキ" とかの文字列もフィールドにする等しないと Juice クラスで無いのに "ジュースの色~" 等と表示されてしまいます。

それと、 main メソッド内でのインスタンスの使用も(コピペで作った所為で)変数を間違えている所があります。


何をどれほど習っている/理解しているのか、問題も継承が必要なのかどうか、『3つ以上のクラスを持つ』クラスなのか単に『3つ以上のクラス』なのか等不明な点が多いですが、もう少し実用的というか各クラスがちゃんと(?)関係しているようなほうが良いのではないでしょうか。
現状では結局全部に同じ意味のフィールドがあってメソッドも違いが無くそれぞれインスタンスを作って表示しているだけです。(show() は使ってませんし。)

例えば

  1. 「戻り値のあるメソッド」を持つクラスを 2 種類 (SupplierA/SupplierB) 定義する。その戻り値のパターンは異なるようにする。
  2. 2 つの値を加算した結果を表示する「戻り値の無いメソッド」を持つ Consumer クラスを定義する。
  3. それぞれのインスタンスを作って何度か加算を表示する。

とすれば、 3 つのクラスとか戻り値のある/ないメソッドの定義をクリアした上で、それぞれが関係して動作する様子を見せることが出来ます。
(ついでに 2 つの Supplier クラスの親クラスも定義して継承関係も作れます。)

ざっくりこんな感じ。

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Supplier a = new SupplierA(new int[]{1, 2, 3}); 6 Supplier b = new SupplierB(new int[]{4, 5, 6, 7}); 7 Consumer c = new Consumer(); 8 9 for(int i=0; i<8; i++) { 10 c.accept(a.get(), b.get()); 11 } 12 } 13 //サプライヤ 14 private static abstract class Supplier { 15 protected int[] datas; 16 protected int next; 17 Supplier(int[] datas, int startIndex) { 18 this.datas = datas; 19 this.next = startIndex; 20 } 21 abstract int get(); 22 } 23 //指定した配列のデータを順に get 出来るサプライヤ 24 private static class SupplierA extends Supplier { 25 SupplierA(int[] datas) { 26 super(datas, 0); 27 } 28 int get() { 29 int data = datas[next++]; 30 if(next >= datas.length) next = 0; 31 return data; 32 } 33 } 34 //指定した配列のデータを逆順に get 出来るサプライヤ 35 private static class SupplierB extends Supplier { 36 SupplierB(int[] datas) { 37 super(datas, datas.length-1); 38 } 39 int get() { 40 int data = datas[next--]; 41 if(next < 0) next = datas.length - 1; 42 return data; 43 } 44 } 45 //足し算の結果を表示するコンシューマ 46 private static class Consumer { 47 void accept(int a, int b) { 48 System.out.println(a+"+"+b+"="+(a+b)); 49 } 50 } 51}

実行結果 (paiza.io で実行)

1+7=8 2+6=8 3+5=8 1+4=5 2+7=9 3+6=9 1+5=6 2+4=6

結果を見れば各サプライヤがそれぞれの順でデータを返していることやコンシューマが正しく加算・表示していることが分かります。


超簡単な 3 つのクラスにしてみます。

java

1import java.util.*; 2//mainメソッドを持つクラス 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Supplier a = new Supplier(); 6 Consumer c = new Consumer(); 7 8 c.accept(a.get()); 9 } 10} 11//文字列を返すメソッドを持つクラス 12class Supplier { 13 String get() { 14 return "Hello World !"; 15 } 16} 17//文字列を表示するメソッドを持つクラス 18class Consumer { 19 void accept(String s) { 20 System.out.println(s); 21 } 22}

実行結果

Hello World !

投稿2024/07/24 03:25

編集2024/07/25 05:54
jimbe

総合スコア13045

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

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

oka08

2024/07/24 18:21

お返事が遅くなって大変申し訳ございません。また、丁寧な解説とプログラムの提示ありがとございます。問題としては「3つ以上のクラス」であると思います。クラスに関しては、関係している方がいいですよね、、その部分について詳しく説明を受けておらず、自分なりの判断で作成しておりました、、、基礎的な部分がまだ理解できていない部分があるので、もう一度その部分を学習してから、ご教示いただいたプログラムに挑戦します。
jimbe

2024/07/25 05:47

クラスの定義が「3つのクラスを持つクラス」とすると回答のような入れ子構造になるイメージですが、単に「3つのクラス」であれば質問のコードのように public class Main { } abstract class Supplier { } class SupplierA extends Supplier { } class SupplierB extends Supplier { } class Consumer { } と並べて定義するのでよさそうですね。 なんなら、Supplier のメソッドが返した文字列/数値を Consumer のメソッドが表示するというだけでも良いのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問