JAva演算子および初期化

7431 ワード

1、自動増加と減少
 {
        int i=1;
        int j=1;
        System.out.println("i++="+(i++));
        System.out.println("++j="+(++j));
        System.out.println("i="+i);
        System.out.println("j="+j);
        System.out.println("i--="+(i--));
        System.out.println("--j="+(--j));
    }


これらの計算の答えを見てみましょう.
 i++=1
 ++j=2
 i=2
 j=2
 i--=2
 --j=1

接頭辞式は、計算を先に実行してから値を返します.すなわち、計算された値を返します.接尾辞式はまず値を返し、計算を行い、計算前の値を返します.
2、文字列オペレータ+および+=
    {
       String s="hello";
       System.out.println(s+" "+1+2+3);
       System.out.println(s+" "+(1+2+3));
       s+=1+2+3;
       System.out.println(s);
       s+=123;
       System.out.println(s);
    }

文字列の後に+または+=がデフォルトで文字列変換を実行する方法(toString()メソッドが暗黙的に呼び出された)
3、論理演算子短絡
まず例を見てみましょう.
static boolean test1(int val){
        System.out.println("test1("+val+")");
        System.out.println("result:"+(val<1));
        return val<1;
    }
    static boolean test2(int val){
        System.out.println("test2("+val+")");
        System.out.println("result:"+(val<2));
        return val<2;
    }
    static boolean test3(int val){
        System.out.println("test3("+val+")");
        System.out.println("result:"+(val<2));
        return val<2;
    }

 public static  void main(String args[])
    {
        boolean b=test1(0)&&test2(2)&&test3(3);
        System.out.println(b);
    }

以上の演算の出力はいくらですか?
test1(0)
result:true
test2(2)
result:false
false

結果から、test3()は実行されなかった.これは、&&とオペレータが、falseの値があると、その後の操作は実行されないためである.式をboolean b=test1(0)&test2(2)&test3(3);に変更すると、出力結果は次のようになります.
  test1(0)
  result:true
  test2(2)
  result:false
  test3(3)
  result:false
  false

4、What goto?
JAvaにはgotoが残っていますが、言語では使用されていません.JAvaは、breakおよびcontinueのキーワードによって、いくつかの類似したジャンプ機能を実現することができる.例:
public class tesk {

    static boolean test1(int val){
        System.out.println("test1("+val+")");
        System.out.println("result:"+(val<1));
        return val<1;
    }
    static boolean test2(int val){
        System.out.println("test2("+val+")");
        System.out.println("result:"+(val<2));
        return val<2;
    }
    static boolean test3(int val){
        System.out.println("test3("+val+")");
        System.out.println("result:"+(val<2));
        return val<2;
    }
    public static  void main(String args[])
    {
      int i=0;
      outer:
        while (true){
          System.out.println("outer while loop");
          while (true){
              i++;
              System.out.println("i="+i);
              if(i==1){
                  System.out.println("continue");
                  continue ;
              }
              if(i==3){
                  System.out.println("continue outer");
                  continue outer;
              }
              if(i==5){
                  System.out.println("break");
                  break ;
              }
              if(i==7){
                  System.out.println("break outer");
                  break outer; 
              }
          }
        }

    }
}
----
outer while loop
i=1
continue
i=2
i=3
continue outer
outer while loop
i=4
i=5
break
outer while loop
i=6
i=7
break outer


結果から,continue回は最内層サイクルの先頭に後退することが分かった.continueラベル付きで、ラベルがある位置に戻り、再びループに入ります.breakは現在のサイクルを中断し、飛び出します.breakはラベル付きで、中断し、ラベルが指すサイクルにジャンプします.ラベルは慎重に使用して、プログラムが分析しにくいため、デバッグしにくいです;
5、初期化
初期化とクリーンアップは安全に関わる2つの重要な要素である.JAvaはコンストラクタの概念を導入してクラスメンバー変数の初期化を行う.それは主に2つの問題を解決した:1、各メンバー変数が初期化されることを保証する;2、ネーミングの問題を解決しました.それはクラス名と同じです.パラメータを受け入れないコンストラクタはデフォルトコンストラクタと呼ばれ、無パラメトリックコンストラクタとも呼ばれます.クラスにコンストラクタが定義されていない場合、デフォルトでは非パラメトリックコンストラクタが呼び出され、デフォルトの付与値を使用してメンバー変数ごとに付与されます.また、コンストラクタが存在すると、このデフォルトの非コンストラクタは機能しません.
メソッドのリロード:クラスのメソッドでは、リロードが許可されます.つまり、常に同じメソッド名ですが、デフォルトのパラメータは異なります.例:
public class couse {
    private int id;
    public couse(){} //      
    public couse(int id){ //      ,       
        this.id=id;
    }

