Java-クラス変数とインスタンス変数の違い

1363 ワード

メンバー変数:クラス内、メソッド体外で定義された変数をメンバー変数と呼びます.Javaのメンバー変数は、次の2つに分けられます.
1つはstatic修飾がなく、これらのメンバー変数はオブジェクト内のメンバーであり、インスタンス変数と呼ばれます.
二つ目はstatic修飾があり、クラス変数(静的変数)と呼ばれる.
 
静的変数(クラス変数)には、次の機能があります.
  • クラスのロードに伴って
  • がロードする.
  • は、オブジェクトの存在よりも優先する
  • である.
  • は、すべてのオブジェクトによって共有される
  • である.
  • は、クラス名によって直接呼び出すことができる
  •  
    クラス変数とインスタンス変数の違いは、次のとおりです.
    1、保管場所.
    クラス変数は、クラスのロードに伴ってメソッド領域に存在します.
    インスタンス変数は、オブジェクトが作成されるにつれてスタックメモリに存在します.
    2、ライフサイクル:
    クラス変数のライフサイクルが最も長く、クラスが消えるにつれて消えます.
    インスタンス変数のライフサイクルは、オブジェクトが消えるにつれて消えます.
     
    Javaのメソッド領域の位置は、次の3つに分けられます.
    1、java 7の前に、メソッドエリアはPermGen(PermGen)にあり、永続世代とスタックは互いに隔離されており、永続世代のサイズはJVMを起動する時に固定値を設定することができ、可変ではない.
    2、java 7ではstatic変数が永久代からスタックに移行する.
    3、java 8では、永続世代をキャンセルし、メソッドはメタ空間(Metaspace)に格納され、メタ空間は依然としてスタックに接続されていないが、スタックと物理メモリを共有し、論理的にスタックに存在すると考えられる.
    class Person
    {
    	String name;//    ,    。               
    	static String country = "CN";//       ,   。              
    	public static void show()
    	{
    		System.out.println("::::");
    		//this.haha();//         this   
    	}
    	public void haha()
    	{
    		System.out.println("hahaha...");
    	}
    }
    
    class  StaticDemo
    {
    	public static void main(String[] args) 
    	{
    		
    		Person p = new Person();
    		p.haha(); //        
    		Person.show();//        ,          (   )
    	}
    }
    /*
    hahaha...
    ::::
    */