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

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

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

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

Q&A

4回答

1288閲覧

Java カプセル化応用問題

parabellum

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/07/25 02:55

編集2022/07/27 15:52

文房具クラスを追加する
StationaryShop を実行すると実行結果の通りになるように、Stationary クラスを追加しなさい

また、追加にともない Amount クラスにも必要な修正を行うこと

実行結果
三菱ジェットストリーム が 3 本あります
MONO消しゴム が 2 本あります
金額は 562 円です

public class StationaryShop2 { public static void main(String[] args) { Amount myCart = new Amount(0); Stationary ballPen = new Stationary( "三菱ジェットストリーム", new Amount(120), 3); Stationary eraser = new Stationary( "MONO消しゴム", new Amount(80), 2); myCart = myCart.add(ballPen.calcTotalAmount()); myCart = myCart.add(eraser.calcTotalAmount()); myCart = myCart.addTax(); myCart.showValue(); } }

この続きのコードを記述せよ

という課題に取り組んでいるのですが、上手く実行結果が出ず、現在手詰まり状態です。

僕自身では


public class StationaryShop2 { public static void main(String[] args) { Amount myCart = new Amount(0); Stationary ballPen = new Stationary("三菱ジェットストリーム", new Amount(120), 3); Stationary eraser = new Stationary("MONO消しゴム", new Amount(80), 2); myCart = myCart.add(ballPen.calcTotalAmount()); myCart = myCart.add(eraser.calcTotalAmount()); myCart = myCart.addTax(); myCart.showValue(); } } final class Stationary { private String name; private int quantity; public Stationary(String name , Amount value , int quantity) { this.name = name; this.quantity = quantity; } public Stationary calcTotalAmount() { return new Stationary(name, quantity); } }   final class Amount { private final int value; public Amount(int value) { this.value = value; } public Amount add(Amount augend) { return new Amount(value + augend.value); } public Amount addTax() { return new Amount((int)(value * 1.08)); } public void showValue() { System.out.println(name + " が " + quantity + " 本あります"); System.out.println("金額は " + value + " 円です"); } }

というところまではいったのですが、nameとquantityをどう返せばいいのか、どう出力すればいいのかわからず、現在進むことができずに詰んでおります。
僕の勉強不足が原因であり、厳しいお言葉も覚悟してますが、よければ教えていただけると幸いです…

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

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

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

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

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

dodox86

2022/07/25 03:26

なぜ、各所でfinalを付けているのでしょうか。また、先のご質問 [Java カプセル化の問題]https://teratail.com/questions/9hb0ldg0g7qvjz でいただいていた各回答の内容は理解し、消化できていますか?
RiaFeed

2022/07/25 03:36

問題自体が酷い…
BeatStar

2022/07/25 09:17

質問は編集できるので編集してください。お願いします。
parabellum

2022/07/26 01:20

すいません修正しました このサイトにまだ慣れてないのでご容赦ください
BeatStar

2022/07/26 03:16

この本来の問題はどこまで提示されていたのでしょうか? 例えば「mainメソッドしか提示されていないけど、それ以外は自分の力で組んだ」のか、「今提示されているものが問題文の全てで、自分では何も考えていない」のか、「(一つ前のやつで)自分で調べてみたが何もわからなかった」なのか… 二つ目や三つ目なら問題が悪すぎる、一つ目なら「ちょっと惜しい」かなと。
parabellum

2022/07/26 04:26

提示されていたのは、”問題文”、”実行結果の回答”、”メインメソッド”のみですね…今回の問題はひとつ前の問題の発展型で、Amountクラスはその問題で書いたものでした。そして今回はメインメソッドが前回の問題から少し追記され、Stationaryの追加とAmountの改修、というのが今回の問題です…
BeatStar

2022/07/26 05:05

忘れていました。 Amountの本来のコードはありますか? そのコードから手をつけたのが質問にあるAmountでしょうか? それともそのまま?
parabellum

2022/07/26 05:10

