一番かんたんなJava入門

これからJavaを始めようという人の為の超入門サイトです。丁寧、簡単にこだわった解説なので初心者にぴったりです。

【Java】 メンバ変数って何?

time 2013/06/22

sponsored link

メンバ変数とは?

 前回、Humanクラスを書いて、それをnewすることでHumanオブジェクトを作りました。Humanクラスはこんなのでした。

Human.java

public class Human{
	String name;
        int birthday;
}

 このHumanクラスが、Humanオブジェクトの設計図・テンプレート・金型みたいなものです。Humanオブジェクトはnameとbirthdayというパラメータを持っています。オブジェクトが持つパラメータのことを、このクラスのメンバ変数と言います。Humanクラスはnameとbirthdayという2つのメンバ変数を持っているわけです。

インスタンスのメンバ変数にアクセスする

 それでは 前回、newして作った名前不明・生年月日不明という気持ち悪い人間オブジェクトの名前と生年月日を設定する為に、これらのメンバ変数にアクセスします。と、その前にオブジェクトを作るところをおさらい。

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
		Human human;
                human = new Human();
	}
}

 ↑Human型の変数humanを宣言して、その変数humanにnewして作ったオブジェクトを代入しました。これで変数humanをHumanオブジェクトとして扱うことができます。では変数humanのメンバにアクセスして、そのパラメータの値を入れていきましょう。

オブジェクトを表す変数名.メンバ

 この形でそのインスタンスが持つパラメータにアクセスすることができます。・・おっとさりげなく出してしまいました。「インスタンス」という言葉。これはオブジェクトとほぼ同じ意味です。ただオブジェクトというのが概念的な言葉であるのに対して、インスタンスというのは個別の具体的なオブジェクトを指す時に使うようです。個人的には「元素」と「原子」みたいなニュアンスの違いかな?と思っています。まあ、双方とも指しているものは同じだし、明確に定義されているものでもないみたいなので、違いはニュアンス的な違いだけです。使っているうちにだんだんそのニュアンスは分かってくると思うのでこれからは「インスタンス」という言葉も使います。
 ちょっと脱線してしまいました。Humanクラスのインスタンスであるhumanの名前と生年月日を設定してみましょう。

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
		Human human = new Human();
                human.name = "ノブオ";
                human.birthday = 19770101;
	}
}

 これでhumanは1977年1月1日生まれのノブオという名前の人間を表すインスタンスになりました。
 eclipseを実際使って書いてみた人はお分かりだと思いますが、「human.」と打った時点で勝手にウィンドウが立ち上がりますね。

human3

 このようにそのウィンドウに、次に続けて書ける候補(humanオブジェクトのメンバ)がズラッと出てくれます。その中に「name」「birthday」もありますよね。つまり、eclipseは変数humanがHumanオブジェクトだということを既に認識してくれているわけです。賢いですね、eclipse。ちなみにObjectクラスのメンバメソッドも出てきているのは、Javaでは全てのクラスはObjectクラスを継承しているからでして、「メンバメソッド」や「継承」についてはまたの機会に。。
ついでにもう一人作ってみましょう。2011年1月1日生まれのアヤネちゃんです。

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
		Human human = new Human();
                human.name = "ノブオ";
                human.birthday = 19770101;

                Human human2 = new Human();
                human2.name = "アヤネ";
                human2.birthday = 20110101;
	}
}

 このように、先ほど書いたHumanクラスを元にいくつでもインスタンスを作ることができます。もちろんパラメータの値はそれぞれのインスタンスごとに個別に持つことができます。

 では、今作った二つのインスタンスの中身を出力してみましょう。

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
		Human human = new Human();
                human.name = "ノブオ";
                human.birthday = 19770101;

                Human human2 = new Human();
                human2.name = "アヤネ";
                human2.birthday = 20110101;

                System.out.println("1人目");
                System.out.println("名前:" + human.name);
                System.out.println("生年月日:" + human.birthday);

                System.out.println("");

                System.out.println("2人目");
                System.out.println("名前:" + human2.name);
                System.out.println("生年月日:" + human2.birthday);
	}
}

 これで、HumanTestクラスを実行すると、Humanオブジェクトを2つ作ってそれぞれの内容を画面に出力してくれる状態になりました。ではこのプログラムを実行してみましょう。コマンドプロンプトからJavaプログラムを実行する時はJavaファイルをコンパイルして、出来たクラスを実行していましたが、eclipseでは、プロジェクトを実行すると、そのプロジェクト内に複数のクラスがあっても自動的にmainメソッドのあるクラス(HumanTest)を見つけて実行してくれるので、クラスを指定して実行するのではなくプロジェクトを実行するようにしましょう。

