Javaの基本:staticキーワード静的の包括的な理解

I.定義:

静的プロパティの表現キーワード/修飾子

ROLE

1.役割:共通、共有

直接言うのすべてのオブジェクトで共有することができ、静的なコンテンツを変更することがあることを意味「普通は、共有、」我々は一例で説明するために、より抽象的かもしれ..:

たとえば、
名前:ジョー・スミス国籍:中国
名:ジョン・ドウ国籍:中国

国籍は、スタティックを使用して変更することができます

2.の理由

この効果は、分析の原因となることができます:

  • Java(登録商標)、任意の変数/タイムコードメモリ、自動的にコンパイル時にシステムメモリに割り当てられています。
  • 静的変数をコンパイルした後、割り当てられたメモリは、常にこのメモリ空間を解放するプログラムが終了するまで存在します。
  • クラスがロードされると、JVMは&あり、このクラスのこのクラスのすべてのインスタンスによって共有されるメソッド領域に変数を静的であろう。

III。使用

静的静的修飾子を適用することができる:クラス、コードブロック、方法変数&

1.静的クラス

  • 静的な内部クラスとして定義され、静的なキーワードを変更、使用

すなわち:
としても知られている静的クラス:静的内部クラス
そのような独立した存在、形態及びクラス内外外部関係、実際にはない、本質的にそれ自身を隠すために

  • &の使用に関連する特定のルール
/**
 * 1. 静态类的方法 = 静态 / 非静态
 *    (静态方法可在外层通过静态类调用,而非静态方法必须要创建类的对象后才能调用)
 * 2. 只能引用外部类的静态变量(static,即类变量)
 * 3. 注:
 *       a. 默认不持有外部类引用、使用不依赖于外部类(与外层类无绑定):即使无创建外层类的对象,它一样存在
 *       b. 若一个内部类不是被定义成静态内部类,那么其成员变量 / 方法不能被定义成静态
 *       c. 静态内部类 & 非静态内部类在创建时有区别,下面会详细说明
 */

// 外部类
public class A {  
    // 静态内部类
    public static class B{  
    }  
    // 非静态内部类(即 普通)
    class C{  
    }  
}  

// 静态内部类b & 非静态内部类c   创建时的区别:
A a=new A(); 
A.B b=new A.B(); 
A.C c=a.new C();
  • 静的な内部クラスと内部クラスとの違い

ここに画像を挿入説明
(ビューをクリックすると拡大します)

  • 特別な注意が
    Aクラスではないでしょう、その内部にロードされながら、クラスをロードします。
    。クラスのB時間がロードされている:それは静的メンバ(静的フィールド、構造、静的メソッド)が呼び出されたときにのみ場合と

2.静的コードブロック

  • 定義:
    クラスをロードするための最終ステップ1(クラス初期化)クラスローダ、文のセットは(クラスのコンストラクタを実行は)中で実施される必要があります

追加命令

①クラスの初期化=本当に始めたクラスは、Javaコードを定義する=実行クラスのコンストラクタ()
②()のブロック合併のすべてのクラス変数&静的ステートメントのステートメントのために収集クラス割り当て操作にコンパイラによって自動的に=
クラスと③コンストラクタ(つまり、インスタンスコンストラクタは、())(異なります)()仮想サブクラスの実施を確保するための機会、親クラスは、()が既に行われている前に、明示的に、親クラスのコンストラクタを呼び出すことなく、

  • 特徴:
    クラス独立静的クラスメンバーステートメントブロック内のコードの静的ブロックが、複数存在してもよく、位置を容易に入れることができ、それは、インビボ方法では任意ではなく、JVMの負荷クラスを行うこれらの静的コードブロック場合静的コードはブロックは、それらがクラスに現れる順序で連続して実行する複数のJVMを有し、各コードブロックは、一度だけ実行されます内部の静的メソッドは、のみ(変数やメソッドを含む)他の同様の静的メンバに直接呼び出されますが、直接アクセス非静的クラスのメンバはできませんすることができます。非静的メソッドと変数のために、我々は、使用する前に、クラスのインスタンスを作成する必要があり、静的メソッドは、使用前に任意のオブジェクトを作成していないため。
  • &の使用に関連する特定のルール
/**
 * 1. 代码块 使用 Static修饰
 * 2. 静态块只会在类加载到内存中时执行1次
 *    a. 若有多个static代码块,JVM将按照它们在类中出现的先后顺序依次执行
 *    b. 静态语句块中只能访问定义在静态语句块之前的变量,定义在它之后的变量可以赋值,但不能访问。如下实例所示
 */

 public class Test { 

     // 使用静态修饰的静态代码块
     static{ 
         i=0;  // 給变量赋值,可通过编译. 如果这里改成 int i=0; 下一行代码也是可以通过编译的
         System.out.print(i); // 非法, 提示:“非法向前引用” 
     } 

     static int i=1; 
  
 }
  • 非静的ブロック
    非静的な概念をブロックするために対応する静的コードブロック。

