コース一覧
    Java入門:クラスとオブジェクト
    銀行口座クラス

    Java入門:クラスとオブジェクト

    クラスとオブジェクトの設計を学び、状態と振る舞いを持つJavaプログラムを組み立てられるようにします。

    1
    クラスとオブジェクト
    01. クラスを定義する5分
    02. クラスにフィールドを持たせる12分
    03. クラスにメソッドを定義する5分
    04. インスタンスを作る5分
    05. コンストラクタ5分
    06. this キーワード5分
    07. カプセル化 (private と getter)12分
    08. Person クラスを作る5分
    09. Product クラスで税込価格15分
    10. 銀行口座クラス15分
    11. toString のオーバーライド5分
    12. クラスとオブジェクト クイズ5分
    13. Java 入門 最終クイズ5分

    銀行口座クラス

    呼び終わった瞬間に、途中経過が消える

    これまで書いてきた static メソッドは、呼ばれるたびに白紙から始まります。中で作ったローカル変数は、return した瞬間にすべて捨てられます。

    同じ引数を渡せば必ず同じ答えが返る、というのはとても扱いやすい性質です。ただ、残高のように「前回の続き」を持つものは、この形では表せません。入金してから引き出す、という 2 つの操作をつなぐには、操作と操作のあいだ、どこかが値を覚えていてくれる必要があります。

    覚えていられるのは、new で作った実体の中のフィールドです。カプセル化の回で書いた Player は、体力を private のフィールドで持ち、damage で減らして getHp で読み出すクラスでした。

    Java

    Player p = new Player();
    p.damage(30);
    p.damage(30);
    System.out.println(p.getHp());   // 40

    damage を 2 回呼ぶと、2 回ぶんちゃんと減ります。1 回目の結果が p の中に残っているからです。呼び出しをまたいで値が積み上がっていく ─ これが「状態を持つオブジェクト」です。

    変数に入っているのは、実体ではなく矢印

    状態を持つものを扱うときに、必ず一度は驚くのがここです。配列で先に見ておきましょう。

    Java

    int[] a = {1, 2, 3};
    int[] b = a;
    b[0] = 99;
    System.out.println(a[0]);   // 99

    b を書き換えたのに a が変わりました。int[] b = a; は中身を写したのではなく、a と同じ配列を指す矢印をもう 1 本引いただけだからです。

    自分で作ったクラスもまったく同じです。

    Java

    Player q = p;
    q.damage(10);
    System.out.println(p.getHp());   // 触っていない p も減る

    Player q = p; と書いても、プレイヤーは 2 人になりません。別の実体がほしいなら、new をもう一度呼ぶしかありません。

    解説

    int や boolean は値そのものが変数に入り、配列やクラスから作った実体は矢印が入る。この 2 種類の違いは Java を書くかぎりずっと付いて回ります。「変数を代入したのに、片方を触ったらもう片方も変わった」と感じたら、まずここを疑ってください。

    やってみよう

    右のエディタで bankFlow(int initial, int deposit, int withdraw) を完成させます。口座を 1 つ作り、入金し、引き出し、最後の残高を返す、という一連の流れです。

    Solution の中に入れ子で Account クラスを書きます。残高のフィールドは private にして、入金と引き出しはそれぞれメソッドにしてください。おかしな金額を弾く判定は、呼び出し側ではなくそのメソッドの中に置きます。今回は条件に合わないとき、例外を投げずに黙って何もしない仕様です。どの金額を受け付けるかは課題の要件に書いてあるとおりに揃えてください。

    緑になったら、口座を 2 つ作って別々に入金し、片方の残高だけが動くことを確かめてみてください。ここで new を 1 回しか呼ばずに変数だけ増やすと、さっきの矢印の話が目の前で再現します。

    要件

    1. Solution の中に static class Account を定義し、private int balance フィールドと public Account(int initial) コンストラクタを持たせる
    2. Account に deposit(int amount) / withdraw(int amount) / getBalance() を実装し、deposit は amount > 0 のときだけ、withdraw は amount > 0 かつ amount <= balance のときだけ残高を更新する
    3. Solution.bankFlow(int initial, int deposit, int withdraw) の中で new Account(initial) → deposit → withdraw → getBalance() の順に呼んで最終残高を int で返す

    ヒント

    balance を public にするとカプセル化が崩れて validation の意味がなくなります。必ず private int balance; と宣言し、外部からは getBalance() 経由でだけ読めるようにしてください

    deposit の中で if (amount > 0) を忘れると、deposit(-100) で残高がマイナスに増えてしまい withdraw の validation も無意味になります。負の入金は黙って無視する仕様です

    withdraw は if (amount > 0 && amount <= this.balance) で守ります。残高ちょうどの引き出しは成功させる (== ではなく <= で比較する) のがポイントです

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2025/12/19·更新 2026/08/26

    関連レッスン

    • toString のオーバーライド

      Object クラスの toString をオーバーライドして、自作クラスの中身を読みやすい文字列で表現しよう。

    • クラスとオブジェクト クイズ

      クラス定義 / フィールド / メソッド / コンストラクタ / this / カプセル化を 4 択クイズ 1 問で総復習する章末まとめ。

    • Java 入門 最終クイズ

      Java 入門コース全 7 章 (Hello, Java / 変数とデータ型 / 演算子 / 条件分岐 / 繰り返し / メソッド / 配列とクラス) で学んだ内容を、`クラス` `メソッド` `配列` を横断する総合 4 択クイズ 1 問で総復習する最終レッスン。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • メソッドクラスに属する関数
    • 変数データに名前をつけて参照する仕組み
    • 引数位置引数=順番で渡す。
    • フィールドクラスが持つデータ
    • カプセル化フィールドを private にし getter/setter で守る設計
    • クラスデータと振る舞いを束ねる単位
    • オブジェクトキーと値のペアで構造を作るデータ
    • 配列サイズ固定の同型データの集まり
    main.java
    エディタを読み込んでいます

    メモ

    銀行口座クラス

    ⌘S で保存