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

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

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

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

Q&A

解決済

2回答

906閲覧

メソッドの中身が反映されない

Kousukee

総合スコア2

Java

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

0グッド

1クリップ

投稿2022/06/04 08:36

編集2022/06/04 09:02

Java

1class Sample7_2 { 2 public static void main(String[] args) { 3 Item i1 = new Item(); 4 i1.taxShow("ガム",100,90,10); 5 } 6} 7 8class Item{ 9 private int num; 10 private int price; 11 private String name; 12 13 private void buyShow() { 14 System.out.println(" 商品Nо.は " + num + " です。"); 15 System.out.println("   商品名 " + name + " です。"); 16 System.out.println("  商品価格 " + price + "円 です。"); 17 } 18 19 public void taxShow( String name, int num, int price, int tax) { 20 buyShow(); 21 int tvalue = price + (price * (tax/100)); 22 System.out.println("   消費税 " + tax + " %です。"); 23 System.out.println("税込商品価格 " + tvalue + " 円です。"); 24 } 25} 26

————-—-実行結果————————
商品No.は 0 です。
商品名 null です。
商品価格 0円 です。
消費税 10% です。
税込商品価格 90 円です。
——————————————————-
「商品No.は100です。」というように中身に値を入れたいのですが、どうすれば良いでしょうか?

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

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

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

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

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

javahack

2022/06/04 08:51

コードは画像ではなく「コードの挿入」を使ってテキストを張り付けてください。
javahack

2022/06/04 10:53

taxShow()ではちゃんと値が "渡されて" 表示できています。 同じことをbuyShow()でもやればよいのでは?
BeatStar

2022/06/04 12:13

基礎からやりましょう。 流石に基礎すらやろうとしない人に説明しても無駄です。この手の内容は入門書や入門サイトにくどいほど書かれています。まずは基礎から。 [質問者さんが学ぶべきもの] ■ メソッド ■ 引数/仮引数 ■ 戻り値 ■ (変数の)スコープ
Kousukee

2022/06/04 12:19

ありがとうございます。無事に動きました! ただ、何故buyShow()メソッドに引数が必要になるのでしょうか?mainメソッドで呼び出されているのはtaxShow()メソッドですし、taxShow()メソッドで引数を指定して値を取ってきているのでその中で動いているbuyShow()メソッドには引数は必要ないのではと感じてしまいます。立て続けの質問になり申し訳ございませんが、ご教授いただければ幸いです。
guest

回答2

0

ベストアンサー

おそらく、コレ↓があなたの欲するもの。

Java

1// Sample7_2.java 2 3public class Sample7_2 { 4 public static void main(String[] args) { 5 Item i1 = new Item("ガム",100, 90); // "ガム" #100 90円 6 i1.taxShow(10); // 消費税 10% 7 } 8} 9 10class Item { 11 private int num; 12 private int price; 13 private String name; 14 15 public Item( String name, int num, int price) { 16 this.name = name; 17 this.price = price; 18 this.num = num; 19 } 20 21 private void buyShow() { 22 System.out.println(" 商品Nо.は " + num + " です。"); 23 System.out.println("   商品名 " + name + " です。"); 24 System.out.println("  商品価格 " + price + "円 です。"); 25 } 26 27 public void taxShow(int tax) { 28 buyShow(); 29 int tvalue = price + (price * tax / 100); 30 System.out.println("   消費税 " + tax + " %です。"); 31 System.out.println("税込商品価格 " + tvalue + " 円です。"); 32 } 33}

投稿2022/06/04 12:49

episteme

総合スコア16614

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

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

0

※ この回答は補足みたいなものです。ただ、この質問の根本的な問題だと思うので回答しておきます。

(↓ 修正依頼の欄にて)

ただ、何故buyShow()メソッドに引数が必要になるのでしょうか?mainメソッドで呼び出されているのはtaxShow()メソッドですし、taxShow()メソッドで引数を指定して値を取ってきているのでその中で動いているbuyShow()メソッドには引数は必要ないのではと感じてしまいます。立て続けの質問になり申し訳ございませんが、ご教授いただければ幸いです。

まず、変数や配列、オブジェクトはスコープ(Scope)と呼ばれる範囲があります。メソッド内にある変数はメソッド内でしか使えません。

Java