’’’ final class Amount { private final int value; Amount(int value) { this.value = value; } Amount add(Amount augend) { return new Amount(value + augend.value); } Amount addTax() { return new Amount((int)(value * 1.08)); } void showValue() { System.out.println("金額は " + value + " 円です"); } } ’’’ 前回の問題で書いたAmountはこうなってます。
BeatStar

2022/07/26 05:34

つまり、showValueメソッドだけ違うってことですね。
parabellum

2022/07/26 05:36

あ、ごめんなさい。一つ課題のメインメソッドはこうなってます。 public class StationaryShop { public static void main(String[] args) { Amount myCart = new Amount(0); Amount ballPen = new Amount(120); Amount eraser = new Amount(80); myCart = myCart.add(ballPen); myCart = myCart.add(eraser); myCart = myCart.addTax(); myCart.showValue(); } }
guest

回答4

0

あえてコードなしで説明するとこんな感じ?

Amountクラスには

  • getValueメソッドなんかを追加してvalueフィールドの値を他のクラスから取得できるようにする

Stationaryクラスは

  • (mainメソッド変更禁止なら)コンストラクタで商品名と本数をprint
  • コンストラクタに渡されてるAmount型のオブジェクトもフィールドを追加して代入
  • calcTotalAmountメソッドはAmountのvalue(getValue)と本数を基に計算した結果をAmount型のコンストラクタに渡してインスタンス化し、そのインスタンスを返す

投稿2022/07/25 04:17

RiaFeed

総合スコア2701

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

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

parabellum

2022/07/25 06:46

//25日目 クラスを追加しよう public class StationaryShop2 { public static void main(String[] args) { Amount myCart = new Amount(0); Stationary ballPen = new Stationary("三菱ジェットストリーム", new Amount(120), 3); Stationary eraser = new Stationary("MONO消しゴム", new Amount(80), 2); myCart = myCart.add(ballPen.calcTotalAmount()); myCart = myCart.add(eraser.calcTotalAmount()); myCart = myCart.addTax(); myCart.showValue(); } } class Stationary { private String name; private int quantity; private int value; public Stationary(String name , Amount value , int quantity) { this.name = name; this.quantity = quantity; } public void showValue() { System.out.println(name + " が " + quantity + " 本あります"); } public void setValue(int value) { this.value = value; } public Amount calcTotalAmount() { return new Amount(value*quantity); } } class Amount { private int value; public int getValue() { return this.value; } public Amount(int value) { this.value = value; } public Amount add(Amount augend) { return new Amount(value + augend.value); } public Amount addTax() { return new Amount((int)(value * 1.08)); } public void showValue() { System.out.println("金額は " + value + " 円です"); } } ほかに3つほど回答が来てましたが、貴方様のやり方で試してみました。 ひとまずここまでできたのですが、合ってますでしょうか? ・コンストラクタに渡されてるAmount型のオブジェクトもフィールドを追加して代入 というのがよくわからず…理解力なくてすいません…
RiaFeed

2022/07/25 07:23

showValueがどこからも呼ばれていないからprintされないし valueはint型でもいいですが、コンストラクタ引数のamountから値を取得していないから多分0のままですよ
parabellum

2022/07/26 01:33

なるほど… 色々ありがとうございます、もう少し思索してみます
guest

0

System.out.println(name + " が " + quantity + " 本あります");

を Amount の showValue に入れていますが、 name も quantity も Amount にありません。
そもそも Amount クラスは金額を表すだけで、その詳細(内訳)を保持する役割は無い設計と思われます。
ですので 実行結果の

plain

1三菱ジェットストリーム が 3 本あります 2MONO消しゴム が 2 本あります 3金額は 562 円です

のうち、最後の合計金額以外は Stationary クラスが表示するのが妥当でしょう。
Stationary オブジェクトに実行が移るタイミングはコンストラクタと calcTotalAmount メソッドですが、 calcTotalAmount は計算が主ですので表示するのは違う気がします。
以上から、 System.out.println(name + " が " + quantity + " 本あります"); は Stationary のコンストラクタで行うと良いように思います。

