※ この回答は補足みたいなものです。ただ、この質問の根本的な問題だと思うので回答しておきます。
(↓ 修正依頼の欄にて)
ただ、何故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メソッドのようなメソッドで初期化してから呼び出す」とかですね。