human4

 出ました。eclipseで実行した場合、出力結果はコンソールという欄に出ます。
 本当はint型のbirthdayの値(19770101等)をごにょごにょして”1977年1月1日”とかっていうStringにしてから出力した方が格好いいですが、ここでは省略させてください。。そもそもbirthdayをString型で宣言して”1977年1月1日”という値で保持してもいいのですが、それではもし複数のインスタンスから一番歳上の人を探したり、年齢順にソートしたりという作業をする時に面倒ですよね。
 まあ、そんな枝葉の話は横へ置いといて、インスタンスのメンバにアクセスする

オブジェクトを表す変数名.メンバ

という基本的な部分を抑えておきましょう。
 次回は、メンバメソッドついてやります。メンバメソッドというのは言わば”オブジェクトの振舞い”です。そのオブジェクトの持つ「パラメータ」を定義するのがメンバ変数、「振舞い」を定義するのがメンバメソッドです。

sponsored link

Androidアプリを作ろう

コメント

  • メンバ変数とフィールドの違いはなんでしょうか。
    どちらもクラスブロック内で宣言された変数ということで変わりはないのでしょうか?
    よろしくお願いいたします。

    by 匿名 €2015/06/01 15:34

  • おっしゃる通りです。
    なんとなくニュアンスが違うけど、指してるのは同じものです。

    by Nobuo@管理人 €2015/06/02 00:44

  • 申し訳ありません、最後のHumanTest.javaのコードについての質問があります。
    それを参照してコードを書いたのですが、コマンドプロンプトでコンパイル時

    「HumanTest2.java:3: エラー: シンボルを見つけられません
    Human human = new Human();
            ^                    」
    「HumanTest2.java:3: エラー: シンボルを見つけられません
    Human human = new Human();
             ^ 」

    といった感じのエラーが出てしまいました。
    その後、そちらのをコピペして試したのですが、同じエラーが出ました。
    自分ではこれ以上分かりそうにありません、どうすれば改善しますでしょうか?
    eclipseの使用の有無は関係ありませんよね?

    by 匿名 €2015/08/02 16:26

  • 上のコメントをした者ですが訂正です。

    「HumanTest2.java:3: エラー: シンボルを見つけられません
    Human human = new Human();
    ^                    」
    「HumanTest2.java:3: エラー: シンボルを見つけられません
    Human human = new Human();
             ^ 」

    「^」マークがずれていました。「Human human」の先頭のHの部分と、「new Human」のHでエラーが出ます。
    何度も申し訳ありません、よろしければご教示願います。

    by 匿名 €2015/08/02 16:29

  • 上で質問した者です。
    解決いたしました。

    一人で何度もコメント欄を汚してしまい申し訳ありませんでした。
    これからも運営等頑張ってください。

    by 匿名 €2015/08/02 17:58

  • by 匿名 €2015/08/03 13:39

down

コメントする



CAPTCHA


一番かんたんなJava入門

Androidアプリの作り方

忘備録

私の作ったAndroidアプリ

私の作ったWordPressテーマ

プロに教わるオンライン学習

管理人

Nobuo_CREATE

Nobuo_CREATE

WordPressテーマPrinciple、マテリアルを作ったり、Androidアプリを作ったり、Java入門サイトを作ったり、本を書いたりしています。どうぞよろしく。 [詳細]



sponsored link

オススメ書籍

[オススメpoint]

 この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。
 無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)

[オススメpoint]

 ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Java上級者を目指すなら必読の一冊!

只今、急拡大中

ゲームを作りたい人専門

個人フットサル予約サイト

ガチ専門

JavaからのRuby on Rails入門

JavaからのRuby on Rails入門