staticとは?
- Javaで変数(フィールド)やメソッドにつける修飾子で、「クラスに属する」「インスタンスを生成せずに呼び出せる」という特徴がある
静的メンバ(static)
- インスタンスの元となるファイル情報を格納しているメモリ領域をクラスオブジェクトという
- クラスオブジェクトではファイル情報の他にフィールドとメソッドを保有することが可能
- フィールドをクラス変数、メソッドをクラスメソッド、合わせて静的メンバという
※ static修飾子をつけることで静的メンバとして扱うことが可能 - クラスオブジェクトは変数名としてクラス名が使われる
- 静的メンバはクラスオブジェクトで管理されるためインスタンス化の際に複製されない
※ クラスで固有、全てのインスタンスで共通のものとして扱われる - インスタンスから自信のものであるかのようにアクセス可能
Dog.java
package src.static;
class Dog {
//定数
public static final SCIENTIFIC_NAME = "Canis familiaris"; //学部名: カニスファミリアーリス
//フィールド
private static int dogNumber = 0;
private static String breed;
private String name;
//コンストラクタ
public Dog(String breed, String name) {
this.dogNumber++;
this.breed = breed;
this.name = name;
}
//メソッド
//getStatusメソッド
public String getStatus() {
return "犬の全頭数:" + this.dogNumber + "/名前:" + this.name + "/犬種:" + this.breed;
}
//getter(dogNumber)
public static int getDogNumber() {
return dogNumber;
}
}
Main.java
public class Main {
public static void main(String[] args) {
// ①Dogクラスのstaticメンバにアクセスできることを確認
System.out.println("①Dogクラスのstaticメンバにアクセスできることを確認");
System.out.println(Dog.SCIENTIFIC_NAME);
System.out.println(Dog.getDogNumber());
// ②Dogよりインスタンス化&フィールドの確認
System.out.println("②Dogよりインスタンス化&フィールドの確認");
System.out.println("1体目");
Dog moco = new Dog("ToyPoodle", "MOCO");
System.out.println(moco.getStatus());
System.out.println("2体目");
Dog choco = new Dog("WelshCorgi", "CHOCO");
System.out.println(moco.getStatus());
System.out.println(choco.getStatus());
System.out.println("3体目");
Dog pochi = new Dog("GoldenRetriever", "POCHI");
System.out.println(moco.getStatus());
System.out.println(choco.getStatus());
System.out.println(pochi.getStatus());
// ③各オブジェクトからstaticメンバへのアクセス確認
System.out.println("③各オブジェクトからstaticメンバへのアクセス確認");
System.out.println("<クラスオブジェクトからアクセス>");
System.out.println(Dog.SCIENTIFIC_NAME);
System.out.println(Dog.getDogNumber());
System.out.println("<インスタンスオブジェクトからアクセス>");
System.out.println(moco.SCIENTIFIC_NAME);
System.out.println(moco.getDogNumber());
}
}
mainにstaticが用いられる理由
public static void main(String[] args){}
- mainメソッドはJVMから呼び出され、プログラム終了まで動作し続ける必要があるため、クラスオブジェクトの生成のみで使用できるようstaticがつけられる