1
0

More than 3 years have passed since last update.

Java初心者のつまづき(1)クラス型変数の代入の罠

Last updated at Posted at 2021-05-15

Java初心者のつまづき(1)クラス型変数の代入

この記事を書こうと思ったきっかけ

アウトプットの練習もかねて、Javaを勉強した際につまづいた「クラス型変数の代入」について、まとめておきたいと思います。

クラス型変数を代入するときの注意点

クラス型の変数を同じクラス型の別の変数に代入した場合、
代入されるのは"変数"そのものの値ではなく、"オブジェクト"の参照値になります。

以下のBookクラスでは本オブジェクトを生成し、setBookで本の名前とページ数をセットしています。showBookが呼ばれると本の名前とページ数を画面上に表示します。

Book.java
public class Book {
    // 本の名前
    private String name;
    // ページ数
    private int page;

    public Book() {
        name = "名称なし";
        page = 0;
    }
    /**
    * 本の名前とページ数を設定する
    * @param name
    * @param page
    */
    public void setBook(String name,int page) {
        this.name = name;
        this.page = page;

    }

    /**
    * 本の情報をsysoutして表示させる
    */

    public void showBook() {
        System.out.println("本の名前:"+name);
        System.out.println("ページ数:"+page+"ページ");

    }
}

これをinfoクラスのmainメソッドで呼んでみます。infoクラスでは
①小説 300ページ
②辞典 1000ページ の二冊の本の情報を登録します。

info.java
public class info {

    public static void main(String[] args) {
        // コンパイルテスト
        // System.out.println("Hello!");

        // 本オブジェクトをnewして生成
        Book book1 = new Book();

        // 作ったbook1に小説の情報をセット
        book1.setBook("小説",300);

        // book1の値をnewせずに代入
        Book book2 = book1;

        // book2に辞典の情報をセット
        book2.setBook("辞典",1000);

        book1.showBook();
        book2.showBook();

    }
}

newしたBookオブジェクトbook1に「小説」とページ数300を登録します。
登録には先ほど作ったBookクラスのセッター(setBook)を呼び出します。
その後book2に「辞典」とページ数をnewせずに代入してみましょう。

それぞれの結果をshowBookで表示させてあげると、

実行結果
本の名前:辞典
ページ数:1000ページ
本の名前:辞典
ページ数:1000ページ

はい。両方とも「辞典」になってしまいました。
これはStringクラスのようなクラス型変数では値のそのものではなく、
値が格納されたメモリの場所を変数に渡しているためです。
そのため、新しくBookクラスのオブジェクトbook2をインスタンス化
つまりnewしてあげてから代入しましょう。

info2.java
public class info2 {

    public static void main(String[] args) {
        // コンパイルテスト
        // System.out.println("Hello!");

        // 本オブジェクトをnewして生成
        Book book1 = new Book();

        // 作ったbook1に小説の情報をセット
        book1.setBook("小説",300);

        // Bookクラスのオブジェクト、book2をインスタンス化 ← こう直す
        Book book2 = new Book();

        // book2に辞典の情報をセット
        book2.setBook("辞典",1000);

        book1.showBook();
        book2.showBook();

    }
}

これを実行すると、、、

実行結果2
本の名前:小説
ページ数:300ページ
本の名前:辞典
ページ数:1000ページ

意図する実行結果になりました!

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0