こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- javaのメンバ ・Static(静的)について知りたい方
この記事を読むと
メンバ変数やメンバメソッドの使い方
static変数やstaticメソッドの使い方
が分かります。
メンバとは?
メンバとはクラスの直下に記述された変数やメソッドのことです。
それぞれ、メンバ変数、メンバメソッドと呼ばれます。
図を示します。
メンバ変数とローカル変数
メンバ変数はクラス直下に記述します。
クラスブロック内で宣言された変数のことを別名フィールドとも呼ばれます。
メソッドはフィールドとは呼ばれません。
あくまでもメンバ変数の宣言のことです。
メソッド内に書かれた変数をローカル変数といいます。
メンバメソッド
クラス直下に書かれたメソッドをメンバメソッドといいます。
クラスは属性と操作をもつ
オブジェクト指向ではクラスは「属性」と「操作」を持ちます。
- 属性とはメンバ変数のこと
- 操作とはメンバメソッドのこと
です。
メンバ変数の種類
メンバ変数は下記二種類に分類されます。
- static変数・・・クラスに対して存在する変数
- インスタンス変数・・・オブジェクトごとに存在する変数
です。
インスタンス変数
変数の宣言方法は
データ型 変数名;
です。
格納される値はインスタンスごとに異なるため、変数名のみ指定します。
thisは自分自身を呼び出す変数
メンバ変数を使用する際には
this.変数名
と記述します。
メンバ変数はメンバメソッド内で使用することが多いですが、
もし変数名が同じローカル変数が存在した場合はローカル変数が優先されます。
そのため、メンバ変数を使用する際は明示的にthisを用いることで、
同名でのバグを防止でき、メンバ変数が使われていることも視覚的に分かります。
メンバ変数を記述する場合は明示的にthis.変数名としましょう。
static変数
static変数はクラス上に準備される変数のことです。
クラス変数とも呼ばれます。
構文
static データ型 変数名;
インスタンス変数はインスタンスごとに別の値が格納されますが、
staticを宣言するとクラスが変数をもち、インスタンスで変数を共有することが出来ます。
変数が生成されるタイミングが異なる
インスタンス変数はクラスをnewするタイミングでメモリが確保されますが、
static変数はnewをしなくてもメモリが確保されるため変数を使用することが出来ます。
staticメソッド
staticはメソッドにも付けることが出来ます。
考え方はstatic変数と一緒で、インスタンス生成前にメモリの領域が確保されます。
mainメソッドにはstaticの記述がありますが、
インスタンスを生成しなくても使用出来ていたと思います。
使用できていたのはstaticのおかげです。
staticメソッドからインスタンス変数は使用できない理由
staticメソッドからインスタンス変数は使用出来ません。
その理由はメモリ領域の確保の順番を考えればわかります。
static変数はインスタンスの作成前からメモリ領域は確保されています。
インスタンス変数はインスタンスが作成されてから領域が確保されます。
そのため、staticメソッドのメモリ領域が確保されてもインスタンス変数はnewするまでメモリに領域が存在しないためエラーになります。
staticメソッド内でインスタンス変数を使用するには
メソッド内でインスタンスを生成しておく必要があります。
サンプルプログラム
スタティックメソッドを呼び出す構文
クラス名.メソッド名();
dispメソッド内でnameインスタンス変数を使用しようとするとエラーになります。
そのため、staticメソッド内でインスタンスを生成してnameインスタンス変数を使用しています。