    public int getId() {  //    
        return id;
    }
    public int getId(int index){ //       
        return id+index;
    }
}

リロードを区別する方法:パラメータタイプで区別するには、なぜ戻り値を区別しないのですか?次の例を見てみましょう.
   public int getId() {  //    
        return id;
    }
    public void getId(){
        return id;
    }

もし私たちが方法を呼び出すならば:getId()はどのように呼び出したのがどれなのかを判定して、時には、戻り値は使う必要がなくて、戻り値のタイプを知らないので、jvmの解析ができません;非パラメトリック構築メソッドのデフォルトについては、http://www.jianshu.com/p/20a644b8e8c8
thisキーワードthisは、コンストラクタで使用され、コンストラクタでコンストラクタを呼び出す場合は、次のようになります.
public class couse {
    private int id;
    private int nums;
    public couse(){
        this(0,0); 
       // this.id=12; //         
    } //      
    public couse(int id){ //      ,       
       this(id,0);
    }

    public couse(int id, int nums) {
        this.id = id; //this   id   id
        this.nums = nums;
    }
}

6、整理:最終処理とゴミ回収
JAvaのゴミ回収器は、不要なオブジェクトが占有するメモリ資源を回収する責任を負うが、特殊なメモリ(newではなく割り当てられた)がある場合、ゴミ回収期間は処理できない.そのため、javaではfinalize()メソッドが定義され、メモリがクリーンアップされる条件は以下の通りである.
public class Book {
    boolean checkout=false;
    Book(boolean checkout){
        this.checkout=checkout;
    }
    public void checkin(){
        checkout=false;
    }

    @Override
    protected void finalize() throws Throwable {
        if(checkout){
            System.out.println("error,has book not be checked");
        }
        //super.finalize();
    }
    public static void main(String args[]){
        Book book=new Book(true);
        book.checkin();;
        new Book(true);
        System.gc();//      
    }
}

---
error,has book not be checked

7、ゴミ回収器
一般的なゴミ回収メカニズム:
参照カウント法は、その名の通り、各オブジェクトに1つの参照カウンタを追加し、オブジェクトに1つの参照が追加されると、そのカウンタに1を追加し、その参照が役割ドメインから離れたりnullになったりすると、そのカウンタは1を減少し、カウンタが0になると、そのオブジェクトはクリアされる.この方法は簡単であるが効率が低下し、ループリファレンスが存在する場合、カウンタはクリアされないが、このようなオブジェクトは回収される必要がある.適応的なごみ回収メカニズムの主なメカニズムは、生存するオブジェクトに対して、必ずその静的記憶領域またはスタックに遡ることができる.そのため、静的ストレージ領域やスタックから遍歴し、生存しているすべてのオブジェクトを見つけ、別のスタックにコピーし、コピーされていないものはすべてゴミであり、これらのオブジェクトは自動的に回収することができる.しかし、この方法は効率が低下し、2つのスタックを保有するため、メモリが2倍になり、ゴミが少ないときにコピーすると大きな浪費をもたらすため、この - の方法は、ゴミが少ないときに別の作業方式に切り替えられた. - 、標識清掃の方式は速度が遅いが、ごみが少ない場合、実行速度が速い. - は同様の方法を採用し、静的記憶領域とスタックから出発し、生存するオブジェクトに遭遇すると、オブジェクトにマークを与え、このプロセスはゴミ回収動作を行わない.すべてのオブジェクトのマークが完了すると、クリーンアップが開始されますが、クリーンアップ後、スタックスペースは連続していません.
8、メンバー初期化
public class couse {
    private int id;
    public couse(){
        System.out.println(id);
        id=7;
        System.out.println(id);
    }

    public static void main(String args[]){
        couse c=new couse();
    }

}

0
7

上記のコードを見ると、コンパイラが初期化されたと表示されていても、各メンバー変数に初期値を与えることを示します.静的データの初期化は、どのオブジェクトが作成されても、静的データは常に1つの記憶領域しか占めません.