JavaSilverでメモしたところ備忘録として残しておこうと思います。
static修飾子
- クラスをインスタンス化せずに直接メソッドや変数にアクセスするためstaticメソッドを付けたメソッドを"静的メソッド"、変数を"静的変数"と呼ぶ
staticクラス
- 内部クラス(インナークラス)で使用する。インナークラスとはクラス内でクラスを定義すると内部クラスからは外部にアクセスできる、内部クラスにstatic修飾子をつけると外部クラスのstaticなメンバのみにアクセスできるため別のクラスと同じように見える
staticメソッド(クラスメソッド)
- 通常のメソッドはクラスをインスタンス化してから使用するがstatic修飾子を付与したクラスメソッドはインスタンス化なしに直接呼び出して使用できる
//定義
public class Smple {
public static void method() {
int a = 1;
}
//呼び出し
//(クラス名.メソッド名)
Sample.method;
クラス変数(static変数)
- staticキーワード(修飾子)につけて宣言される変数であり、すべてのオブジェクトで共有される。staticがついていない変数を
インスタンス変数
と呼ぶ。違いはstaticがついているかいないか!インスタンス変数はクラスのオブジェクトが生成されたタイミングで作られる変数、クラスのオブジェクトごとに管理されている。オブジェクト(インスタンス)毎に変数が作られる(クラス名.変数名) - 以下のように宣言する
アクセス修飾子 (publicなど) static 型名 変数名
- クラス変数の場合はデータ型を指定して宣言すると初期値が与えられる
整数値のデータ型: 0
float型: 0.0f
double型: 0.0d
文字型: '\u0000'
boolean型: false
参照型(String): null
static変数は暗黙的にfinalとなる
static import
- 従来はstatic変数、メソッドを利用する場合クラス名をつけてアクセスする必要があったが、static importのおかげでstatic変数、メソッドを完全修飾名およびインポートしたいstatic変数やstaticメソッドを指定する
完全修飾名とは「パッケージ名.クラス名」といった正式名称である
[構文]
import static パッケージ名.クラス名.static.変数名;
import static パッケージ名.クラス名.static.メソッド名
import static パッケージ名.クラス名.*
[クラス名まで]
import com.it.sjop.staticTest;
class Sample void main(String[] args){
staticTest.method();//クラス名.メソッド名
[メソッド名まで]
import com.it.sjop.staticTest.method;
class Sample void main(String[] args){
method();//メソッド名
インスタンスメンバとstaticメンバのクラス内でのアクセス
- クラス内で定義したインスタンスメンバは、クラス内で定義したstaticメンバに直接アクセスできる
- クラス内で定義したstaticメンバは、クラス内で定義したインスタンスメンバに直接アクセスすることはできない
class sample {
int instanceVal;
static int staticVal;
int method1(){return instanceVal;} //1.ok
int method2(){return staticVal;} //2.ok
//static int method3(){return instanceVal;} //3.コンパイルエラー
static int method4(){return staticVal;} //4.ok
static int method5(){ //5.ok
sample obj = new sample();
return obj.instanceVal;
}
}
インスタンスメンバ → クラスメンバ //OK
クラスメンバ → インスタンスメンバ//NG
インスタンスメンバをインスタンス化してからならクラスメンバからのアクセスが可能になる