qileilove

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

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

           作符

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

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

            String類(lèi)型支持+、+=連接操作

            優(yōu)先級(jí)問(wèn)題:

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

            而此時(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ǔ)等號(hào)右邊的值

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

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

            對(duì)象賦值:真正操作的是對(duì)象的引用,

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

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

            demo:ObjectRefrenceTest.java

          packagejavabase.flowcontrol;
          publicclassObjectRefrenceTest{
          /**
          *對(duì)象賦值測(cè)試
          */
          publicstaticvoidmain(String[]args){
          Rowidrowid=newRowid();
          rowid.rowid="LIYIHUIZHANYUANYING";
          TiptopERPtopprod=newTiptopERP();
          TiptopERPtoptest=newTiptopERP();
          topprod.seesionId=0;
          topprod.DBType="Oracle";
          topprod.rowid=rowid;
          toptest=topprod;//對(duì)象賦值
          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對(duì)象的成員變量
          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對(duì)象直接賦值給erp.rowid
          mrpII.seesionId=erp.seesionId;//對(duì)象成員變量int單獨(dú)賦值
          mrpII.DBType=erp.DBType;//對(duì)象成員變量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對(duì)象的成員變量
          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對(duì)象的成員變量
          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ù)類(lèi)型
          StringDBType;//String對(duì)象
          Rowidrowid;//一般對(duì)象
          }
          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 {
           /**
            *對(duì)象引用 
            */
           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
          */

            此類(lèi)對(duì)于傳遞對(duì)象引用而引起的問(wèn)題在Think In Java被稱(chēng)做”別名問(wèn)題”

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

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

            ==與equals:

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

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

            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ù)類(lèi)型
            int i1 = 100;
            int i2 = 100;
            System.out.println("i1 == i2 : " + (i1 == i2));
            //對(duì)象
            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));
            //自定義對(duì)象
            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 對(duì)象比較復(fù)雜,后面會(huì)有String對(duì)象的詳細(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è)對(duì)象的引用
          vString1 == vString2 : false
          vString1 equals vString2 : true //復(fù)寫(xiě)該對(duì)象的equals方法后的比較
          */

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

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

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

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

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

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

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

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

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

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

            并且得到的結(jié)果也是int類(lèi)型,且移位后的數(shù)值結(jié)果只有低5位才有用(int類(lèi)型為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語(yǔ)句,但是在java中仍然保留了goto

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

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

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

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

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

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

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

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

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

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

            Think in java 建議自寫(xiě)一個(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語(yǔ)句:
          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)起始處,開(kāi)始下一次迭代

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

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

            請(qǐng)看如下demo:GotoLabel.java

          package javabase.flowcontrol;

          public class GotoLabel {
           /**
            *java標(biāo)簽編程應(yīng)用 
            */
           public static void main(String[] args) {
            int i = 0;
            outer: //此處不可以寫(xiě)其它的任何代碼
               //System.out.println("outer man!");
             for(;true;){
              inner: //此處不可以寫(xiě)其它的任何代碼
                  //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)的開(kāi)頭,并繼續(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-16 11:11 順其自然EVO 閱讀(168) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 图木舒克市| 蚌埠市| 内丘县| 门头沟区| 营口市| 巴林左旗| 浠水县| 通州区| 石林| 朝阳区| 武定县| 宁海县| 怀远县| 阜南县| 舟山市| 广宁县| 龙胜| 陇南市| 叙永县| 高州市| 土默特右旗| 尼玛县| 贞丰县| 上林县| 舞钢市| 屏南县| 高雄县| 布拖县| 凤阳县| 年辖:市辖区| 三都| 宁化县| 长沙县| 石景山区| 东乡县| 南召县| 贵定县| 迁西县| 公主岭市| 宁津县| 商城县|