static変数

December 12, 2008,
tags: java php static メンバ変数


このエントリーをはてなブックマークに追加

学校でパーティーというなのテストで不思議に思うところがあったのでしっかりと復習しようとおもって、ソースを書いてみました。

メンバ変数をstaticに必要性がただわからなかったのです。とうかどういう動作をするのかいまいち理解できていない。
ということで、サンプルソースかいてみました。

Sample1.java

class TestA
{
    public static String str = "ポリドッグ";
}

class Sample1
{
    public static void main(String[] args){
        TestA t1 = new TestA();
        TestA t2 = new TestA();

        t1.str = "やまだ";
        System.out.println(t1.str);
        System.out.println(t2.str);
    }
}

Sample1.java実行結果

[polidog@java]$ java Sample1
やまだ
やまだ```

って感じになりました。  
つまりstaticなメンバ変数は、2つインスタンスしても、その二つとも共通の値として保持しているってことになると思います。  
t1っていうTestAクラスとt2っていうTestAクラスをインスタンスした場合にt2の静的メンバ変数strの値を変更したら、t2のstrも値が変更されてしまうって感じです。

いっぽうじゃあstaticにしない普通のメンバ変数にした場合はどうなるか。

Sample1a.java

class TestA { public String str = “ポリドッグ”; }

class Sample1a { public static void main(String[] args){ TestA t1 = new TestA(); TestA t2 = new TestA();

    t1.str = "やまだ";
    System.out.println(t1.str);
    System.out.println(t2.str);
}

}


Sample1a.java実行結果

[polidog@java]$ java Sample1a やまだ ポリドッグ```

今度はt1.strの値を変えてもt2.strは変わらなかった。
この辺がstaticなメンバ変数の動作の特徴かなぁーと。

そして興味本位でPHP5でも書いてみました。
sample1.php

<?php

class TestA
{
        static public  $str = "polidog";
}

$t1 = new TestA();
$t2 = new TestA();
$t1->str = "yamada";

var_dump($t1->str);
print "<br>";
var_dump($t2->str);
print "<br>";
var_dump(TestA::$str);

?>

実行結果

string(6) "yamada"
<br />PHP Notice:  Undefined property: TestA::$str in /var/www/html/sample1.php on line 15
NULL
<br />string(7) "polidog"

どうやらPHP5でstaticなメンバ変数をつかうときは「TestA::$str」見たくしなければいけないようです。
しかもインスタンスするとstatic変数はなくなるぽいので、Noticeでてる・・・。
Javaのstaticとはだいぶ違うような。

staticなメンバ変数についてまとめると。
Javaではインスタンスが何個生成されてもその中で共通として持たせる。
PHPではそもそもインスタンスをしないで使える。

ってところでしょうか?
間違いを見つけた方はどんどん指摘お願いします。

comments powered by Disqus