もちろん、 Amount の修正も OK ということですので、設計を変えて (Amount という名前ながらも ) イロイロ載せて解決する方法もあります。その為のコーディング要素を勉強されているかは不明ですが。

私が思ったのはこんな風です。

java

1class Stationary { 2 private String name; 3 private Amount unitprice; 4 private int quantity; 5 6 public Stationary(String name, Amount unitprice, int quantity) { 7 this.name = name; 8 this.unitprice = unitprice; 9 this.quantity = quantity; 10 showValue(); 11 } 12 public Amount calcTotalAmount() { 13 return unitprice.multiply(quantity); 14 } 15 public void showValue() { 16 System.out.println(name + " が " + quantity + " 本あります"); 17 } 18} 19 20final class Amount { 21 private final int value; 22 23 public Amount(int value) { 24 this.value = value; 25 } 26 public Amount add(Amount addend) { 27 return new Amount(value + addend.value); 28 } 29 public Amount multiply(int multiplicand) { 30 return new Amount(value * multiplicand); 31 } 32 public Amount addTax() { 33 return new Amount((int)(value * 1.08)); 34 } 35 public void showValue() { 36 System.out.println("金額は " + value + " 円です"); 37 } 38}

投稿2022/07/25 04:05

編集2022/07/27 06:52
jimbe

総合スコア12512

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

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

parabellum

2022/07/26 02:16

返信遅れてすみません、前回、今回と回答ありがとうございます! 金額以外の実行はどこで表示するか迷っていましたが、この回答で納得できました! 正直まだまだ理解できてないところが多いですが…
guest

0

Java

1public static void main(String[] args) { 2 Amount myCart = new Amount(0); 3 4 Stationary ballPen = new Stationary("三菱ジェットストリーム", new Amount(120), 3); 5 Stationary eraser = new Stationary("MONO消しゴム", new Amount(80), 2); 6 7 myCart = myCart.add(ballPen.calcTotalAmount()); 8 myCart = myCart.add(eraser.calcTotalAmount()); 9 myCart = myCart.addTax(); 10 myCart.showValue(); 11}

コレ↑がコンパイルできるのであれば、Stationary#calcTotalAmount() は Amount を返さねばならない。
であるなら、コレ↓がおかしい。

Java

1public Stationary calcTotalAmount() { // なんで Stationary を返すん? 2 return new Stationary(name, quantity); 3}

投稿2022/07/25 03:32

episteme

総合スコア16614

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

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

parabellum

2022/07/26 02:14

返信遅れてごめんなさい、回答ありがとうございます! そこは一応なんとなくですが理解はできました!
guest

0

コツ1:処理の流れを読む

プログラミングはやらためったに描くものではありません処理の流れを記述するのです。
そう、料理のレシピのように。

コードを読むコツは「一行レベルで、その行が何をしているかを考えながら読む」です。

Java

1 // Amountのオブジェクトに0を渡して生成 2 Amount myCart = new Amount(0); 3 // ボールペンの生成 4 Stationary ballPen = new Stationary( 5 "三菱ジェットストリーム", new Amount(120), 3); 6 // けしごむの生成 7 Stationary eraser = new Stationary( 8 "MONO消しゴム", new Amount(80), 2); 9 // ボールペンの合計金額を計算して 10 // カートに入れる? 11 myCart = myCart.add(ballPen.calcTotalAmount()); 12 // 同じくけしごむも。 13 myCart = myCart.add(eraser.calcTotalAmount()); 14 // 消費税分を足して 15 myCart = myCart.addTax(); 16 // 結果を出力(カート側が) 17 myCart.showValue();

となりますね。あとはこれに出てくるmyCartやらなんやらの実装ですね。

(ちょっと中断します)

投稿2022/07/26 05:04

BeatStar

総合スコア4956

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

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

parabellum

2022/07/26 05:07

なるほど…料理のレシピのようにとは言いえて妙ですね。 一行レベルで、その行が何をしているかを考えながら読むというのは心がけてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問