1public void method1(){ 2 int a = 0; 3 a++; 4 // 何らかの処理 5}

とあった場合、変数 a はこのmethod1の範囲しか使えません。仮にmethod2という別のメソッド内にint aとしてもそれは別物です。変数は単なる容器のようなものです。容器が大事なのではなく、中身が大事です。
つまり変数そのものではなく、データ自身が大事。
で、たまたま容器の名前が同じってだけです。データそのものは別物。

言語によっては違うかもしれませんが、少なくともJavaやC++等の言語だと、

Java

1public void method2(){ 2 int a = 0; 3 a++; 4 5 System.out.println( a ); 6 7 if( a == 1 ){ 8 System.out.println( "OK" ); 9 }else{ 10 System.out.println( "Error" ); 11 } 12 13return; // 本来は必要ないが、わかりやすくするために書いた... 14}

というコードだった場合、まずmethod2メソッドが呼び出される。
すると、変数 a というのが作られ、これの初期値を0とする。
a++ つまり aをインクリメントして値を書き換える。
で、そのまま表示。
そしてif文で分岐して…とやって、return; のとき(もしくはその後か?)辺りで変数 a が破棄される。

つまり、呼び出し側に変数 a があってもそれは別物。

一応引数や戻り値とかで受け渡せば同じになるが、それはあくまでデータそのものを受け渡ししているだけで、変数が同じだからではないです。

メソッド内のオブジェクトや配列も同様です。

メソッド内の変数ではなく、フィールドの場合はクラスオブジェクト単位で管理されるだけです。オブジェクトが破棄されるときにデータも破棄される。

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

まずMainメソッドから読んでみましょう。

Java

1class Sample7_2 { 2 public static void main(String[] args) { 3 // Itemクラスでオブジェクトを生成(i1とする) 4 Item i1 = new Item(); 5 // そのオブジェクトのtaxShowメソッドに引数群を与え、処理してもらう 6 i1.taxShow("ガム",100,90,10); 7 } 8}

つまり、オブジェクトを生成して、そのオブジェクトのメソッドを呼び出して処理しているだけ。

ではこの呼び出されているメソッドやコンストラクタも同じように読んでみましょう。
コンストラクタ( Item i1 = new Item(); で呼び出されるやつ )は…どうやらデフォルトのやつっぽいですね。
なので今回はスルー。
次の「そのオブジェクトのtaxShowメソッドに引数群を与え、処理してもらう」の行を潜る。

まずItem.taxShowのある場所を探す。

Java

1class Item{ 2 private int num; 3 private int price; 4 private String name; 5 6 private void buyShow() { 7 System.out.println(" 商品Nо.は " + num + " です。"); 8 System.out.println("   商品名 " + name + " です。"); 9 System.out.println("  商品価格 " + price + "円 です。"); 10 } 11 12 // ここ!!!!! 13 public void taxShow( String name, int num, int price, int tax) { 14 // buyShowメソッドを呼び出す 15 buyShow(); 16 // 税込み価格を計算する… 17 int tvalue = price + (price * (tax/100)); 18 // 消費税やら税込み価格やらを表示する 19 System.out.println("   消費税 " + tax + " %です。"); 20 System.out.println("税込商品価格 " + tvalue + " 円です。"); 21 } 22}

となっていますね。最後の二行はまとめて書いていますが、実際には細かく書いてもいいです。
これを疑似コードとして切り出すと、

[Flow] 1. buyShowメソッドを呼び出す 2. 税込み価格を計算する… 3. 消費税やら税込み価格やらを表示する

みたいになるはずです。

(1)でbuyShowメソッドを呼び出しています。(2)で計算して(3)で結果出力。

buyShowメソッドも呼び出されているのでこれも同じように潜る。

Java

1 private void buyShow() { 2 // 商品番号やら商品名やらを出力 3 System.out.println(" 商品Nо.は " + num + " です。"); 4 System.out.println("   商品名 " + name + " です。"); 5 System.out.println("  商品価格 " + price + "円 です。"); 6 }

となっています。

では、それぞれの変数(引数)を確認してください。

Java

1// フィールド 2 private int num; 3 private int price; 4 private String name; 5 6// Item.taxShowメソッド 7 public void taxShow( String name, int num, int price, int tax) { 8 buyShow(); 9 int tvalue = price + (price * (tax/100)); // ← ① 10 System.out.println("   消費税 " + tax + " %です。"); // ← ② 11 System.out.println("税込商品価格 " + tvalue + " 円です。"); // ← ③ 12 }

にある、①~③に出てくる変数 { price, tax, tvalue } とはそれぞれなんでしょうか?
どこで宣言されているものですか?
基本的に近くの宣言がその変数の宣言です。メソッド内で使われているなら、
一番近いのは通常の変数宣言(ローカル変数)、そこに無いなら引数、引数としても定義されてないならフィールド、フィールドにもないならstaticなフィールド、そこにも無いならエラー…みたいな感じですね。
(C言語みたいにstaticなフィールドが無い場合はグローバル変数だったりするけど)

今回のtaxShowメソッドのそれぞれの変数をみると、tvalue以外はローカルでは宣言されていません。
tvalueだけはローカル変数 ( int tvalue = price + ...;と宣言と同時に計算して初期値を設定しているから )

ではこのpriceとかは? 仮引数として宣言されていますね。なので仮引数としての変数。

で、Item.buyShowメソッドでは?

Java

1 private void buyShow() { 2 System.out.println(" 商品Nо.は " + num + " です。"); // ← ④ 3 System.out.println("   商品名 " + name + " です。"); // ← ⑤ 4 System.out.println("  商品価格 " + price + "円 です。"); // ← ⑥ 5 }

の④~⑥で使われている{ num, name, price } は?

ローカル変数としても宣言されていないのでローカルではない。
引数としても…宣言されていないので引数でもない。
フィールドとして…ああ、確かにありますね。
じゃあ、これを表示しましょうか。

でも待ってください。このフィールドって初期化されていますか?
言語によっては整数系( int, long 等 )は0で、文字列は"" (あるいはnull)で初期化されていることがありますが、
今回はその値は正しいですか?
違いますよね?

ではどこでフィールドとしてのprice等が初期化されているのでしょうか?

こういう場合は仕様にもよりますけど、「コンストラクタを用意してそれで設定する」か「get/set系のメソッドを用意してそれで設定する」か、「taxShowメソッドのようなメソッドで初期化してから呼び出す」とかですね。

投稿2022/06/05 03:03

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問