作符
主要操作符:+、-、*、/、=、++、--、+=、-=、==、!=、&&、||、!、&、^、~、>=、<=、>、< …..
幾乎所有的操作符只能夠操作”基本數(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)