クラスメソッドについて

このQ&Aのポイント
  • Kakeibo クラスにあるsyojikin(初期値0)をprivate フィールドとし、その代わりにクラスメソッドshowSyoji(戻り値、引数無し)を用意して、下記のプログラムを作成したのですがクラスメソッドのshowSyojiがうまく回りません。
  • これはもしかしてクラス変数も必要なのですか(privateもつけて)?
  • また、このプログラムはどのようなプログラムになるのですか?
回答を見る
  • ベストアンサー

クラスメソッドについて

Kakeibo クラスにあるsyojikin(初期値0)をprivate フィールドとし、その代わりにクラスメソッドshowSyoji(戻り値、引数無し)を用意して、下記のプログラムを作成したのですがクラスメソッドのshowSyojiがうまく回りません。これはもしかしてクラス変数も必要なのですか(privateもつけて)?また、このプログラムはどのようなプログラムになるのですか? class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; private int syojikin; private Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; syojikin = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(sy>=0 && sh>=0){ year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; } else{ System.out.println("入力した金額は無効です。"); } } public static void showSyoji() { System.out.println("所持金:"+syojikin+"円"); } public void showData() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); } } class KNO5 { public static void main(String args[]) { Kakeibo.showSyoji(); //Kakeibo kakeibo1 = new Kakeibo(); //kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, -5000, 300); kakeibo3.showData(); Kakeibo kakeibo4 = new Kakeibo(2010, 11, 7, 0, 1000); kakeibo4.showData(); Kakeibo kakeibo5 = new Kakeibo(2010, 11, 18, 100, 800); kakeibo5.showData(); Kakeibo.showSyoji(); } }

  • aw345
  • お礼率2% (1/48)
  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; // private int syojikin; private static int syojikin = 0; private Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; // syojikin = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if (sy >= 0 && sh >= 0) { year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; syojikin = syojikin + sy - sh; //add } else { System.out.println("入力した金額は無効です。"); } } public static void showSyoji() { System.out.println("所持金:" + syojikin + "円"); } public void showData() { System.out.print(year + "年" + month + "月" + date + "日:収入" + syunyu + "円、支出" + shisyutsu + "円\n"); } } class KNO5 { public static void main(String args[]) { Kakeibo.showSyoji(); // Kakeibo kakeibo1 = new Kakeibo(); // kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, -5000, 300); kakeibo3.showData(); Kakeibo kakeibo4 = new Kakeibo(2010, 11, 7, 0, 1000); kakeibo4.showData(); Kakeibo kakeibo5 = new Kakeibo(2010, 11, 18, 100, 800); kakeibo5.showData(); Kakeibo.showSyoji(); } }

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「クラスメソッドのshowSyojiがうまく回りません」とはどういう意味でしょうか? また, 「これはもしかして」以降はあなたが何をどうしたいのかによるので, これでは答えることは不可能です.

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

複数インスタンスでひとつの値を使いたいならクラス変数(static)にしないとダメです。 mainメソッドでインスタンス化するたびに所持金は0になりますよ。 っていうかkakeibo2のsyojikinと、kakeibo3のsyojikinは全く別物です。 こういう課題なのでしょうが、設計がおかしいんじゃないかと思います。 なんの返事もないし、ちゃんと読んでるのかもわからんのに真面目に回答している自分が不思議だ・・w

関連するQ&A

  • 全く分かりません(2)

    下記で作成したプログラムで、「オーバーロードするコンストラクタでは、まずK1で作成したコンストラクタを呼び出す」のにthis()を使ったのですが、うまく回りませんし、「その後収入及び支出が0 以上か判断し、満たしていなければエラーメッセージを出力し、日付、収入、支出に値を入力しないようにする。満たしていれば引数の値を代入する。」のif~else文を使っても別の実行になってしまいます。どのようなプログラムにしたら、      0 年0 月0 日 : 収入0 円, 支出0 円      2010 年12 月1 日 : 収入3000 円, 支出500 円      入力した金額は無効です。      0 年0 月0 日 : 収入0 円, 支出0 円 になるのですか?至急連絡をお願いします。 class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; public Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(sy>=0 && sh>=0) year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); System.out.println("入力した金額は無効です。"); } public void showData() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); } } class KNO { public static void main(String args[]) { Kakeibo kakeibo1 = new Kakeibo(); kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(); kakeibo3.showData(); } }

    • ベストアンサー
    • Java
  • まったくわかりません

    Kakeibo クラスに対し、さらに日付、収入、支出に最初から値を入力するコンストラクタ(引 数:year, month, date, syunyu, shisyutsu の順)をオーバーロードするプログラムで、下記のプログラムを「収入及び支出が0 以上か判断し、満たしていなければエラーメッセージを出力し、日付、収入、支出に値を入力しないようにする。満たしていれば引数の値を代入する。」と「main クラス内でKakeibo クラスの変数kakeibo2 を追加し、課題2 で追加したコンストラクタにより日付と収入、支出を入力し、その内容をテスト1で作成したshowData を用いて表示する。さらにKakeibo クラスの変数kakeibo3 を作成し、無効な日付を入力し、showData を用いて表示する。」ということを入れて作成したのですが、  入力した金額は無効です。        入力した金額は無効です  0 年0 月0 日 : 収入0 円, 支出0 円 →。2010 年12 月1 日 : 収入3000円, 支出500円 になります。なぜこのようなことが起こるのですか? class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; public Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(syunyu>=0 && shisyutsu>=0) year = y; month = m; date = d; syunyu = sy; shisyutsu = sh;   System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支                   出"+shisyutsu+"円\n"); System.out.println("入力した金額は無効です。"); } public void showDate() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支                   出"+shisyutsu+"円\n"); } } class K { public static void main(String args[]) { Kakeibo kakeibo2 = new Kakeibo(); kakeibo2.showDate(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo3.showDate(); } }

    • ベストアンサー
    • Java
  • 所持金の計算式とその表示の仕方

    下記で作成したプログラムで、Kakeibo クラスに、正しい日付で入力された収入と支出に基づいて計算される所持金を表すクラス変数 syojikin を初期値0 で用意したのまでは設定したのですけど、収入と支出に基づいて所持金を計算する計算式がわかりません。どのような例があるのですか? また、main クラス内で最初に所持金を表示し、Kakeibo クラスの変数kakeibo4, kakeibo5 を追加し、この2 つにはコンストラクタにより正常な日付で収入、日付をそれぞれ入力して表示し、最後にまた所持金を表示し、    所持金:0 円    2010 年12 月1 日 : 収入3000 円, 支出500 円    入力した金額は無効です。    0 年0 月0 日 : 収入0 円, 支出0 円    2010 年11 月7 日 : 収入0 円, 支出1000 円    2010 年11 月18 日 : 収入100 円, 支出800 円    所持金:800 円 にはどのようにすればいいのですか?至急連絡をください?。 class Kakeibo { public static int syojikin = 0; private int year; private int month; private int date; private int syunyu; private int shisyutsu; private Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(sy>=0 && sh>=0){ year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; } else{ System.out.println("入力した金額は無効です。"); } } public void showData() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); } } class KNO4 { public static void main(String args[]) { System.out.println("所持金:"+syojikin+"円"); //Kakeibo kakeibo1 = new Kakeibo(); //kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, -5000, 300); kakeibo3.showData(); Kakeibo kakeibo4 = new Kakeibo(2010, 11, 7, 0, 1000); kakeibo4.showData(); Kakeibo kakeibo5 = new Kakeibo(2010, 11, 18, 100, 800); kakeibo5.showData(); } }

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • オブジェクトクラスとオーバースライド

    Objectクラスを継承させてオーバースライドさせるプログラムを下記に作成したのですがSandaiクラスのオブジェクトstudent[1]の.student[1].inputNumber("09H999");が「シンボルが見つかりません」とエラーが表示されます。これはどこが足りないのですか?ご連絡をお願いします。 結果   student[0]: 身長: 180.2 cm, 体重: 70.3kg   student[0] はclass Personです   student[1]: 学籍番号:09H999, 身長: 168.3 cm, 体重: 55.2kg   student[1] はclass Sandaiです class Person { private double height, weight; public void inputData(double ht, double wt) { height = ht; weight = wt; } public void showData() { System.out.println("身長: " + height + "cm, 体重:"+ weight + "kg"); } } class Sandai extends Person { private String number; public void inputNumber(String num) { number=num; } public void showData() { System.out.print("学籍番号:"+number+", "); super.showData(); } } class K13_2 { public static void main(String args[]) { Person student[] = new Person[2]; student[0] = new Person(); student[0].inputData(180.2, 70.3); student[1] = new Sandai(); student[1].inputData(168.3, 55.2); student[1].inputNumber("09H999"); for(int i=0; i<student.length; i++){ System.out.print("student["+(i)+"]:"); student[i].showData(); Class c1 = student[i].getClass(); System.out.println("student["+(i)+"]は"+c1+"です。"); } } }

    • ベストアンサー
    • Java
  • 抽象クラス、インターフェイスについて

    少し長いですが、以下にコードを書きました。これでコンパイルすると、13個ほどエラーが出て、何がなんだかわかりません。何が間違っているのでしょうか?よろしくお願いします。ちなみに本を見ながらの独学です。 //のりものインターフェイス interface iVehicle { abstract void show(); } //車くらす class Car implements iVehicle { private int num; private double gas; public Car(int n, double g)) { num = n; gas = g; System.out.println("ナンバー" + num +"ガソリン量" + gas +"の車を作成しました"); } public void show() { System.out.println("車のナンバーは" + num +"です"); System.out.println("ガソリン量は" + gas +"です"); } } //飛行機クラス class Plane extends Vehicle { private int flight; public Plane(int f) { flight = f; System.out.println("便" + flight +"の飛行機を作成しました"); } public void show() { System.out.println("飛行機の便は" + flight +"です"); } } class sample8 { public static void main(String args[]) { iVehicle ivc[]; ivc = new iVehicle[2]; ivc[0] = new Car(1234, 20.5); ivc[1] = new Plane(232); for(int i=0; i<ivc.length; i++){ if(vc[i] instanceof Car) ivc[i].show(); } } }

    • ベストアンサー
    • Java
  • 呼び出し元のクラスのPrint

    クラス内のどこかにデバッグ用のメソッドを埋め込んで それがどのクラスで呼ばれたかPrintしたいのですが 最終的な呼び出し元(クラス、メソッド)を表示するにはどうしたらよいでしょうか? 現在以下のようなものを使っていますが、うまくクラスをたどった表示ができません。 es[2]としても同じです。 private static StackTraceElement[] es = new Exception().getStackTrace(); public static void MyDebugPrint(Object string) { System.out.println("[" + es[1].getClassName() + "] " + string); }

    • ベストアンサー
    • Java
  • 再帰メソッドについて

    いつもお世話になっております。 再帰メソッドについて質問があります。 後述のプログラム実行後、以下の結果が 得られました。 ********** depth = [0] , value = [0] ********** depth = [1] , value = [1] ********** depth = [2] , value = [2] ########## depth = [2] , value = [3] …★ ########## depth = [1] , value = [3] recursionMethod() は3回呼ばれました。 (以下、ソース) public class RecursionTest { private static final int MAX_DEPTH = 2; private static int cnt = 0; private int val =0; public static void main(String[] args) { // 再帰メソッドの呼び出し RecursionTest own = new RecursionTest(); own.recursionMethod(0); System.out.println("\n recursionMethod() は" + cnt + "回呼ばれました。"); } private void recursionMethod(int depth) { // 再帰メソッドが呼ばれた回数をカウントする cnt++; System.out.println("********** depth = [" + depth + "] , value = [" + val + "]"); val++; // パラメータ depth が MAX値に到達したら、return する if (depth++ >= MAX_DEPTH) { return; } // 自分自身の呼び出し recursionMethod(depth); System.out.println("########## depth = [" + depth + "] , value = [" + val + "]"); } } 実行結果の★以降が得られる理由が全く分かりません。 ・return で main() に戻るはずなのになぜ「###~」のログが出力されるのか ・depth の値がなぜデクリメントされるのか (誰がデクリメントの処理をしているのか) そもそも上記の結果を返すことが「メソッドの再帰的呼び出し」ということなのでしょうか? ご教授頂ける方がいらっしゃいましたら、宜しくお願い致します。

    • ベストアンサー
    • Java
  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう