ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】static修飾子、final修飾子、イニシャライザ


修飾子の順番は順不同でいい(基本的にはアクセス修飾子、static、finalと記述されることが多い)

static

インスタンスではなく、クラス名に紐づけて値を保持できる。

Human.java

package jp.suzuki.practice.model;

public class Human {

    //クラス名Humanに紐づけた値
	private static int count = 0;
	//コンストラクタ
	public Human(){
		//インスタンス化されるたびにcountを1増やす
        Human.count++;
	}
	//クラス名に紐づけたメソッド
	public static void getInfo(){
		System.out.println(Human.count);
	}
	
}

practice.java(main)

package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;

public class practice{
    public static void main (String[] args){
      //staticのメソッドなので
      //インスタンス化していなくてもアクセスできる
      Human.getInfo();//0
      //インスタンス化
      Human bob = new Human();
      //コンストラクタによってcountが1増える
      Human.getInfo();//1
    }
}

イニシャライザ

static initializer
クラス変数(staticな変数)を初期化
instance initializer
インスタンス変数(インスタンスごとに作成される変数)を初期化。
インスタンスが生成される前に実行
constractor
インスタンス化の後に実行

各イニシャライザの違い
http://promamo.com/?p=4139

コンストラクタを複数オーバーロードする時、インスタンスイニシャライザに処理を記述しておけば、いちいちコンストラクタに書かなくて良くなる。

package jp.suzuki.practice.model;

public class Human {
	private static int count;
	//staticイニシャライザ
	//(クラスの初期化際の処理)
	static{
		//クラス変数の初期化
		Human.count = 0;
		System.out.println("static initializer");
	}
	//インスタンスイニシャライザ
	//インスタンスされる前に実行
	//(インスタンス初期化の際処理)
	//コンストラクタはインスタンスされる前に実行
	{
		System.out.println("instance initializer");
	}
	
	public Human(){
        Human.count++;
        System.out.println("constractor");
	}
	
	public static void getInfo(){
		System.out.println(Human.count);
	}
	
}
package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;

public class practice{
    public static void main (String[] args){
      //staticのメソッドなので
      //インスタンス化していなくてもアクセスできる
      Human.getInfo();//0
      Human bob = new Human();
      Human.getInfo();
    }
}

実行結果

//staticメソッド呼び出し クラスが初期化
static initializer
0
//インスタンス生成前
instance initializer
//インスタンス生成後
constractor
1

final修飾子

クラス、メソッド、フィールドを変更不可にする

フィールドにつける場合はstaticと併用して値が変更できない変数=定数を定義する。
インスタンスごとに定数を作るより、クラスに紐づけて、一つだけ作ったほうがいいから。)

//継承できないクラス
final class test(){
}
//オーバーライドできないメソッド
public final void SayHi(){

}
//定数を定義
//定数名は慣習的にすべて大文字
private static final double VERSION = 1.2;