Java静的変数、メソッド、高速、(非)静的内部クラス

5551 ワード

静的オブジェクト
  • 静的オブジェクトのデータは、グローバルで一意であり、変更された全変更である.
  • 参照が便利です.クラス名.静的メソッド名またはクラス名を直接使用します.静的変数名はgetメソッドやsetメソッドを必要とせずに直接適用でき、その値を直接変更できます.
  • はデータの一意性を維持し、彼の任意の場所を修正し、他の場所が変更されます.余計な浪費を効果的に減らす.
  • staticおよびfinalは、メンバー変数およびメンバーメソッドを修飾するために使用され、「グローバル定数」と簡単に理解できます.変数については、値が与えられるとより好ましくなくなり、メソッドについては上書きできないことを示します.

  • 静的変数、静的メソッド、静的ブロック
  • 通常、クラスメンバーはクラスのインスタンスからアクセスする必要がありますが、メンバー宣言の前にstaticキーを付けると、クラスから直接アクセスできるオブジェクトを参照する必要がなく作成できます.変数とメソッドをstaticに設定できます.最も一般的な例はmain()関数です.staticとして宣言する方法には、
  • という制限があります.
  • は、他のstaticメソッド
  • のみを呼び出すことができる.
  • staticデータ
  • のみアクセス可能
  • は、this、super(this)がオブジェクトに関連し、superが継承に関連する
  • を任意の方法で導入することはできない.
  • 例:Staticブロックは、クラスがロードされたときに1回のみ実行される.次の例で示すクラスにはstaticメソッド、いくつかのstatic変数、およびstatic初期化ブロックがあります.
  • public class TestNew {
        static int a = 3;
        static int b;
        static void meth(int x){
            System.out.println("x = "+x);
            System.out.println("a = "+a);
            System.out.println("b = "+b);
        }
        static {
            System.out.println("static block initialized");
            b = a*4;
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            meth(42);
        }
    } 
    

    実行結果は次のとおりです.
    static block initialized x = 42 a = 3 b = 12
      class TestNew      :  static    (      ),a    3,  b     a*4  12。    main(),main ()   meth() ,  42   x。3 println ( )       static  a b,      x 。
    

    静的メソッドまたは静的変数の外部使用
  • それらを定義するクラスの外では、staticメソッドと変数は、クラスの名前の後に番号演算子を追加すれば、任意のオブジェクトとは独立して使用できます.例:
  • class StaticDemo{  
        static int a = 42;  
        static int b = 99;  
        static void callme(){  
            System.out.println("a = "+a);  
        }  
    }  
    public class TestNew {  
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            StaticDemo.callme();  
            System.out.println("b = "+StaticDemo.b);  
        }  
    }  
    

    実行結果:
    a = 42
    b = 99
    

    静的内部クラス
  • は、1つのクラスの内部を指し、staticで1つのクラスを修飾する.静的内部クラスを使用するのは、外部内と一定の関係があるため、外部クラスでのみ内部クラスを呼び出すため、Javaファイルでこのクラスを配置する必要はありません.しかし、コンパイルに成功すると、OuterClass.classとOuterClass$InnerClass.clssの2つのclassファイルが表示されます.
  • 静的メソッド、静的メンバー変数.オブジェクトの生成ではなくクラスのロードに伴って生成され、クラス名+静的メンバー名で直接取得できるようにする唯一の役割を果たします.これにより、静的内部クラスは、外部クラス名+内部クラス名で直接取得できることが理解されます(内部クラスの静的メンバーのみに対して、非静的メンバーは内部クラスインスタンスオブジェクトにアクセスする必要があります).
  • public class OuterClass{
        private String out_str1 = "        ";
        private static String out_str2 = "       ";
        
        public static class InnerClass{ 
             private static String str = "Java  ";
             public  String str1 = "       ";
             public  void display1(){
                 System.out.println(out_str2);//            
             }
             public static void display2(){
                // System.out.println(out_str1);//               
             }
         }
        
        public void printInfo(){
            
             System.out.println(OutClass.InnerClass.str); //            
              InnerClass inner = new InnerClass();//                 
              System.out.println(inner.str1);
              inner.display1();
             
        }
         
         public static void main(String[] args) {
             OutClass out = new OutClass();
             out.printInfo();
             
         }
    }
    
  • 静的内部クラスでは外部クラスの非静的メンバーにアクセスできません.これはJava構文で「静的メソッドでは非静的メンバーに直接アクセスできません」によって定義されています.外部クラスの変数にアクセスするには、静的ネストクラスの使用が少ないため、他の方法で解決する必要があります.外部クラスが内部クラスにアクセスするメンバーは、非静的メンバーに直接アクセスできない特別なものがありますが、内部クラスでアクセスできます.内部クラスの静的メンバーについては、外部クラス名+内部クラス名で直接取得できます.また、内部静的クラスInnerClassは、外部クラスOutClassの範囲内でのみ表示され、他のクラスで参照または初期化されるとエラーになります.

  • 非静的内部クラス
  • は、外部クラスにおいて2つの内部クラスおよびそれらの呼び出し関係を定義するコードを以下に示す:
  • .
    public class Outer {   
               int outer_x = 100;  
        class Inner{  
          public int y = 10;  
          private int z = 9;  
          int m = 5;  
          public void display(){  
            System.out.println("display outer_x:"+ outer_x);  
          }  
          private void display2(){  
            System.out.println("display outer_x:"+ outer_x);  
          }  
        }  
        void test(){  
          Inner inner = new Inner();  
          inner.display();  
          inner.display2();  
          //System.out.println("Inner y:" + y);//           
          System.out.println("Inner y:" + inner.y);//      
          System.out.println("Inner z:" + inner.z);//      
          System.out.println("Inner m:" + inner.m);//      
          InnerTwo innerTwo = new InnerTwo();  
          innerTwo.show();  
        }  
        class InnerTwo{  
          Inner innerx = new Inner();  
          public void show(){  
            //System.out.println(y);//    Innter y    
            //System.out.println(Inner.y);//      Inner          
            innerx.display();//      
            innerx.display2();//      
            System.out.println(innerx.y);//      
            System.out.println(innerx.z);//      
            System.out.println(innerx.m);//      
          }  
        }  
        public static void main(String args[]){  
          Outer outer = new Outer();  
          outer.test();  
        }  
      }  
    
  • 以上のコードは、内部クラスについては、通常、クラスのclassキーワードを定義する前にpublicやprivateなどの制限子を付けず、加えても何の影響もないと同時に、これらの制限子は内部クラスの変数や方法にも影響しない(?)と説明する必要があります.また、内部クラスInnerおよびInntertwoはクラスOuterの役割ドメイン内でのみ知られており、クラスOuter以外のコードがクラスInnerを初期化したり使用したりしようとした場合、コンパイルは通過しないことに注意してください.また、内部クラスの変数メンバーは内部内部でのみ表示され、外部クラスまたは同階層の内部クラスにアクセスする必要がある場合は、サンプルプログラムの方法を採用する必要があり、内部クラスの変数に直接アクセスすることはできません.