static、final修飾子、内部クラス

4928 ワード

static修飾子:static修飾子は、静的を表す属性、メソッド、および内部クラスとともに使用できます.クラス内の静的変数および静的メソッドは、クラスの静的メンバーにアクセスするためにクラスのオブジェクトを作成する必要がなく、クラス名とともに使用できます.
class StaticText{
    //    
    static int i=47;
    //    
    static void echo(){
        System.out.println("There is a Static Method");
     }
    //    
    StaticText(){
        System.out.println("There is a Constructor");
    }
    //   
    static {
        System.out.println("There is a static block");
    }

}
public class Text { 
    public static void main(String[] args) {
        StaticText A = new StaticText();
        StaticText B = new StaticText();
        //A.i B.i        
        System.out.println(A.i==B.i);
        A.i++;
        //     A.i==B.i
        System.out.println(B.i);
        //           ,              static  ,                 
        System.out.println(StaticText.i);
    }
}

実行結果:There is a static block There is a Constructor There is a Constructor true 48
staticプロパティのメモリ割り当て:1つのクラスでは、1つのstatic変数に1つのメモリ領域しかありません.複数のクラスインスタンスがありますが、これらのクラスインスタンスのこのstatic変数は同じメモリ領域を共有します.
スタティックイニシエータ-スタティックブロック:スタティックイニシエータは、クラス内のメソッドの外側に存在するスタティックブロックであり、クラスのマウント時に一度だけ実行され、通常は静的クラス属性を初期化するために使用されます.
staticの変数は、クラスがマウントされると初期化されます.すなわち、クラスがマウントされる限り、使用するかどうかにかかわらず初期化されます.
staticの基本ルール:
  • クラスの静的メソッドは静的プロパティにのみアクセスできます.
  • クラスの静的メソッドは、非静的メソッドを直接呼び出すことができない.
  • アクセス制御権限が許可されるように、static属性およびメソッドは、オブジェクト名に「.」を付ける方式で呼び出すこともできるし、インスタンスに「.」を付ける方式で呼び出すこともできる.
  • 静的メソッドには現在のオブジェクトが存在しないため、thisは使用できません.superも使用できません.
  • 静的方法は非静的方法でカバーできない.
  • 構造方法ではstaticとして宣言することは許されない.

  • staticがフィールドに作用すると、データの作成方法が変更されるに違いありません(staticフィールドはクラスごとに1つのストレージ領域しかなく、staticフィールドではなくオブジェクトごとに1つのストレージ領域があるためです).しかしstaticがある方法に作用すると,差はそれほど大きくない.staticメソッドの重要な役割は、オブジェクトを作成せずにクラス名で呼び出すことです.
    final修飾子Java宣言クラス、属性、メソッドでは、キーワードfinalを使用して修飾できます.finalタグの成分は終態の特徴を持ち、最終的な意味を表します.
    final修飾子の基本規則:
  • finalタグのクラスは継承できません.
  • finalタグの方法は布団類に書き換えることができない.
  • finalタグの変数(メンバー変数またはローカル変数)は定数となり、1回のみ付与できます.
  • finalタグのメンバー変数は、宣言と同時に値を付与する必要があります.宣言時に値を付与していない場合は、1回の付与の機会しかなく、構築方法で明示的に値を付与してから使用できます.
  • finalタグのローカル変数は、値を付与しないことのみを宣言してから、使い捨ての付与を行うことができる.
  • finalは、一般に、誤用を避けるために、汎用的な機能、実装方法、または値が勝手に変更できない成分をマークするために使用される.

  • 内部クラスは、1つのクラス(またはメソッド、文ブロック)の内部で別のクラスを定義します.後者は内部クラスと呼ばれ、ネストクラスとも呼ばれる場合があります.
    内部クラスの特徴:
  • 内部クラスは論理的な従属関係を体現することができ、同時に他のクラスに対して内部クラスの対外非可視などを制御することができる.
  • 外部クラスのメンバー変数役割ドメインは、内部クラスを含む外部クラス全体ですが、外部クラスは内部クラスのprivateメンバーにアクセスできません.
  • 論理的に関連するクラスは一緒にいてもよく、情報隠蔽内部クラスが外部クラスのメンバーに直接アクセスできることを効果的に実現することができる.
  • コンパイル後、内部クラスもoutclass$inclassの形式で個別のクラスにコンパイルされます.
  • public class Outer{
        private int size=0;
        class Inner{
          public int counter = 10;
          public void doStuff(){
              size++;
          }
        }
        public static void main(String [] args){
            Outer outer = new Outer();
            Inner inner = outer.new Inner();
            inner.doStuff();
            System.out.println(outer.size);
            System.out.println(inner.counter);   
        }   
    }

    内部クラスは4種類に分けることができます:1、クラスレベル:メンバー式、static修飾があります;2、対象レベル:メンバー式、普通、static修飾なし;3、ローカル内部クラス:ローカル式;4、匿名レベル:ローカル式.
    静的変数はメソッド領域に格納されます.