非静的ブロックの実行順序は、メソッドを構築する前に行われ、クラスは、すべての新しい一度実行されます。

免責事項方法:任意の修飾子なし

 {
          //do something
 }

3.静的メソッド

  • 定義:使用静的なキーワードを変更、静的メンバメソッド(とも呼ばれるクラスメソッド)として定義されます
  • &の使用に関連する特定のルール
/**
 * 1. 可直接通过类名调用,也可通过对象实例调用
 *    (属于类,不属于实例)
 * 2. 任何的实例都可调用(方便共享、公用)
 * 3. 只能访问所属类的静态成员变量 & 方法、不能使用this、super关键字
 *   (this = 调用该函数的对象、但由于静态方法可以直接使用类名调用(即可能还没创建对象),所以不可使用this)
 */

// 静态方法的申明
public static void a(int param) {

}

4.静的変数

  • 定義:使用(また、クラス変数、グローバル変数として知られている)の静的メンバ変数として定義され、静的なキーワードの変更、

  • 特徴:
    修飾された静的メンバ変数と、そのクラスのすべてのオブジェクトの独立したメンバメソッド。つまり、それは、クラスの特定の例には、クラスのシェアのすべてのインスタンスに依存しません。限り、クラスがロードされるよう、Java仮想マシンは、ランタイムデータ領域でのメソッド領域クラス名に合わせてそれらを見つけることができるようになります。それは任意のオブジェクトを参照することなく、任意のオブジェクトの作成にアクセスする前に、したがって、静的オブジェクト。

  • &の使用に関連する特定のルール

/**
 * 1. 静态变量在内存中只有1个拷贝:JVM只为静态分配1次内存
 *   a. 全部对象共用这个static关键字修饰的成员变量,方便对象间共享,节省内存
 *   b. 未被static 修饰的成员变量 = 实例变量:每创建1个实例,JVM就会为实例变量分配1次内存,实例变量在内存中可以有多个拷贝(但互相不影响,更加灵活)
 * 2. 可用类名直接访问:在加载类的过程中完成静态变量的内存分配,(也可通过对象实例访问)
 *  (属于类,不属于实例)
 * 3. 非线程安全:因静态变量被类的所有实例共用
 * 4. 局部变量也能被声明为static
 */

// 静态方法的申明
public class A {  

    private static int count = 0;  //静态变量的申明
   
}  
  • 静的変数とインスタンス変数間の差
    ここに画像を挿入説明(あなたが表示する方法をクリックすることができます)

4つの追加情報:

多くの場合においては、静的の使用、彼らは変数名をすることができないため。コール、クラス名のみ。コールは、そのようなシングルトンデザインパターン)

2.会員は、静的修正をしている、より多くの呼び出し。オブジェクトに加えて、それはまた、クラス名によって直接呼び出すことができます呼び出すことができます。フォーマット:クラスの静的メンバーの名前

3.静的メソッド領域(いくつかの書籍を共有領域に変換され、データ領域)ではなく、ヒープメモリに、コンテンツを改変

4.staticの特徴:

  • クラスの負荷と負荷で
  • オブジェクトが存在しているよりも優先されます
  • これらは、すべてのオブジェクトによって共有されています
  • 直接クラス名を使用することができます。コール

5.静的な長所と短所:

長所:
共有データオブジェクトが別のスペースに格納され、省スペースでは、各オブジェクトを格納する必要はありませんクラス名を直接呼び出すことができます...

短所:
ライフサイクルが長すぎる
のアクセス制限には、スタティックアクセススタティックに存在します。

静的メソッド定義する場合6.?
A:内部機能は、非静的データ(特定のデータオブジェクト)へのアクセスを持っていない場合、関数は、静的として定義することができます。

class Person
{
	String name;//成员变量,实例变量。
	
	public void show()
	{
		System.out.println("::::");
	}
	
}

class  StaticDemo
{
	public static void main(String[] args) 
	{
		Person p = new Person();
		p.show();
		
		Person.show();
	}
}

たとえば、show()メソッドの上の人は、非静的データへのアクセスを持っていない。
これは、直接Person.showを()書き込むことができます。

しかし、show()メソッドを変更する場合:

public static void show()
	{
		System.out.println(name+"::::");
	}

ショー(非静的フィールド名にアクセスするための)方法、直接的には書かれていることが提案されています。

        Person p = new Person();
		p.show();

たとえばタンプのためにV.

ここでの例では、面接の書かれた部分では、多くの場合、傾向がある、我々は理解を深めることができ、全体の例を通じて、静的の理解を調べることができます。

package staticblock;
 
