qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Java操作符及執(zhí)行流程控制

          作符

            主要操作符:+、-、*、/、=、++、--、+=、-=、==、!=、&&、||、!、&、^、~、>=、<=、>、< …..

            幾乎所有的操作符只能夠操作”基本數(shù)據(jù)類型”,=、==、!=可以操作所有的數(shù)據(jù)類型及對象

            String類型支持+、+=連接操作

            優(yōu)先級問題:

            此處注意:任何數(shù)據(jù)類型與String類型進(jìn)行+連接都將會(huì)先將其他的數(shù)據(jù)類型轉(zhuǎn)變?yōu)镾tring在連接成String類型

            而此時(shí)的+不再會(huì)做任何的計(jì)算

            demo:

          int i = 1;
          int j = 2;
          System.out.println("result:" + i + j);//result:12
          System.out.println("i == j : " + i == j);// ×
          System.out.println("i == j : " + (i == j));// √

            關(guān)于賦值操作符:取右邊的值(即右值),把它復(fù)制給左邊(即左值)。右值可以是任何常數(shù)、變量、或者表達(dá)式(只要它能夠生成一個(gè)值就行)。但左值必須是一個(gè)明確的、已命名的變量,也就是必須有一個(gè)物理空間可以存儲(chǔ)等號右邊的值

            基本數(shù)據(jù)類型賦值:直接將一個(gè)地方的值復(fù)制到另外一個(gè)地方

            a = b;//b的內(nèi)容復(fù)制給a,若修改a或b其中的一個(gè)值,另外一個(gè)值不會(huì)受到任何影響

            對象賦值:真正操作的是對象的引用,

            所以將對象賦值給另外一個(gè)對象實(shí)際上是將一個(gè)對象的引用復(fù)制到另外一個(gè)地方

            它們其實(shí)指向的是內(nèi)存中的同一塊內(nèi)容

            demo:ObjectRefrenceTest.java

          packagejavabase.flowcontrol;
          publicclassObjectRefrenceTest{
          /**
          *對象賦值測試
          */
          publicstaticvoidmain(String[]args){
          Rowidrowid=newRowid();
          rowid.rowid="LIYIHUIZHANYUANYING";
          TiptopERPtopprod=newTiptopERP();
          TiptopERPtoptest=newTiptopERP();
          topprod.seesionId=0;
          topprod.DBType="Oracle";
          topprod.rowid=rowid;
          toptest=topprod;//對象賦值
          System.out.println("Before:");
          System.out.println("topprod:"+topprod.seesionId+topprod.DBType+topprod.rowid.rowid);
          System.out.println("toptest:"+toptest.seesionId+toptest.DBType+toptest.rowid.rowid);
          System.out.println("Afterchangetopprodobject:");
          //toptest.DBType="Informix";
          topprod.DBType="Informix";
          topprod.rowid.rowid="5201314131413141314";//此處改變了topprod.rowid對象的成員變量
          System.out.println("topprod:"+topprod.seesionId+topprod.DBType+topprod.rowid.rowid);
          System.out.println("toptest:"+toptest.seesionId+toptest.DBType+toptest.rowid.rowid);
          System.out.println("-----------------------------");
          TiptopERPerp=newTiptopERP();
          TiptopERPmrpII=newTiptopERP();
          erp.seesionId=2;
          erp.DBType="DB2";
          erp.rowid=rowid;//此處直接將先前的rowid對象直接賦值給erp.rowid
          mrpII.seesionId=erp.seesionId;//對象成員變量int單獨(dú)賦值
          mrpII.DBType=erp.DBType;//對象成員變量String單獨(dú)賦值
          mrpII.rowid=erp.rowid;
          System.out.println("Before:");
          System.out.println("erp:"+erp.seesionId+erp.DBType+erp.rowid.rowid);
          System.out.println("mrpII:"+mrpII.seesionId+mrpII.DBType+mrpII.rowid.rowid);
          System.out.println("Afterchangrowid:");
          erp.rowid.rowid="LIYIHUIZHANYUANYING";//此處改變了erp.rowid對象的成員變量
          System.out.println("erp:"+erp.seesionId+erp.DBType+erp.rowid.rowid);
          System.out.println("mrpII:"+mrpII.seesionId+mrpII.DBType+mrpII.rowid.rowid);
          System.out.println("Afterchangeerpobject:");
          erp.seesionId=1;
          erp.DBType="Mysql";
          erp.rowid.rowid="5201314131413141314";//此處改變了erp.rowid對象的成員變量
          System.out.println("erp:"+erp.seesionId+erp.DBType+erp.rowid.rowid);
          System.out.println("mrpII:"+mrpII.seesionId+mrpII.DBType+mrpII.rowid.rowid);
          }
          }
          classTiptopERP{
          intseesionId;//基本數(shù)據(jù)類型
          StringDBType;//String對象
          Rowidrowid;//一般對象
          }
          classRowid{
          Stringrowid;
          }
          /*輸出結(jié)果:
          Before:
          topprod:0OracleLIYIHUIZHANYUANYING
          toptest:0OracleLIYIHUIZHANYUANYING
          Afterchangetopprodobject:
          topprod:0Informix5201314131413141314//rowid值改變了
          toptest:0Informix5201314131413141314//rowid值改變了
          -----------------------------
          Before:
          erp:2DB25201314131413141314//rowid值改變了
          mrpII:2DB25201314131413141314//rowid值改變了
          Afterchangrowid:
          erp:2DB2LIYIHUIZHANYUANYING//rowid值改變了
          mrpII:2DB2LIYIHUIZHANYUANYING//rowid值改變了
          Afterchangeerpobject:
          erp:1Mysql5201314131413141314//rowid值改變了
          mrpII:2DB25201314131413141314//rowid值改變了
          */



            demo:PassObject.java

          package javabase.flowcontrol;

          class Letter{
           char c;
          }
          public class PassObject {
           /**
            *對象引用 
            */
           static void f(Letter y){
            y.c = 'z';
           }
           public static void main(String[] args) {
            Letter x = new Letter();
            x.c = 'a';
            System.out.println("before:x.c = " + x.c);
            f(x);
            System.out.println("after:x.c = " + x.c);
           }
          }
          /*輸出結(jié)果:
          before:x.c = a
          after:x.c = z
          */

            此類對于傳遞對象引用而引起的問題在Think In Java被稱做”別名問題”

            使用中應(yīng)注意此類陷阱

            ++或--:前綴++/--先運(yùn)算再生成值,后綴++/--先生成值再運(yùn)算

            ==與equals:

            比較2個(gè)實(shí)際值是否相等:對象用equals,基本數(shù)據(jù)類型用==

            比較對象的地址是否相等:對象/基本數(shù)據(jù)類型都用==

            demo:EqualsTest.java

          package javabase.flowcontrol;

          class ValueInt{
           int id;
          }
          class ValueString{
           String id;
           @Override
           public boolean equals(Object obj) {
            boolean instanceFlag;
            instanceFlag = obj instanceof ValueString;
            if(!instanceFlag)
             return super.equals(obj);
            else{
             ValueString vTemp = (ValueString)obj;
             if(vTemp.id.equals(this.id)){
              return true;
             }
            return false;
            }
           }
          }
          public class EqualsTest {
           /**
            * ==操作符、equals的區(qū)別
            */
           public static void main(String[] args) {
            //基本數(shù)據(jù)類型
            int i1 = 100;
            int i2 = 100;
            System.out.println("i1 == i2 : " + (i1 == i2));
            //對象
            Integer n1 = new Integer(250);
            Integer n2 = new Integer(250);
            System.out.println("n1 == n2 : " + (n1 == n2));
            System.out.println("n1 equals n2 : " + n1.equals(n2));
            //自定義對象
            ValueInt vInt1 = new ValueInt();
            ValueInt vInt2 = new ValueInt();
            vInt1.id = vInt2.id = 32; 
            System.out.println("vInt1 == vInt2 : " + (vInt1 == vInt2));
            System.out.println("vInt1 equals vInt2 : " + vInt1.equals(vInt2));
            ValueString vString1 = new ValueString();
            ValueString vString2 = new ValueString();
            vString1.id = vString2.id = "李藝輝";
            System.out.println("vString1 == vString2 : " + (vString1 == vString2));
            System.out.println("vString1 equals vString2 : " + vString1.equals(vString2));
            //String 對象比較復(fù)雜,后面會(huì)有String對象的詳細(xì)解析
            
           }
          }
          /*輸出結(jié)果:
          i1 == i2 : true
          n1 == n2 : false
          n1 equals n2 : true
          vInt1 == vInt2 : false
          vInt1 equals vInt2 : false //這是因?yàn)閑quals默認(rèn)行為是比較2個(gè)對象的引用
          vString1 == vString2 : false
          vString1 equals vString2 : true //復(fù)寫該對象的equals方法后的比較
          */

            邏輯操作符:&&、||、!

            邏輯操作只可以應(yīng)用于布爾值,注意邏輯操作的”短路”情況

            test(1) && test(2) && test(3) //順序判斷,只要前面有一個(gè)test為假后面的判斷就不需要執(zhí)行了

            test(1) || test(2) || test(3)  //順序判斷,只要前面有一個(gè)test為真后面的判斷就不需要執(zhí)行了

            按位操作符:位與(&)、位或(|)、位非(~)、

            有符號位左移(<<):低位補(bǔ)0

            有符號位右移(>>):若符號為正則高位補(bǔ)0,若符號為負(fù)則高位補(bǔ)1

            無符號位左移(<<<):無論正負(fù)低位全部補(bǔ)0

            無符號位右移(>>>):無論正負(fù)高位全部補(bǔ)0

            如果對char、byte、short類型數(shù)值進(jìn)行移位處理,那么在移位之前它們都將先被轉(zhuǎn)換為int類型,

            并且得到的結(jié)果也是int類型,且移位后的數(shù)值結(jié)果只有低5位才有用(int類型為2的5次方)

           三元操作符:

            boolean-exp ? value0 : value1

            如果布爾表達(dá)式boolean-exp為true則計(jì)算value0,否則計(jì)算value1

            控制執(zhí)行流程

            關(guān)鍵字:Java控制執(zhí)行流程主要涉及的關(guān)鍵字if-else、while、do-while、for、return、break、continue

            Java并不支持goto語句,但是在java中仍然保留了goto

            條件判斷:所有條件判斷都利用條件表達(dá)式的真或假來決定執(zhí)行流程

            注意:java不允許將一個(gè)數(shù)字等非boolean值作為布爾值使用,如果要在布爾測試中使用一個(gè)非布爾值則首先必須用一個(gè)條件表達(dá)式將其轉(zhuǎn)換成布爾值。

            Ex:a是非boolean類型值 if(a)×à  if(a!=0) √

            while:先判斷條件表達(dá)在執(zhí)行循環(huán)體,條件為false則一次都不執(zhí)行

            do-while:先執(zhí)行循環(huán)體,再判斷條件表達(dá)式,因此至少會(huì)執(zhí)行一次

            for語句:for(int  i = 1, j = 5;i < 5;i++,j = i+2)

            for語句初始化部分實(shí)際上可以定義任意數(shù)量的變量,注意:但是這些變量都必須是同一種數(shù)據(jù)類型

            for語句中可以使用一系列有逗號表達(dá)式分隔的語句

            增強(qiáng)行的for循環(huán):for(char c : “hello world”.toCharArray())

            如果for循環(huán)有索引或是步進(jìn),則上述增強(qiáng)行的for循環(huán)不能夠直接滿足需求

            Think in java 建議自寫一個(gè)range()方法配合增強(qiáng)型的for循環(huán)

          import static net.mindview.util.range.* //此包需從www.mindview.com上下載
          Ex:for(int i : range(10))     //range(10)返回?cái)?shù)組,元素為0..9
          for(int i : range(5,10))    //range(5,10)返回?cái)?shù)組,元素為5..9
          for(int i : range(5,10,3))  //range(5,10,3)返回?cái)?shù)組,元素為5..10 step 3
          while(true) = for(;;)
          switch .. case...break語句:
          switch(integral-selector)  //integral-selector:選擇因子必需是int或是char那樣的整數(shù)值
          case integral-value1:statement:break;
          //
          Default:statement;

            單一case satatement后面需有break,避免case穿透到下一case statement

            return:指定一個(gè)方法的返回值,并退出該方法。

            如果一個(gè)方法聲明有非void的返回值,那么必須確保每一條代碼路徑都將返回一個(gè)值

            break:終止當(dāng)前循環(huán)體

            continue:停止循環(huán)體的當(dāng)前迭代,然后退回循環(huán)起始處,開始下一次迭代

            goto:雖然java不再使用goto語句,但是依然保留了goto作為關(guān)鍵字

            在java中如果想實(shí)現(xiàn)goto一樣跳轉(zhuǎn)語句的功能可以使用標(biāo)簽編程

            請看如下demo:GotoLabel.java

          package javabase.flowcontrol;

          public class GotoLabel {
           /**
            *java標(biāo)簽編程應(yīng)用 
            */
           public static void main(String[] args) {
            int i = 0;
            outer: //此處不可以寫其它的任何代碼
               //System.out.println("outer man!");
             for(;true;){
              inner: //此處不可以寫其它的任何代碼
                  //System.out.println("innter man!");
               for(;i<10;i++){
                System.out.println("i = " + i);
                if(i == 2){
                 System.out.println("continue");
                 continue;
                }
                if(i == 3){
                 System.out.println("break");
                 i++;
                 break;
                }
                if(i == 7){
                 System.out.println("continue outer");
                 i++;
                 continue outer;
                }
                if(i == 8){
                 System.out.println("break outer");
                 break outer;
                }
                for(int k = 0; k < 5; k++){
                 if(k == 3){
                  System.out.println("continue inner");
                  continue inner;
                 }
                }
               }
                System.out.println("hello world");
             }
            System.out.println("fuck in java");
           }
          }
          /*輸出結(jié)果:
          i = 0
          continue inner
          i = 1
          continue inner
          i = 2
          continue
          i = 3
          break
          hello world
          i = 4
          continue inner
          i = 5
          continue inner
          i = 6
          continue inner
          i = 7
          continue outer
          i = 8
          break outer
          fuck in java
          */

            一般的continue會(huì)退回最內(nèi)層循環(huán)的開頭,并繼續(xù)執(zhí)行

            帶標(biāo)簽的continue會(huì)到達(dá)標(biāo)簽的位置,并重新進(jìn)入緊接在那個(gè)標(biāo)簽后面的循環(huán)

            一般的break會(huì)中斷并跳出當(dāng)前的循環(huán)體

            帶標(biāo)簽的break會(huì)中斷并跳出標(biāo)簽所指的循環(huán)

           三元操作符:

            boolean-exp ? value0 : value1

            如果布爾表達(dá)式boolean-exp為true則計(jì)算value0,否則計(jì)算value1

            控制執(zhí)行流程

            關(guān)鍵字:Java控制執(zhí)行流程主要涉及的關(guān)鍵字if-else、while、do-while、for、return、break、continue

            Java并不支持goto語句,但是在java中仍然保留了goto

            條件判斷:所有條件判斷都利用條件表達(dá)式的真或假來決定執(zhí)行流程

            注意:java不允許將一個(gè)數(shù)字等非boolean值作為布爾值使用,如果要在布爾測試中使用一個(gè)非布爾值則首先必須用一個(gè)條件表達(dá)式將其轉(zhuǎn)換成布爾值。

            Ex:a是非boolean類型值 if(a)×à  if(a!=0) √

            while:先判斷條件表達(dá)在執(zhí)行循環(huán)體,條件為false則一次都不執(zhí)行

            do-while:先執(zhí)行循環(huán)體,再判斷條件表達(dá)式,因此至少會(huì)執(zhí)行一次

            for語句:for(int  i = 1, j = 5;i < 5;i++,j = i+2)

            for語句初始化部分實(shí)際上可以定義任意數(shù)量的變量,注意:但是這些變量都必須是同一種數(shù)據(jù)類型

            for語句中可以使用一系列有逗號表達(dá)式分隔的語句

            增強(qiáng)行的for循環(huán):for(char c : “hello world”.toCharArray())

            如果for循環(huán)有索引或是步進(jìn),則上述增強(qiáng)行的for循環(huán)不能夠直接滿足需求

            Think in java 建議自寫一個(gè)range()方法配合增強(qiáng)型的for循環(huán)

          import static net.mindview.util.range.* //此包需從www.mindview.com上下載
          Ex:for(int i : range(10))     //range(10)返回?cái)?shù)組,元素為0..9
          for(int i : range(5,10))    //range(5,10)返回?cái)?shù)組,元素為5..9
          for(int i : range(5,10,3))  //range(5,10,3)返回?cái)?shù)組,元素為5..10 step 3
          while(true) = for(;;)
          switch .. case...break語句:
          switch(integral-selector)  //integral-selector:選擇因子必需是int或是char那樣的整數(shù)值
          case integral-value1:statement:break;
          //
          Default:statement;

            單一case satatement后面需有break,避免case穿透到下一case statement

            return:指定一個(gè)方法的返回值,并退出該方法。

            如果一個(gè)方法聲明有非void的返回值,那么必須確保每一條代碼路徑都將返回一個(gè)值

            break:終止當(dāng)前循環(huán)體

            continue:停止循環(huán)體的當(dāng)前迭代,然后退回循環(huán)起始處,開始下一次迭代

            goto:雖然java不再使用goto語句,但是依然保留了goto作為關(guān)鍵字

            在java中如果想實(shí)現(xiàn)goto一樣跳轉(zhuǎn)語句的功能可以使用標(biāo)簽編程

            請看如下demo:GotoLabel.java

          package javabase.flowcontrol;

          public class GotoLabel {
           /**
            *java標(biāo)簽編程應(yīng)用 
            */
           public static void main(String[] args) {
            int i = 0;
            outer: //此處不可以寫其它的任何代碼
               //System.out.println("outer man!");
             for(;true;){
              inner: //此處不可以寫其它的任何代碼
                  //System.out.println("innter man!");
               for(;i<10;i++){
                System.out.println("i = " + i);
                if(i == 2){
                 System.out.println("continue");
                 continue;
                }
                if(i == 3){
                 System.out.println("break");
                 i++;
                 break;
                }
                if(i == 7){
                 System.out.println("continue outer");
                 i++;
                 continue outer;
                }
                if(i == 8){
                 System.out.println("break outer");
                 break outer;
                }
                for(int k = 0; k < 5; k++){
                 if(k == 3){
                  System.out.println("continue inner");
                  continue inner;
                 }
                }
               }
                System.out.println("hello world");
             }
            System.out.println("fuck in java");
           }
          }
          /*輸出結(jié)果:
          i = 0
          continue inner
          i = 1
          continue inner
          i = 2
          continue
          i = 3
          break
          hello world
          i = 4
          continue inner
          i = 5
          continue inner
          i = 6
          continue inner
          i = 7
          continue outer
          i = 8
          break outer
          fuck in java
          */

            一般的continue會(huì)退回最內(nèi)層循環(huán)的開頭,并繼續(xù)執(zhí)行

            帶標(biāo)簽的continue會(huì)到達(dá)標(biāo)簽的位置,并重新進(jìn)入緊接在那個(gè)標(biāo)簽后面的循環(huán)

            一般的break會(huì)中斷并跳出當(dāng)前的循環(huán)體

            帶標(biāo)簽的break會(huì)中斷并跳出標(biāo)簽所指的循環(huán)

          posted on 2013-08-13 10:33 順其自然EVO 閱讀(198) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 都江堰市| 股票| 醴陵市| 防城港市| 普格县| 桂林市| 平安县| 会理县| 玉树县| 德江县| 灵石县| 黑河市| 托里县| 涡阳县| 若尔盖县| 垣曲县| 新源县| 睢宁县| 淮南市| 巩义市| 鱼台县| 商南县| 黎平县| 织金县| 无棣县| 咸阳市| 平利县| 宁陵县| 霍山县| 隆子县| 遂平县| 沙湾县| 徐州市| 日喀则市| 将乐县| 合阳县| 西和县| 新余市| 江川县| 阳东县| 波密县|