Java初學者容易混淆的幾個問題
1.String類和StringBuffer類
它們都是處理字符串的類,但是它們有一個最大的區別,那就是。
eg1:
運行結果:
You are fired!
You are hired!
結果分析:
從結果,明顯可知,s1的值并沒有被改變,而第一行結果只是屏幕內容的替換.
eg2:
運行結果:
Hello to Java!
結果分析:
顯然,s2的值已改變.
2.位邏輯與條件邏輯
首先聲明, 為了與位邏輯更好區分開來,我把通常所說的邏輯取了個別名叫做條件邏輯.
它們都有各自的操作符,位邏輯操作符有:&(與運算),^(異或運算),|(或運算);條件邏輯操作符有:&&(并
且),||(或者)。
位邏輯運算通常是針對兩個數而言,實行位操作;而條件邏輯運算是針對兩個條件表達式而言,實行條件操作.其實,位邏輯操作符一樣可以實現條件操作,但是此時有一個重要的區別:用位操作符時,不管操作符兩邊的條件表達式成不成立,它都要通通進行運算判斷,而條件邏輯操作符不一樣了,如果通過左側的操作數就可以進行它們需要的判斷,那么它就不會再計算右側的操作數了,這種情況叫短路.廢話少說!且看下例.
eg1:
運行結果:
The value is too small.
結果分析:
照理說應會出現除數為0的錯誤,但是我剛才說了,由于條件邏輯操作符是短路操作符,顯然,value!=0不成立,立即就可作出判斷應執行else后的語句,所以它就不再會運算判斷1/value<1000了.如果不懂請再看一
例:
eg2:
運行結果:
int2=2.0
int3=1.0
結果分析:
我想不用我分析了,你應該懂了吧.
3.實例變量與類變量
可以通過兩種方法在類中存儲數據───作為實例變量和類變量.實例變量是特定于對象的,如果你有兩個對象(即一個類的兩個實例),每一個對象中的實例變量獨立于另一個對象中的實例變量的;另一方面,兩個對象的類變量均指向相同的數據,并因此面保存相同的值,換句話說,類變量被類中的所有對象共享.差點忘了,它們在形式上的區別,類變量在聲明時比實例變量多一個static.
eg:
運行結果:
b.intdata=0
結果分析:
可以看出,a.intdata的值雖然變了,但并沒有影響b.intdata.但是如果在data類中聲明intdata時,在其前面加上static就變成類變量了(即:public static int intdata=0;),則此時運行結果會變為:
b.intdata=1
這次a.intdata值的改變可把b.intdata影響了,事實上,對象a和b的類變量均指向相同的數據,所有值一樣,這就是類變量的作用。
它們都是處理字符串的類,但是它們有一個最大的區別,那就是。
eg1:
| ...... //omit some code String s1="You are hired!"; System.out.println(s1.replace(′h′,′f′));//用f把字串中的h替換了 System.out.println(s1); ...... //omit some code |
運行結果:
You are fired!
You are hired!
結果分析:
從結果,明顯可知,s1的值并沒有被改變,而第一行結果只是屏幕內容的替換.
eg2:
| ...... //omit some code StringBuffer s2=new StringBuffer("Hello from Java!"); s2.replace(6,10,"to"); System.out.println(s2); ...... //omit some code |
運行結果:
Hello to Java!
結果分析:
顯然,s2的值已改變.
2.位邏輯與條件邏輯
首先聲明, 為了與位邏輯更好區分開來,我把通常所說的邏輯取了個別名叫做條件邏輯.
它們都有各自的操作符,位邏輯操作符有:&(與運算),^(異或運算),|(或運算);條件邏輯操作符有:&&(并
且),||(或者)。
位邏輯運算通常是針對兩個數而言,實行位操作;而條件邏輯運算是針對兩個條件表達式而言,實行條件操作.其實,位邏輯操作符一樣可以實現條件操作,但是此時有一個重要的區別:用位操作符時,不管操作符兩邊的條件表達式成不成立,它都要通通進行運算判斷,而條件邏輯操作符不一樣了,如果通過左側的操作數就可以進行它們需要的判斷,那么它就不會再計算右側的操作數了,這種情況叫短路.廢話少說!且看下例.
eg1:
| ...... //omit some code double value=0; if(value!=0 && 1/value<1000){ System.out.println("The value is not too small."); } else{ System.out.println("The value is too small."); } ...... //omit some code |
運行結果:
The value is too small.
結果分析:
照理說應會出現除數為0的錯誤,但是我剛才說了,由于條件邏輯操作符是短路操作符,顯然,value!=0不成立,立即就可作出判斷應執行else后的語句,所以它就不再會運算判斷1/value<1000了.如果不懂請再看一
例:
eg2:
| ...... //omit some code double int1=0,int2=1,int3=1; if(int1!=0 & (int2=2)==1){} System.out.println("int2="+int2); if(int1!=0 && (int3=2)==1){} System.out.println("int3="+int3); ...... //omit some code |
運行結果:
int2=2.0
int3=1.0
結果分析:
我想不用我分析了,你應該懂了吧.
3.實例變量與類變量
可以通過兩種方法在類中存儲數據───作為實例變量和類變量.實例變量是特定于對象的,如果你有兩個對象(即一個類的兩個實例),每一個對象中的實例變量獨立于另一個對象中的實例變量的;另一方面,兩個對象的類變量均指向相同的數據,并因此面保存相同的值,換句話說,類變量被類中的所有對象共享.差點忘了,它們在形式上的區別,類變量在聲明時比實例變量多一個static.
eg:
| class data { public int intdata=0;//顯然,intdata在這兒是實例變量 } public class exam { public static void main(String[] args) { data a,b; a=new data(); b=new data(); a.intdata=1; System.out.println("b.indata="+b.intdata); } } |
運行結果:
b.intdata=0
結果分析:
可以看出,a.intdata的值雖然變了,但并沒有影響b.intdata.但是如果在data類中聲明intdata時,在其前面加上static就變成類變量了(即:public static int intdata=0;),則此時運行結果會變為:
b.intdata=1
這次a.intdata值的改變可把b.intdata影響了,事實上,對象a和b的類變量均指向相同的數據,所有值一樣,這就是類變量的作用。