第三章 操作符
1.靜態(tài)導(dǎo)入(static import)
格式如下:
import static com.....ClassName.* ;
此處多了個(gè)static關(guān)鍵字,并且在類名ClassName后面多了個(gè) .* 咖刃,意思是導(dǎo)入這個(gè)類里的所有靜態(tài)方法和靜態(tài)字段(屬性)翠勉。當(dāng)然,也可以只導(dǎo)入某個(gè)靜態(tài)方法夜牡,只要把 .* 換成靜態(tài)方法名就行了。然后在這個(gè)類中,就可以直接用方法名調(diào)用靜態(tài)方法勤庐,而不必用ClassName.方法名的方式來調(diào)用。這種方法的好處就是可以簡化一些操作好港,例如打印操作System.out.println(...);就可以將其寫入一個(gè)靜態(tài)方法print(...)愉镰,在使用時(shí)直接print(...)就可以了。 但是這種方法建議在有很多重復(fù)調(diào)用的時(shí)候使用钧汹,如果僅有一到兩次調(diào)用丈探,不如直接寫來的方便。
示例如下:
//: 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 類的使用:
- 要生成隨機(jī)數(shù)拔莱,可以先創(chuàng)建一個(gè)Random類的對(duì)象碗降,若在創(chuàng)建的過程中沒有傳遞任何參數(shù),那么Java就會(huì)將當(dāng)前時(shí)間作為隨機(jī)數(shù)生成器的種子塘秦,并由此在程序每次執(zhí)行時(shí)都會(huì)產(chǎn)生不同的隨機(jī)數(shù)讼渊;
- 若想讓程序每次執(zhí)行時(shí)都產(chǎn)生相同的隨機(jī)數(shù)(以使得輸出可驗(yàn)證),可通過在創(chuàng)建Random對(duì)象時(shí)提供種子(用于數(shù)生成器的初始化值尊剔,隨機(jī)數(shù)生成器對(duì)于特定的種子值總是產(chǎn)生相同的隨機(jī)數(shù)序列)爪幻。
示例:
Random rand = new Random(47);//每次運(yùn)行結(jié)果相同
Random randDif = new Random();//每次運(yùn)行結(jié)果不同
int i;
// Choose value from 1 to 100:
//rand.nextInt(100)設(shè)置了所產(chǎn)隨機(jī)數(shù)的上限為100,而其下限為0须误,為避免除零挨稿,應(yīng)該進(jìn)行加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.一元減號(hào)用于轉(zhuǎn)變數(shù)據(jù)的符號(hào)京痢,而一元加號(hào)只是為了與一元減號(hào)相對(duì)應(yīng)奶甘,但是它唯一的作用僅僅是將較小數(shù)據(jù)類型的操作數(shù)提升為int。
4.++和--說明
對(duì)于前綴形式(++i和--i)历造,在執(zhí)行完運(yùn)算后才得到值甩十;對(duì)于后綴形式(i++和i--)船庇,則是在執(zhí)行運(yùn)算之前就得到值。
5.關(guān)系操作符
關(guān)系操作符中侣监,等于和不等于適用于所有基本數(shù)據(jù)類型鸭轮,而其他比較符不適用于boolean類型,因?yàn)閎oolean值只能為true或false橄霉,“大于”和“小于”沒有實(shí)際意義窃爷。
和!=也適用于所有對(duì)象,但是它們比較的是對(duì)象的引用。要比較兩個(gè)對(duì)象的實(shí)際內(nèi)容姓蜂,應(yīng)該使用所有對(duì)象都適用的特殊方法equals()按厘。但是該方法不適用于基本類型,基本類型直接使用和!=即可钱慢。
注意實(shí)現(xiàn)自己的類時(shí)逮京,若想使得該類的兩個(gè)對(duì)象的內(nèi)容可以作比較運(yùn)算,應(yīng)該覆蓋自己設(shè)計(jì)類中的equals()方法束莫,因?yàn)閑quals()的默認(rèn)行為是比較對(duì)象的引用懒棉。
6.邏輯操作符
"&&"、“||”览绿、“!”操作只可應(yīng)用于布爾值策严,與C和C++不同的是:不可以將一個(gè)非布爾值當(dāng)做布爾值在邏輯表達(dá)式中使用。
7.關(guān)于二進(jìn)制
在C饿敲、C++或Java中妻导,二進(jìn)制數(shù)沒有直接常量表示方法。但是怀各,通過Integer和Long的靜態(tài)方法toBinaryString()可以很容易地實(shí)現(xiàn)二進(jìn)制形式輸出倔韭。
8.指數(shù)計(jì)數(shù)法
“e”代表10的冪次,如1.39e-43f表示1.39x10-43瓢对,編譯器將指數(shù)字面量當(dāng)成double處理狐肢,所以在指數(shù)常量后最好加上后綴"d"和"f"。
9.按位操作符(只可用來操作整數(shù)基本數(shù)據(jù)類型中的單個(gè)“比特位”)
&沥曹、|、^碟联、~
分別為按位“與”妓美、按位“或”、按位“異或”和按位“非”鲤孵,“~”是一元操作符壶栋,所以不可與“=”聯(lián)合使用,其他三個(gè)可以普监。
我們可將布爾類型作為一種單比特值對(duì)待贵试,并且可對(duì)布爾類型執(zhí)行按位“與”琉兜、按位“或”和按位“異或”運(yùn)算,但不能執(zhí)行按位“非”毙玻。對(duì)于布爾值豌蟋,按位操作符具有與邏輯操作符相同的效果,只是它們不會(huì)中途“短路”桑滩。此外梧疲,針對(duì)布爾值進(jìn)行的按位運(yùn)算為我們新增了一個(gè)“異或”邏輯操作符,它并未包括在“邏輯”操作符的列表中运准。
10.移位操作符(只可用來處理整數(shù)基本數(shù)據(jù)類型中的二進(jìn)制“位”)
<<
幌氮,左移位操作符,低位補(bǔ)零胁澳;>>
该互,右移位操作符,“有符號(hào)”右移位操作符使用“符號(hào)擴(kuò)展”:若符號(hào)為正韭畸,則高位補(bǔ)零宇智;若符號(hào)為負(fù),則高位補(bǔ)1陆盘;>>>
普筹,“無符號(hào)”右移位操作符,使用“零擴(kuò)展”:無論正負(fù)隘马,都在高位補(bǔ)零太防。這一操作符是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);//輸出結(jié)果是x, y, z 012
print(x + y + z + s);//輸出結(jié)果是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.使用操作符常犯的錯(cuò)誤
while(x = y){
//...
}
上述代碼中只要x,y不都為布爾值酸员,在Java中就不會(huì)編譯通過蜒车,因?yàn)镴ava不會(huì)自動(dòng)將int數(shù)值轉(zhuǎn)換為布爾值。Java編譯器不會(huì)允許我們隨便把一種類型當(dāng)做另外一種類型來用幔嗦。
14.關(guān)于類型轉(zhuǎn)換
- 窄化轉(zhuǎn)換(narrowing conversion)酿愧,必須顯示進(jìn)行類型轉(zhuǎn)換。
- 擴(kuò)展轉(zhuǎn)換(widening conversion)邀泉,不必顯示進(jìn)行類型轉(zhuǎn)換嬉挡。
注意:Java允許我們把任何基本數(shù)據(jù)類型轉(zhuǎn)換為別的基本數(shù)據(jù)類型,但布爾型除外汇恤,因?yàn)椴紶栃透静辉试S進(jìn)行任何類型的轉(zhuǎn)換處理庞钢。
將float或double轉(zhuǎn)型為整型值時(shí),總是對(duì)該數(shù)字執(zhí)行結(jié)尾因谎。如果想要得到四舍五入的結(jié)果基括,就需要使用java.lang.Math中的round()方法,由于round()是java.lang的一部分财岔,因此使用它時(shí)不需要額外導(dǎo)入风皿。
對(duì)基本數(shù)據(jù)類型執(zhí)行算術(shù)運(yùn)算或按位運(yùn)算河爹,只要類型比int小(即char桐款、byte或者short)咸这,在運(yùn)算之前這些值會(huì)自動(dòng)轉(zhuǎn)換成int。
15.Java沒有sizeof
sizeof在c/c++中存在主要是為了解決移植問題的鲁僚,但是在Java中所有數(shù)據(jù)類型在所有機(jī)器中的大小都是相同的炊苫,所有不需要sizeof()操作符來解決移植問題。
16.關(guān)于布爾型值
能夠?qū)Σ紶栃椭颠M(jìn)行的運(yùn)算非常有限冰沙。我們只能賦予true和false值侨艾,并測(cè)試它的真假,而不膩對(duì)布爾值進(jìn)行其他任何運(yùn)算(如加拓挥、減等)唠梨。
17.關(guān)于溢出
兩個(gè)較大的int值相乘可能會(huì)溢出,但是編譯器不會(huì)給出任何出錯(cuò)或警告的信息侥啤。