public class Parent
{
	//静态代码块,只在类装载的时候执行
	static
	{
		System.out.println("parent static block");
	}
	
	//非静态代码块,每new一次都会执行
	{
		System.out.println("parent non-static block");
	}
	
	public  Parent()
	{
		System.out.println("parent constractor block");
	}
}
package staticblock;
 
public class Child extends Parent
{
	//子类静态代码块
	static
	{
		System.out.println("child static block");
	}
	
	//子类非静态代码块
	{
		System.out.println("child non-static block");
	}
	
	//子类构造方法
	public Child()
	{
		System.out.println("child constractor block");
	}
	
	//静态方法需要在调用 的时候才执行
	public  static void get()
	{
		System.out.println("this is a static method!");
	}
	
	public static void main(String[] args)
	{
		new Child();
		System.out.println("------------------");
		new Child();
		Child.get();
	}
}

次のように印刷結果を実行した後、次のとおりです。

parent static block
child static block
parent non-static block
parent constractor block
child non-static block
child constractor block
------------------
parent non-static block
parent constractor block
child non-static block
child constractor block
this is a static method!

説明:

私たちは、静的コードブロックが2回実行され、静的メソッドを呼び出す必要が実行されるのではなく、静的コードブロックの実装に1回だけ実行されていることがわかります。実行の順序は、静的ブロックサブクラスを実行し、静的ブロック親クラスを実行することである。次いで、非静的ブロックの親クラスを実行し、その後、コンストラクタが実行される親クラス、後に再び非静的ブロックサブクラスを行いますコンストラクタは再びサブクラスが実行されます。実行シーケンス:コードの静的ブロック>ブロック非静的>コンストラクタ。

注意静的の六.Android

静的なライフサイクルの前述の欠点では長すぎる、以下では、この問題に話していましたさ。

1.静的静的静的変数の潜在的な問題:

(1)メモリを占有し、そしてメモリは、一般的に解放されません。

(2)自動的にシステムでメモリを再利用するには、これはグローバルな静的エラーにアクセスするためにつながる、スタティックメモリ状況ではありません。

(3)静的オブジェクトとして静的活性できないように、すべてのコンポーネントのアクティビティオブジェクトがグローバルメモリに保存され、そして回収されないこと。

2. static変数ライフサイクル:

(1)クラスは、どのような時にロードされていますか?

システムはプロセスを作成するときに我々はアプリを起動すると、このプロセスは、責任DVMによって荷役などの、ガベージコレクションや他のもの、のDalvik VMのインスタンスをロードして、DVM上でコードを実行します。すなわち、処理が開始は、クラスがロードされるとき、静的変数は、メモリが割り当てられています。

クラスがアンロードされたとき(2)静的変数は、破壊しました。

クラスは、どのような時にアンロードされますか?

プロセスの終わりに。

説明:通常の状況下では、長いClassLoaderクラスがあるとしてアンロードされないよう、すべてのクラスは、クラスローダがロードされ、デフォルトで、デフォルトのクラスローダは、プロセスのライフサイクルと一致して、この記事では、一般的なケースについて説明します。

(3)のAndroidの処理の終了

これは、コアのPCからアンドロイド異なりするためのプロセスとメモリ管理である - リソースが十分であれば、Androidは別のプロセスがいつでも殺さすることができることを意味し、任意のプロセスを殺すことはありません。アンドロイドは殺されるのプロセスを再起動するための時間に十分なリソースとなります。それは治療しなければ、信頼できるものではありません、メモリ内のすべてが信頼できないと言うことができる、静的変数の値です。あなたが信頼をしたい場合は、NANDがまだSDカードに保存したり、回復を再起動する時に戻って行かなければなりません。

他の場合には、アイコンをユーザがクリックアプリケーション、静的変数に格納された前の値を起動するようにするとき、プロセスを終了するために、すべてのアクティビティの等価を終了することができない、それは動作を空に与えるように特定の状況に応じて、存在が可能です。

(4)アプリケーションが同じ信頼できません

アプリケーションは、実際にはシングルトンオブジェクトであるが、それはすべてクリアされますときにもメモリに、プロセスが殺されているが、Androidのシステムは、アプリケーションを再構築するのに役立ちます、そして我々のデータは、まだ自分自身を持って、自然に消えていたアプリケーションに保存されています処理。

(5)オブジェクトの静的参照は、ガベージされません

限り静的変数が破壊されないも対象となっているセットのnullは、参照を保持して、その参照カウントがゼロにすることはできません、それはゴミが収集されることはありません。したがって、シングルトンオブジェクトは、動作中に回収されません。

さらに読書:Androidのプログラミング、静的変数を使用しての欠点?どのように使用を規制すべきか?

公開された81元の記事 ウォン称賛37 ビュー50000 +

おすすめ

転載: blog.csdn.net/gaolh89/article/details/94591546