第十二章 
 〜クラス編〜
 変数のスコープ
 今回は変数のスコープについてやるです。スコープというのは、変数がどこからどこ
まで使用できるかを表す有効範囲のことですね!今言った有効範囲と前に変数について
で説明した有効範囲は別物です。前回の有効範囲は変数の大きさだったですね!
このスコープを理解しておかないと変数の使い方を間違った方向へ使ってしまうです。
それでは、早速サンプルプログラムを見て行きたいと思うです〜
サンプルプログラム12_1
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
class Rei12_1{
    public static void main(String[] args){
        GoukeiKeisan gk = new GoukeiKeisan();

        gk.sum(5, 10);
        int kotae = gk.getAns();
        System.out.println("5〜10までの和は" + kotae + "です");
    }
}

class GoukeiKeisan{
    int ans;

    void sum(int a, int b){
        ans = 0;
        for(int i=a; i<=b; i++){
            ans += i;
        }
    }
    
    int getAns(){
        return ans;
    }
}

 このプログラムは、前回やったプログラムの改良版です。やっていることは、a〜bま
での和、5〜10までを足した合計ですね!そして今回見てもらいたいのは、変数の位置
です。
 まずはmain()メソッドで宣言されているkotae変数から見ていこうと思うです。
このkotae変数はmain()メソッド内で宣言されているのが分かるですね!そして変数の
特徴としては、宣言してからそれ以降使えるはずだったです。でも宣言した変数はどこ
まで使えるのかはまだやってないと思うです実は、宣言されている場所の { が閉じら
れている場所つまり } までの間、変数は使用できるのです。つまりメソッド内で宣言
したら、宣言したところから、メソッドの終了するところまでということですね!
ようするにここで言うと、6行目の宣言し終わってから、8行目の } 前までですね!
 12行目にあるインスタンス変数はとばして、14行目の引数で宣言されている変数は
どうなのかと言うですとこれも同じです。簡単に言うですとこれも宣言されたときの
メソッド内で使用可能です。14行目の宣言後から19行目の } が閉じる前までですね!
 16行目のfor文の中で宣言されているiも同じように考えてほしいです。そうすると
for文の中でのみ使用可能ということです。16行目から18行目の } が閉じる前までと言
うことですね!
 それでは最後に12行目にあるインスタンス変数についての有効範囲を説明するです。
このインスタンス変数というのは、クラスの中でならどこでも扱うことができるのが
特徴です。だから15行目や22行目で使用できたりできるのです〜。結果的には } が閉
じる前までというのと同じですね!(クラスの名前 { から、今説明した } まで)
ただ今までと違うのは、宣言したところから使えるようになるではなくて、クラスの中
のどこで宣言しても使えるようになると言うことです。ちょっと分かりづらいので言い
方を変えるとclass クラス名{の次の行に書く必要はないということです。だから次の
サンプルプログラムのように書くことも可能です。もちろん実行結果も一緒です。
サンプルプログラム12_2
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
class Rei12_2{
    public static void main(String[] args){
        GoukeiKeisan gk = new GoukeiKeisan();

        gk.sum(5, 10);
        int kotae = gk.getAns();
        System.out.println("5〜10までの和は" + kotae + "です");
    }
}

class GoukeiKeisan{
    void sum(int a, int b){
        ans = 0;
        for(int i=a; i<=b; i++){
            ans += i;
        }
    }
    
    int ans;
    
    int getAns(){
        return ans;
    }
}

 さっきと違う場所でGoukeiKeisanクラスのint ansが宣言されているですね!

変数の名前が同じとき・・・
 実は、前回やったメソッドでのサンプルでansという変数が2ヶ所で宣言されていたと
思うです。でも実際それら2つの変数はまったく別物です。もしインスタンス変数と
ローカル変数の名前が一緒だったらどうなるかが今回のここでのテーマです。それでは
サンプルを見て説明して行きたいと思うです。
サンプルプログラム12_3
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
class Rei12_3{
    public static void main(String[] args){
        GoukeiKeisan gk = new GoukeiKeisan();

        gk.sum(5, 10);
        int ans = gk.getAns();
        System.out.println("5〜10までの和は" + ans + "です");
    }
}
    
class GoukeiKeisan{
    int ans;
    
    void sum(int a, int b){
        int ans = 0;
        
        for(int i=a; i<=b; i++){
            ans += i;
        }

        this.ans = ans;
    }

    int getAns(){
        return ans;
    }
}

 まずは、さっき説明した通りですが、6、12、15行目のansはすべて別物です。
そして今回やろうとしているのは、インスタンス変数とローカル変数の名前が重なって
しまったとき、どう区別すればいいのかをやろうとしているプログラムです。
 18行目に出てくるansはいったいどっちの変数なのかと言うですと、これはローカル
変数です〜。理由は、21行目に出てくるthis.ansをみてもらえれば分かるです。もし
ローカル変数でインスタンス変数と同じ名前を付けてしまった場合はインスタンス変数
と区別するためインスタンス変数にはthisをつけるです。本当は、区別するために付け
るのではなく今まで省略していただけなのです。だから今までのプログラムででてきた
インスタンス変数にはthisをつけることができるです。this.インスタンス変数名のよ
うな感じですね!
 だからもし同じ名前をつけたいときで、分かりやすく区別したいときは、かならず
インスタンス変数にthis.をつけてあげればいいですね!
 このthisというのは自分自身のオブジェクト(インスタンス)という意味があるです
だからオブジェクトから変数やメソッドにアクセスするときと似ているんですね!
 これだけ言うともう説明がいらなくなっちゃうかもしれないですが、続きを聞いて欲
しいです。25行目のansはインスタンス変数ですね!そしてこのansはthis.ansと書いて
も全く問題ないということです。


今回のポイント
@ 変数の有効範囲の図を作ってみたです。これがポイントです〜


A インスタンス変数とローカル変数で名前が重なったら、インスタンス変数にthisを
  つける。(元々thisは省略されていた物です)

TOPに戻る   Java講座に戻る