Javaキーワードまとめ

7362 ワード

一、final
コンテキスト環境によってJavaのキーワードfinalの意味には細かい違いがありますが、通常は「変えられない」ことを指します.変更したくないのは、設計や効率の2つの原因にある可能性があります.この2つの理由はかなり異なるのでfinalが誤用される可能性があります.--『Javaプログラミング思想』
  • finalクラスは継承できません.サブクラスはありません.finalクラスのメソッドのデフォルトはfinalタイプです.
  • finalメソッドはクラスのメソッドで上書きできないが、継承され、構造メソッドを修飾することはできない.
  • finalメンバー変数は定数を表し、一度だけ付与され、付与後は変更されません.
  • 注意:親のprivateメソッドはクラスのメソッドで上書きできないため、クラス内のすべてのprivateメソッドはfinalとして暗黙的に指定されます.

  • (1)finalクラス
    クラスをfinalとして定義すると、クラスを継承しないわけにはいかないことを示します.言い換えれば、クラスの機能設計はクラスを変更する必要はありません.また、セキュリティの観点から、サブクラスがあることを望んでいません.
    (2)finalメソッド
    final修飾メソッドを使用する理由は2つあります.
  • メソッドをロックし、継承クラスがその意味を変更することを防止します.
  • は、設計上、継承において方法の動作が一定に保たれ、上書きされないことを保証する.

  • (3)final変数(データ)
    finalで修飾されたメンバー変数は定数を表し、値を付けると変更できません.finalで修飾された変数には静的変数、インスタンス変数、局所変数があります.final空白:Javaは「空白final」の生成を許可し、空白finalはfinalと宣言されたが初期値が与えられていないドメインを指す.いずれにしても、コンパイラは空白finalが使用される前に初期化されなければならないことを確認します.しかし、final空白はfinalキーワードfinalの使用に柔軟性を提供し、そのため、1つのクラスのfinalデータメンバーはオブジェクトによって異なるが、その一定の不変を維持する特徴を実現することができる.次のコードを示します.
    public class Test{
        public final int i;
        
        public Test(int n){
            i = n;
        }
        
        public static void main(String[] args) {
            Test t1 = new Test(1);
            System.out.println(t1.i);
            Test t2 = new Test(3);
            System.out.println(t2.i);
        }
    }
    
    // output
    //1
    //3
    

    finalパラメータ:関数パラメータがfinalタイプの場合、このパラメータを読み込むことができますが、メソッドのパラメータの値を変更することはできません.
    public class Test{
        public void fn(final int n){
            //n++;   ,      ;
            System.out.println(n);
        }
    
        public static void main(String[] args) {
            new Test().fn(3);
        }
    }
    //output
    //3   
    

    二、static
    staticは「グローバル」または「静的」を意味し、メンバー変数とメンバーメソッドを修飾したり、静的staticコードブロックを形成したりすることができますが、Java言語にはグローバル変数の概念はありません.staticによって修飾されたメンバー変数とメンバーメソッドは、クラスの任意のオブジェクトとは独立しています.すなわち、クラス固有のインスタンスに依存せず、クラスのすべてのインスタンスによって共有される.このクラスがロードされると、Java仮想マシンはクラス名に基づいて実行時のデータ領域のメソッド領域に内定して見つけることができます.したがって、staticオブジェクトは、オブジェクトを参照することなく、任意のオブジェクトが作成される前にアクセスできます.publicで修飾されたstaticメンバー変数とメンバーメソッドの本質はグローバル変数とグローバルメソッドであり、クラスのオブジェクトを宣言するとstatic変数のコピーは生成されず、クラスのすべてのインスタンスが同じstatic変数を共有します.
  • static変数は、静的かどうかによってクラスメンバー変数を分類することによって2つに分けることができる.1つはstaticによって修飾された変数であり、静的変数またはクラス変数と呼ばれる.もう1つはstaticによって修飾されていない変数で、インスタンス変数と呼ばれます.両者の違いは、静的変数がメモリに1つしかコピーされていない(メモリを節約する)場合、JVMは静的にメモリを1回しか割り当てず、クラスをロードする過程で静的変数のメモリ割り当てを完了し、クラス名で直接アクセス(便利)することができ、もちろんオブジェクトからアクセスすることもできる(ただし、これは推奨されません).インスタンス変数の場合、インスタンスを作成するたびに、インスタンス変数にメモリが割り当てられます.インスタンス変数は、メモリに複数のコピーがあり、互いに影響しません(柔軟).
  • staticメソッド静的メソッドはクラス名で直接呼び出すことができ、任意のインスタンスも呼び出すことができるため、静的メソッドではthisとsuperキーを使用することはできず、所属クラスのインスタンス変数とインスタンスメソッド(staticを持たないメンバー変数とメンバーメソッド)に直接アクセスすることはできず、所属クラスの静的メンバー変数とメンバーメソッドにのみアクセスできます.インスタンスメンバーが特定のオブジェクトに関連付けられているためです.staticメソッドは任意のインスタンスとは独立しているため、抽象的なabstractではなく、staticメソッドを実装する必要があります.
  • staticコードブロックstaticコードブロックは静的コードブロックとも呼ばれ、クラスの中でクラスメンバーとは独立したstatic文ブロックであり、複数あってもよく、位置は任意に置くことができ、それはいかなる方法の体内にもなく、JVMがクラスをロードする時にこれらの静的コードブロックを実行し、staticコードブロックが複数ある場合、JVMはそれらがクラスに現れる順番に順番にそれらを実行する.各コードブロックは1回のみ実行されます.
  • public class Test { 
            private static int a; 
            private int b; 
    
            static { 
                    Test.a = 1; 
                    System.out.println(a); 
                    Test t = new Test(); 
                    t.fn(); 
                    t.b = 100; 
                    System.out.println(t.b); 
            } 
    
            static { 
                    Test.a = 3; 
                    System.out.println(a); 
            } 
    
            public static void main(String[] args) { 
                    // TODO         
                    System.out.println("ABC123");
            } 
    
            static { 
                    Test.a = 5; 
                    System.out.println(a); 
            } 
    
            public void fn() { 
                    System.out.println("fn()"); 
            } 
    }
    //output
    //1
    //fn()
    //100
    //3
    //5
    //ABC123 
    

    注意:数回のdebugテストでmainメソッドは最後に実行されます.
    staticとfinal
    static finalはメンバー変数とメンバーメソッドを修飾するために使用され、簡単に「グローバル定数」と理解できます.変数の場合、値が与えられると変更できず、クラス名でアクセスできることを示します.メソッドの場合は、上書きできないことを示し、クラス名で直接アクセスできます.特に、staticとfinalで修飾されたインスタンス定数では、インスタンス自体は変更できませんが、ArrayList、HashMapなどのコンテナタイプのインスタンス変数では、コンテナ変数自体を変更することはできませんが、コンテナに格納されているオブジェクトを変更することはプログラミングで多く使われています.
    三、これ
    1.クラス内のメンバー変数を表す
    public class Test{
        String s = "Hello";
     
        public Test(String s) {
           System.out.println("s = " + s);
           System.out.println("1 --> this.s = " + this.s);
           this.s = s;//          ,        
           System.out.println("2 --> this.s = " + this.s);
        }
     
        public static void main(String[] args) {
           Test t = new Test("HelloWorld!");
           System.out.println("s = " + t.s);//          
        }
    }
    //output
    //s = HelloWorld!
    //1 --> this.s = Hello
    //2 --> this.s = HelloWorld!
    //s = HelloWorld!
    

    2.自分をパラメータとする
    自分をパラメータとして渡す場合は、thisを使用します.
    class TestA {
        public TestA() {
           new TestB(this).print();//  A      TestB     ,   B   
        }
        public void print() {
           System.out.println("TestAA from A!");
        }
    }
    class TestB {
        TestA a;
        public TestB(TestA a) {
           this.a = a;
        }
        public void print() {
           a.print();//  A   
           System.out.println("TestAB from B!");
        }
    }
    public class Test {
        public static void main(String[] args) {
           TestA aaa = new TestA();
           aaa.print();
           TestB bbb = new TestB(aaa);
           bbb.print();
        }
    }
    //output
    //TestAA from A!
    //TestAB from B!
    //TestAA from A!
    //TestAA from A!
    //TestAB from B!
    

    3.匿名クラスまたは内部クラス自体を表す
    public class Test {
        int i = 1;
     
        public Test() {
           Thread thread = new Thread() {//  Thread        
               public void run() {
                  for (int j=0;j<20;j++) {
                      Test.this.run();//  Test.this        
                      try {
                         sleep(1000);
                      } catch (InterruptedException ie) {
                      }
                  }
               }
           }; //        
           thread.start();
        }
     
        public void run() {
           System.out.println("i = " + i);
           i++;
        }
       
        public static void main(String[] args) throws Exception {
           new Test();
        }
    }
    

    4.同一クラスにおける別の構成方法を表す
     public class Test {
           private int a;
           private String b;
           public Test(int a){
                   this.a = a;
                   System.out.println(a);
           }
    
           public Test(int a, String b){
                    this(a);
                    this.b = b;
                    System.out.println(b);
            }
    
        public static void main(String[] args) throws Exception {
           new Test(1,"HelloWorld");
        }
    }
    //output
    //1
    //HelloWorld
    

    注意:1.別のコンストラクション関数を呼び出すには、呼び出し動作を最初の位置に置く必要があります.2.コンストラクション関数以外の関数でコンストラクション関数を呼び出すことはできません.3.1つのコンストラクション関数内で1つのコンストラクション関数しか呼び出せません.
    5.複数のパラメータを渡す
    public class Test {
        int a;
        int b;
     
        static void show(Test test) {//     
           System.out.println(test.a + " " + test.b);
        }
        void fn() {
           show(this);
        }
     
        public static void main(String[] args) {
           Test test = new Test();
           test.a = 9;
           test.b = 10;
           test.fn();
        }
    }
    //output
    //9 10