Javaベース:Staticキーワードの使用

3105 ワード

Staticキーワード
一.概念
staticで最も一般的な機能は、クラスの属性とメソッドを修飾し、クラスのメンバー属性とメソッドにすることです.通常、staticでメンバーを修飾することをクラスメンバーまたは静的メンバーと呼びます.
1.static変数
static変数は静的変数とも呼ばれ、静的変数と非静的変数の違い:静的定数はメモリにあり、クラスが初めてロードされたときにのみ初期化されます.静的変数ではなく、オブジェクトの作成時に初期化されます.
注意1:初期化のタイミングは異なり、クラスメンバー変数はクラスロードプロセスで初期化され、オブジェクトメンバー定数はオブジェクトを作成するときです.
注2:非静的メソッドでは静的定数は定義できません.
2.staticメソッド
static修飾メソッドの内部では非静的メソッドを呼び出すことができず、非静的メソッドの内部では静的メソッドを呼び出すことができる.また、staticメソッドは、オブジェクトが作成されていないことを前提に、クラス自体だけで呼び出すことができます.
理解:オブジェクトが作成されていない場合、クラスを使用してメソッド/変数を直接呼び出します.静的定数と静的メソッドは、オブジェクト、依存クラスに依存しません.非静的定数および非静的メソッドはオブジェクトに依存するため、クラスメソッドではオブジェクトメソッドとオブジェクトメンバー変数を呼び出すことはできません.オブジェクトメンバー変数およびオブジェクトメソッドは、クラスメンバー変数およびクラスメソッドを呼び出すことができます.
注意:よくあるmainメソッドはstaticメソッドです.mainオブジェクトを作成せずにmianメソッドを直接呼び出すことができます.
3.静的ブロック
statiは、プログラムのパフォーマンスを最適化するために静的コードブロックを修飾するために使用される.staticはクラスのどこにでも配置でき、クラスには複数のstaticブロックがあります.クラスが最初にロードされると、staticブロックの順序で各staticブロックが実行され、1回のみ実行されます.
public class Number {
private int i;
public Number(int i){
	this.i=i;
}
/*
 *          ,            m,n    。
 */
public void isBornBoomer(){
int m = 5;
int n =10;
if(i>5 & i<10){
	System.out.println("    5  10");
}
}
public static void main(String[] args) {
	Number p =new Number(8);
	p.isBornBoomer();
}
}

静的ブロックで最適化:
public class StaticNum {
	private int i;
	private static int m;
	private static int n;
	/*
	 *     ,              ,  JVM。
	 */
static{
  m=5;
  n=10;
}
public StaticNum(int i){
	this.i=i;
}
public void BooleanNumber(int i){
	if(i>StaticNum.m & StaticNum.n<10){
		System.out.println("      ");
	}
}
	public static void main(String[] args) {
		
StaticNum  snum =new StaticNum();

sum.BooleanNumber();
	}
}
静的ブロックの使用:メモリの使用を繰り返すことを避けるためによく使用される変数があり、プログラムが終了するまで静的ブロックを使用して一度にロードし、一度だけ実行します.
4.面接問題
public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}

出力結果は何ですか?D
A.0
B.1
C.2
D.コンパイル失敗
解析:aMehtodという非静的方法で静的定数を定義し,コンパイルエラーである.
次のどちらが正しいか(D)
Aインスタンスメソッドは、スーパークラスのインスタンスメソッドを直接呼び出すことができる
Bインスタンスメソッドはスーパークラスのクラスメソッドを直接呼び出すことができる
Cインスタンスメソッドは、他のクラスのインスタンスメソッドを直接呼び出すことができる
Dインスタンスメソッドは、本クラスのクラスメソッドを直接呼び出すことができる
解析:
インスタンスメソッド:staticによって修飾されていないメソッド;
クラスメソッドクラスメソッド:staticによって修飾されるメソッド
Aインスタンスメソッドでは親のインスタンスメソッドを直接呼び出すことはできません.親のオブジェクトを作成して呼び出す必要があります.
B親クラスのクラスメソッドprivate修飾ではクラスのインスタンスメソッドに呼び出されません.static修飾のメソッドと変数はアクセス権限を変更できません.private修飾のメソッド定数は、依然としてプライベートです.
Cインスタンスメソッドでは親のインスタンスメソッドを直接呼び出すことはできません.親のオブジェクトを作成して呼び出す必要があります.
Dでいいです.
この問題は次のとおりです.
1.インスタンスメソッドはオブジェクトに依存し、クラスメソッドはクラスに依存する.
2.static修飾の方法でprivate publicなどの権限は変更されません.privateで修飾されているのは、依然として本クラスのみ使用できます.
クラスメソッドでは、オブジェクト変数()を直接呼び出すことができます.
 Aエラー
 Bが正しい
Aエラークラスメソッドではオブジェクトの変数を直接呼び出すことはできません.newがオブジェクトを呼び出すと呼び出すことができます.