はじめに
クラスメソッドを、インスタンス変数とインスタンスメソッドと共に使用するときに注意すべき点をまとめました。
クラスメソッドとは
クラスメソッドは、クラス変数にアクセスすることを主な役割としています。
宣言するときにstatic修飾子をつける必要があります。呼び出すときは以下のようにクラス名を使用します。
(クラス名).(クラスメソッド名)
クラスメソッドと他の変数、メソッドとの関係
以下の説明は、Oracle社のThe JavaTM Tutorialsを引用しています。
- インスタンスメソッドはクラス変数とクラスメソッドに直接アクセスできる
- クラスメソッドはクラス変数とクラスメソッドに直接アクセスできる
- クラスメソッドはインスタンス変数とインスタンスメソッドに直接アクセスできない。アクセスする場合はオブジェクトを参照する必要がある。また、thisキーワードが示すオブジェクトがないため、thisキーワードを使うことができない。
上記の"直接アクセスできる"の意味は、メソッド内の処理において、変数名のみ、またはメソッド名のみで呼ぶことができるという意味です。
具体例
クラスメソッドにて、インスタンスメソッドを呼び出す例を紹介します。
使用するクラスメソッドはmain、インスタンスメソッドはdisplayとします。
mainは文字列型のクラス変数に直接アクセスして、文字列の内容をコンソールに表示します。
displayはコンソールに整数型の引数を表示します。
public class Test{
public static String str = "クラス変数が呼び出されました"; // クラス変数
public static void main(String[] args){ // クラスメソッド
System.out.println(str); // クラス変数に直接アクセス
Test test = new Test(); // Test型のオブジェクトを生成
test.display(5); // インスタンスメソッドにアクセスするために、Test型オブジェクトを参照
}
public void display(int num){ // インスタンスメソッド
System.out.println("数字は" + num + "です");
}
}
Test.javaを実行すると
クラス変数が呼び出されました
数字は5です
となりました。
mainはstatic修飾子がついているので、クラスメソッドです。
displayはstatic修飾子がついていないので、インスタンスメソッドです。
よって、mainからdisplayにアクセスするにはTest型のオブジェクトの参照が必要です。
同じクラスのメソッドを使用するときに、オブジェクトの参照が必要であるのは違和感があります、、、
おわりに
本記事では、クラスメソッド自体の使い方というより、クラスメソッドとインスタンスメソッドの互いのアクセスについて調べました。
その結果、同じクラス内にて、クラスメソッド内でインスタンスメソッドを呼ぶ場合に少し注意が必要でした。
そして、クラスメソッド内でクラス変数に直接アクセス、またインスタンスメソッドを呼ぶ簡単なコードの例を紹介しました。