第三章 操作符
1.靜態導入(static import)
格式如下:
import static com.....ClassName.* ;
此處多了個static關鍵字,并且在類名ClassName后面多了個 .* ,意思是導入這個類里的所有靜態方法和靜態字段(屬性)。當然,也可以只導入某個靜態方法,只要把 .* 換成靜態方法名就行了。然后在這個類中,就可以直接用方法名調用靜態方法,而不必用ClassName.方法名的方式來調用。這種方法的好處就是可以簡化一些操作,例如打印操作System.out.println(...);就可以將其寫入一個靜態方法print(...),在使用時直接print(...)就可以了。 但是這種方法建議在有很多重復調用的時候使用,如果僅有一到兩次調用,不如直接寫來的方便。
示例如下:
//: net/mindview/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
package edu.ustc.home.util;
import java.io.*;
public class Print {
// Print with a newline:
public static void print(Object obj) {
System.out.println(obj);
}
// Print a newline by itself:
public static void print() {
System.out.println();
}
// Print with no line break:
public static void printnb(Object obj) {
System.out.print(obj);
}
// The new Java SE5 printf() (from C):
public static PrintStream
printf(String format, Object... args) {
return System.out.printf(format, args);
}
} ///:~
使用上述代碼:
import static net.mindview.util.Print.*;
public class A {
public static void main(String[] args) {
print("Hello,static import!");
}
}
2.Random 類的使用:
- 要生成隨機數,可以先創建一個Random類的對象,若在創建的過程中沒有傳遞任何參數,那么Java就會將當前時間作為隨機數生成器的種子,并由此在程序每次執行時都會產生不同的隨機數;
- 若想讓程序每次執行時都產生相同的隨機數(以使得輸出可驗證),可通過在創建Random對象時提供種子(用于數生成器的初始化值,隨機數生成器對于特定的種子值總是產生相同的隨機數序列)。
示例:
Random rand = new Random(47);//每次運行結果相同
Random randDif = new Random();//每次運行結果不同
int i;
// Choose value from 1 to 100:
//rand.nextInt(100)設置了所產隨機數的上限為100,而其下限為0,為避免除零,應該進行加1操作。
i = rand.nextInt(100) + 1;
float u; // Applies to doubles, too
//chosen (approximately) uniformly from the range 0.0f (inclusive) to 1.0f (exclusive)
u = rand.nextFloat();
long l;
l = rand.nextLong();
double d;
//chosen (approximately) uniformly from the range 0.0d (inclusive) to 1.0d (exclusive)
d = rand.nextDouble();
3.一元減號用于轉變數據的符號,而一元加號只是為了與一元減號相對應,但是它唯一的作用僅僅是將較小數據類型的操作數提升為int。
4.++和--說明
對于前綴形式(++i和--i),在執行完運算后才得到值;對于后綴形式(i++和i--),則是在執行運算之前就得到值。
5.關系操作符
關系操作符中,等于和不等于適用于所有基本數據類型,而其他比較符不適用于boolean類型,因為boolean值只能為true或false,“大于”和“小于”沒有實際意義。
和!=也適用于所有對象,但是它們比較的是對象的引用。要比較兩個對象的實際內容,應該使用所有對象都適用的特殊方法equals()。但是該方法不適用于基本類型,基本類型直接使用和!=即可。
注意實現自己的類時,若想使得該類的兩個對象的內容可以作比較運算,應該覆蓋自己設計類中的equals()方法,因為equals()的默認行為是比較對象的引用。
6.邏輯操作符
"&&"、“||”、“!”操作只可應用于布爾值,與C和C++不同的是:不可以將一個非布爾值當做布爾值在邏輯表達式中使用。
7.關于二進制
在C、C++或Java中,二進制數沒有直接常量表示方法。但是,通過Integer和Long的靜態方法toBinaryString()可以很容易地實現二進制形式輸出。
8.指數計數法
“e”代表10的冪次,如1.39e-43f表示1.39x10-43,編譯器將指數字面量當成double處理,所以在指數常量后最好加上后綴"d"和"f"。
9.按位操作符(只可用來操作整數基本數據類型中的單個“比特位”)
&、|、^、~
分別為按位“與”、按位“或”、按位“異或”和按位“非”,“~”是一元操作符,所以不可與“=”聯合使用,其他三個可以。
我們可將布爾類型作為一種單比特值對待,并且可對布爾類型執行按位“與”、按位“或”和按位“異或”運算,但不能執行按位“非”。對于布爾值,按位操作符具有與邏輯操作符相同的效果,只是它們不會中途“短路”。此外,針對布爾值進行的按位運算為我們新增了一個“異或”邏輯操作符,它并未包括在“邏輯”操作符的列表中。
10.移位操作符(只可用來處理整數基本數據類型中的二進制“位”)
<<
,左移位操作符,低位補零;>>
,右移位操作符,“有符號”右移位操作符使用“符號擴展”:若符號為正,則高位補零;若符號為負,則高位補1;>>>
,“無符號”右移位操作符,使用“零擴展”:無論正負,都在高位補零。這一操作符是C或C++中所沒有的。
11.三元操作符if-else
boolean-exp ? value0 : value1
12.字符串操作符+和+=(字符串連接符)
package io.github.wzzju; /* Added by Eclipse.py */
import static io.github.wzzju.util.Print.*;
public class StringOperators {
public static void main(String[] args) {
int x = 0, y = 1, z = 2;
String s = "x, y, z ";
print(s + x + y + z);//輸出結果是x, y, z 012
print(x + y + z + s);//輸出結果是3x, y, z
print(x + " " + s); // Converts x to a String
s += "(summed) = "; // Concatenation operator
print(s + (x + y + z));
print("" + x); // Shorthand for Integer.toString()
}
}
13.使用操作符常犯的錯誤
while(x = y){
//...
}
上述代碼中只要x,y不都為布爾值,在Java中就不會編譯通過,因為Java不會自動將int數值轉換為布爾值。Java編譯器不會允許我們隨便把一種類型當做另外一種類型來用。
14.關于類型轉換
- 窄化轉換(narrowing conversion),必須顯示進行類型轉換。
- 擴展轉換(widening conversion),不必顯示進行類型轉換。
注意:Java允許我們把任何基本數據類型轉換為別的基本數據類型,但布爾型除外,因為布爾型根本不允許進行任何類型的轉換處理。
將float或double轉型為整型值時,總是對該數字執行結尾。如果想要得到四舍五入的結果,就需要使用java.lang.Math中的round()方法,由于round()是java.lang的一部分,因此使用它時不需要額外導入。
對基本數據類型執行算術運算或按位運算,只要類型比int小(即char、byte或者short),在運算之前這些值會自動轉換成int。
15.Java沒有sizeof
sizeof在c/c++中存在主要是為了解決移植問題的,但是在Java中所有數據類型在所有機器中的大小都是相同的,所有不需要sizeof()操作符來解決移植問題。
16.關于布爾型值
能夠對布爾型值進行的運算非常有限。我們只能賦予true和false值,并測試它的真假,而不膩對布爾值進行其他任何運算(如加、減等)。
17.關于溢出
兩個較大的int值相乘可能會溢出,但是編譯器不會給出任何出錯或警告的信息。