2013年9月14日土曜日

staticフィールドってなんぞー

VC++で挫折して以来触ってこなかったオブジェクト指向言語ですが,
Androidでのソフト開発も、ちゃんとJavaを理解してないとサンプルコードが解読できない!
OpenGLみたいな高度なAPIだとなおさら混乱混乱.

AndroidのContextの扱い方でエラーとか警告とか出まくったので,
もう初心のつもりで基本から.クラスのstaticフィールドの実験.



・人を表すクラス testclass1 を作って、そのコンストラクタの引数で物を受け取ることで、人が実体化した時にリンゴとかゴリラ等の物を持った状態で生まれてくる(謎).
・実体化した人はおのおの通し番号を持っていて、その数の計上はtestclass1のメンバ変数tc1_yに格納することにした.
・tc1_yはstaticであると同時にprivateにしていることで、外部からは勝手に数をいじられないようにした.
・数を知りたい時はtestclass1さんが総数を教えてくれるpublicなstaticメソッドnumofthis()を呼べばよい.
・あと,実体化した人が自分の番号と持ち物を教えてくれるsaymynumber()メソッドとmatchmyitem()メソッドを装備.

TestCode.java
public class TestCode { //メインクラス

    public static void main(String[] args){
    
        final int numb = 4;
        final String[] nlist = {"りんご","ごりら","らっぱ","ぱいなっぷる"};
        
        testclass1 minstance[] = new testclass1[numb];
    
        for (int i=0; i<numb; i++){
            minstance[i] = new testclass1(nlist[i]);    
        }    
        
        System.out.println(testclass1.numofthis() + "人作ったよ~");

        System.out.println("『番号!!』");
        for (int i=0; i<numb; i++){
            minstance[i].saymynumber();    
        }    

        System.out.println("『ごりら持ってるやつ~』");
        for (int i=0; i<numb; i++){
            minstance[i].matchmyitem("ごりら");    
        }    
    }
    
}

class testclass1{
    private int mynumber;
    private String myitem;
    
    private static int tc1_y = 0; //testclass1界隈で共用の通し番号

    testclass1(String mono){ //コンストラクタ
        tc1_y++;
        System.out.println("testclass1の" + tc1_y + "番目のインスタンスが" + mono + "を持たされてこの地に生を受けたよ~");
        this.mynumber = tc1_y;
        this.myitem = mono;         


    }
    
    public static int numofthis(){
        return tc1_y;
    } 
    
    public void saymynumber(){
        System.out.println(mynumber + "!");
    }

    public void matchmyitem(String mono){
        if(myitem==mono){
            System.out.println(this.mynumber + "番「はい!」");
        }
    }
}

出力結果:
testclass1の1番目のインスタンスがりんごを持たされてこの地に生を受けたよ~
testclass1の2番目のインスタンスがごりらを持たされてこの地に生を受けたよ~
testclass1の3番目のインスタンスがらっぱを持たされてこの地に生を受けたよ~
testclass1の4番目のインスタンスがぱいなっぷるを持たされてこの地に生を受けたよ~
4人作ったよ~
『番号!!』
1!
2!
3!
4!
『ごりら持ってるやつ~』
2番「はい!」

・クラスのメンバにstaticな変数を宣言すると、そのクラスの「staticフィールド」に変数が確保される.
staticフィールドはインスタンスに帰属するのではなくてクラスに帰属する.
・tc1_yをpublicにして外から参照しようとした場合,minstance[0].tc1_y のようにインスタンスからstaticフィールドにアクセスしようとすると,
"The static field  should be accessed in a static way"
(staticフィールドにはstaticにアクセスする必要があります) 
などとエラーになる.
なので,testclass1.tc1_y のようにクラスから参照するのが正解.

0 件のコメント :

コメントを投稿