#普段からよく目にするJavaの変数修飾子
- public
- private
- static
- final
上記4つのみ対象にしています
##public
-
簡単な説明
どこからでもアクセス可能な変数 -
自分なりの解釈
基本的には明示されていないもの
メンバ変数(フィールド変数)で変数宣言時に外部から参照できる理由は
省略されて見えないだけ
public class Main {
//明示してないがpublic
int a;
//明示してpublic
public int b;
public static void main (String[] args) {
}
}
##private
-
簡単な説明
同一クラスからのアクセスのみ許可 -
自分なりの解釈
簡単な説明の通り、同一クラスからのアクセスのみ許可するもの
外部クラスから参照したい場合は、メソッド経由(getter or setter)で参照が可能
public class Main {
//private変数
//メソッドを経由して外部からアクセスする
private int privateVariable;
//public変数
//外部からアクセス可能
public int publicVariable;
public static void main (String[] args) {
}
//setterメソッド
public void setPrivateVariable(int privateVariable) {
this.privateVariable = privateVariable;
}
//getterメソッド
public int gettPrivateVariable() {
return privateVariable;
}
##static
-
簡単な説明
静的変数 -
自分なりの解釈
クラスをインスタンス化せずに参照可能な変数。クラス名.変数名で参照可能
また、static変数に値を代入した値は他のインスタンス間でも共有できる
public class Sub {
//非スタティック変数(インスタンス変数とも呼ばれる)
int sampleVariableA = 0;
//スタティック変数(クラス変数とも呼ばれる)
static int sampleVariableB = 0;
}
public class Main {
public static void main (String[] args) {
//Subクラスをインスタンス化
Sub subA = new Sub();
Sub subB = new Sub();
//subAのsampleVariableA(非スタティック変数に +1)
subA.sampleVariableA =subA.sampleVariableA+1;
//1を表示
System.out.println(subA.sampleVariableA);
//subBのsampleVariableAには +1 していない為
//0を表示
System.out.println(subB.sampleVariableA);
//sampleVariableBはインスタンス化していない
//sampleVariableB(スタティック変数)に +1
Sub.sampleVariableB = Sub.sampleVariableB+1;
//スタティック変数は共有しているので下記の3つは全て同じく1と表示する
System.out.println(Sub.sampleVariableB);
System.out.println(subA.sampleVariableB);
System.out.println(subB.sampleVariableB);
}
##final
-
簡単な説明
値の変更ができない変数 -
自分なりの解釈
finalで宣言された変数に対しては一度だけしか値を代入することができない為、
定数として扱われる。
また、Javaの命名規則により
すべて大文字
複合文字の場合は区切りをアンダースコア "_" で結合。(スネークケース記法)
で宣言する
public class Main {
public static void main (String[] args) {
//定数として宣言
final int SAMPLE_CONSTANT_A = 1;
//一度だけしか値を代入することができない為
//↓下記はコンパイルエラーとなります!!
SAMPLE_CONSTANT_A = 2;
//定数として宣言
final int SAMPLE_CONSTANT_B;
//後から値を代入することもできる
SAMPLE_CONSTANT_B = 1;
}
}
##最後に
- protected 同一クラス、同一パッケージ、サブクラスからのアクセスを許可
- transient オブジェクトがSirialization時には情報として含まない
そのほかにも上記、が変数修飾子としてそんざいしますが、自分がこれまでに触れる機会が少なかったので、自分なりの解釈は一旦今回は省きます。