Java初心者のつまづき(1)クラス型変数の代入
この記事を書こうと思ったきっかけ
アウトプットの練習もかねて、Javaを勉強した際につまづいた「クラス型変数の代入」について、まとめておきたいと思います。
クラス型変数を代入するときの注意点
クラス型の変数を同じクラス型の別の変数に代入した場合、
代入されるのは"変数"そのものの値ではなく、"オブジェクト"の参照値になります。
以下のBookクラスでは本オブジェクトを生成し、setBookで本の名前とページ数をセットしています。showBookが呼ばれると本の名前とページ数を画面上に表示します。
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ページ の二冊の本の情報を登録します。
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してあげてから代入しましょう。
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();
}
}
これを実行すると、、、
本の名前:小説
ページ数:300ページ
本の名前:辞典
ページ数:1000ページ
意図する実行結果になりました!