《疯狂Java讲义》第3章——数据类型和运算符
本章講述的內容可以分為注釋、數據內容、運算符三大塊,文章結構大致如下圖所示:
- 注釋
- 單行、多行注釋
- 文檔注釋以及javadoc命令
數據類型
- 基本數據類型
- 分類
- 整形(byte、short、int、long)
- 字符型(char)
- 浮點型(float)
- 布爾型(boolean)
- 類型轉換
- 自動類型轉換
- 強制類型轉換
- 分類
- 基本數據類型
運算符
- 算數運算符(+、-、*、/、%、++、–)
- 賦值運算符(=)
- 位運算符(&、|、~、^、<<、>>、>>>)
- 比較運算符(>、>=、<、<=、==、!=)
- 邏輯運算符(&&、&、||、|、!、^)
- 三目運算符(? :)
首先,先來看第一部分——注釋:
一、注釋
????????注釋是給人看的,因此不會被計算機所識別和執行,根據不同的需要,分類如下:
????????1)單行注釋和多行注釋:
????????不多講,看下面片段:
public class CommentTest{/*這里面的內容都是多行注釋的內容,不會被執行*/public static void main(String[] args){//這是單行注釋System.out.println("Hello world!");//System.out.println("這行代碼被注釋了,不會被執行");} }????????2)文檔注釋:
????????????????Java基礎類庫中有成千上萬的類,開發者不可能全部記住它們,那么就需要有一份說明性的文檔,把這些類,以及類中方法的用途記錄下來,以便查閱。對于Java 8 ,可以在Oracle官網下載頁,將滾動條滾動到下方,如圖:
下載到Java 8的API說明文檔。下載成功后會得到一個jdk-8u65-docs-all.zip文件,將它解壓后,會得到一個jdk-8u65-docs-all文件夾,在文件夾下的docs/api目錄下,打開index.html,就可以看到Java 8 的API說明文檔,如下圖所示:
這是打開index.html后,訪問到的Java 8 API文檔首頁:
????????????????說了這么多,跟文檔注釋有什么關系呢?其實,如此龐大的Java API說明文檔,就是文檔注釋+javadoc的杰作!這里先說說文檔注釋。文檔注釋,顧名思義,就是”用來生成API文檔的注釋“,例如:
public class DocCommentTest{private String comment;/*** 這里是文檔注釋,用于生成可閱讀的文檔*/public String getComment(){return comment;} }????????????????由上面的代碼片段可見,所謂文檔注釋,在格式上,只是比多行注釋在開頭處多了一個星號。
????????????????那么,僅僅因為多了一個星號,就多出了一種注釋的方式嗎?不是的,文檔注釋還要配合javadoc工具,才能體現出它的價值來。那么javadoc又是干什么的呢?javadoc和javac、java一樣,是一個exe文件,它的功能是識別java源文件中的文檔注釋,并按照一定規則將文檔注釋提取出來,生成一份可讀性好的API文檔。語言是蒼白的,下面做一個小例子來加以說明:
首先,寫兩個類:
package lee; public class JavaDocTest{/*** 簡單測試成員變量*/protected String name;/*** main方法*/public static void main(String[] args){System.out.println("Hello world!");} } package yeeku; public class Test{/*** 簡單測試成員變量*/public int age;/*** Test類的測試構造器*/public Test(){} }備注:上面的兩個類分別在JavaDocTest.java文件和Test.java文件中,在cmd命令行輸入命令,如下所示:
執行命令后,源文件父目錄下多出了一個apidoc文件夾,如圖所示:
進入apidoc文件夾中,如圖所示:
打開Index.html文件,可以看到,兩個java源文件中的類的文檔注釋,已經被成功提取成為一份API文檔,下圖中標示了javadoc命令各項參數的效果:
在左下角區域選擇Test類,可以看到,在Test.java中為Test類的成員變量age,以及為Test的構造器所做的文檔注釋,如下圖所示:
注釋的內容就介紹到這里。
二、數據類型
????????1)基本數據類型:
????????1.分類:
????????a)整形:
????????各種整型的表示范圍如下表:
| byte | 8 | 1 | -2^7 ~ 2^7 - 1 | 符號位 |
| short | 16 | 2 | -2^15 ~ 2^15 - 1 | 符號位 |
| int | 32 | 4 | -2^31 ~ 2^31 - 1 | 符號位 |
| long | 64 | 8 | -2^63 ~ 2^63 - 1 | 符號位 |
????????其中,int是最常用的類型。
????????對于整型系列,有幾點比較特殊的地方:
????????1、對于一個在byte類型范圍的整型值,可以直接賦給byte類型的變量:
public static void main(String[] args){//允許,雖然23默認是int類型,但因為其值比較小,//賦給byte類型變量bValue時,把它當成byte類型byte bValue = 23;//在byte范圍內,正常byte bValue1 = 1213;//超出byte范圍,錯誤//同樣地,以二進制數表示的整型,如果是在byte范圍內,//也可以直接復制給byte變量byte binValue = 0b01101001;//在byte范圍內,正常byte binValue1 = 0b11101111;//超出byte范圍,錯誤 }????????2、對于一個超過了int類型范圍的整型值,不可以賦給long類型的變量:
public static void main(String[] args){//下面代碼錯誤,系統不會把99999999999999當成long類型,//而會認為99999999999999超出了int類型最大表示范圍,//從而報錯long bigValue = 99999999999999;//為了使得上面的賦值操作可以實現,需要將int類型升級為long類型//通過在數值后加上一個"L",指明該數值是long類型直接量long bigValue1 = 99999999999999L; }????????3、整型值的4種表示方式:
????????a)十進制:十進制想必沒有什么好說的了,大家日常每天都在用
????????b)二進制:
????????????????以0B開頭,每一位可取的值只有0、1,例如:
public static void main(String[] args){//定義2個8位的二進制整數int binVal1 = 0b11010100;int binVal2 = 0b01101001;System.out.println("binVal1:" + binVal1);//212System.out.println("binVal2:" + binVal2);//105 }????????下面我們來計算一下binVal1和binVal2是不是分別等于212和105:
????????首先,計算binVal1(0b11010100):
??????????????????????1.最高位是符號位,是1,所以binVal1是一個負數
??????????????????????2.將剩下的數值位轉化為十進制數,得到84
??????????????????????3.于是binVal1 = -84
????????????????咦?怎么不是212,不但數值不對,正負號都搞錯了!!!
????????????????這里涉及到幾個問題:
??????????????????????q1:哪一位是最高位?是左手邊數起第一位嗎?如果不是,那是哪一位?
??????????????????????q2:我們人看到的實際數字,和計算機保存的數字是同一個數字嗎?
????????????????我們可以注意到,binVal1的類型是int,那么意味著它的位數是32位,而我們賦給binVal1的數值是一個8位的整數,那這時系統發現位數不夠,于是把它前面的32 - 8 = 24個位都補上0,此時
??????????????????????binVal1=0b00000000000000000000000011010100
????????????????此時再看,binVal1最高位已經變成0,再將其他位作為數值位,進行轉換,得到數值——212
????????????????這回終于對了!前面提出的問題q1可以回答了——要看變量的類型來具體判定最高位是哪一位。同個道理,binVal2的值也可以計算得出。但是,問題q2怎么好像沒有體現到?且看下面這段程序:
public static void main(String[] args){//定義32位二進制整數int binVal3 = 0b10000000000000000000000000000011; System.out.println("binVal3:" + binVal3);//-2147483645 }????????????????嘿嘿,這回binVal3的值正好是32位的,我們發現最高位是1,數值位是3,結果想當然的是-3,但是真正的結果是-2147483645,這回真的是差了十萬八千里了!
????????????????怎么回事呢?原來,正如上面的q2問題,答案是否定的——計算機中存的數,其實跟我們看到的數不是同一回事,計算機是把所有的數都轉換成補碼存了起來,而當被讀取的時候,又把補碼轉換為原碼,呈現在人們面前。那么問題來了——什么是原碼?補碼又是什么?
????????????????原碼是計算機為了在系統中表示正負號,在原來的數字的數值部分的前面,增加一位作為符號位,形成的新數。例如:-8要存進計算機里,就要轉換成二進制的表示,數值部分的8好轉,直接就是1000,那負號怎么辦呢?計算機只認識0和1呀!于是原碼來了——在數值位前面增加1位作為符號位,于是-8就是11000,可是Java中沒有5位的整型類型呀,那么我們就假設這個-8是個byte類型的吧,byte是8位,那么它的符號位1就應該在左手邊第一位,所以十進制的-8轉換成二進制byte型就應該是10001000——這就是-8的原碼。
????????????????現在計算機認識-8了,可是為什么又有一個補碼的概念呢?簡單的來說,補碼是為了計算機更方便地進行運算——在運算的時候,可以將符號位視為數值位,一起參與運算,而不必擔心結果出錯。因此,計算機以原碼到補碼轉換過程的開銷,換取了節省計算過程中區分符號位與數值位的開銷的便利。
????????????????原碼轉換為補碼的步驟是這樣子的:
????????????????????當原碼是正數時:不用轉化,原碼與補碼相等
????????????????????當原碼是負數時:
?????????????????????????1.獲得反碼——符號位不變,數值位取反
?????????????????????????2.獲得補碼——反碼+1
????????????????當我們使用二進制的時候,計算機默認把二進制數當成補碼,直接存到變量里面;而當我們使用十進制的時候,計算機是把十進制數當成原碼,再將原碼轉為補碼,再存入到變量中。而等到打印輸出的時候,計算機又把存在變量里的補碼,統統轉換成原碼,展現在我們面前。
????????????????因此binVal3 = 0b10000000000000000000000000000011,這個數其實是一個補碼,那么必須將它轉換為原碼,才是打印輸出的結果。補碼轉換為原碼的步驟與原碼轉為補碼的步驟互逆:
??????????當補碼是負數時:
????????????????1.獲得反碼——補碼 - 1(0b10000000000000000000000000000010);
????????????????2.獲得原碼——符號位不變,數值位取反(0b11111111111111111111111111111101)
??????????當補碼是正數時,補碼和原碼相等。
????????????????于是,binVal3的原碼是:0b11111111111111111111111111111101,轉為十進制,就是-2147483645
????????????????假如binVal3使用十進制數存進去,例如binVal3 = -3,那么計算機會將-3視為原碼(而不是補碼),并將它轉換為補碼存到內存中,當打印輸出時,又會將-3從補碼形式轉回原碼形式,于是一來一回,相當于沒轉,于是打印輸出還是-3.
????????c)八進制:
????????????????八進制數以0打頭,如下所示:
public static void main(String[] args){//8進制數,0打頭int octalValue = 013;System.out.println("octalValue :" + octalValue);//輸出11 }????????d)十六進制:
????????????????16進制數用0x打頭,如下所示:
public static void main(String[] args){//16進制數,0x打頭int hexValue1 = 0x13;int hexValue2 = 0xaF;System.out.println("hexValue1 :" + hexValue1);//輸出19System.out.println("hexValue2 :" + hexValue2);//輸出175 }????????4、溢出:
????????i)什么叫溢出:
????????????????溢出,其實有很多種語義場景,比如說,內存溢出、緩沖溢出等等。然而,無論是什么類型的溢出,都是因為同一個原因——裝不下了,那怎么辦呢,硬塞唄——結果就是在這個“硬塞”的過程中,我們損失了一些東西。
????????????????我們這里的溢出,指的是變量代表的那一塊小內存,裝不下我們人為地想要裝進去的數值,那么我們就把這個大數進行一下強制類型轉換(關于強轉,本文后面會講到),然后硬塞進去,結果出問題了——實際存進變量的值,跟我們放進去的,不是同一個數值。也就是說,原來的大數,在強轉的過程當中,出現了損失,因而變成了另外一個數。
????????ii)溢出舉例:
public static void main(String[] args){/*定義1個8位二進制數,但它實際上占了32位,因此雖然左手邊起第8位是1,但它經過位數擴展之后,仍然是一個正數0b0000_0000_0000_0000_0000_0000_1110_1001,也就是233,但是已經超過了byte的范圍,現在要把它賦給一個byte類型的變量,必須進行強轉,強轉的結果是0b1110_1001,也就是不要前面的24位,因為現在最高位是1,是負數,將補碼轉為原碼,得到0b1001_0111,也就是-23,而這就產生了溢出*/byte bValue = (byte)0b11101001;//這里的二進制數是補碼System.out.println("bValue :" + bValue);//-23 }結果:
????????5、新特性:
????????????????為了方便程序員看清位數較多的數值,在Java7之后,允許在數值中的數位之間添加分隔號”_”,例如:
public static void main(String[] args){int iValue = 0b0000_0001_0001_1101_0010_0101_0011_1111;double dValue1 = 3.14_15_92_63; }????????b)字符型:
??????????????1)字符集:
???????????????????????計算機保存字符的時候,實際上是把該字符對應的編號,轉化為二進制代碼,保存到計算機中。因此,需要為每個字符,編上一個編號,有多少個字符,就編多少個號,形成很多個”字符<–>編號“這種一一對應的映射關系,這些映射關系,就組成了所謂的字符集。
???????????????????????例如,ASCII字符集只給英文字母、數字、標點符號編碼,總共加起來不超過100個,于是ASCII字符集只用了一個字節(最多可表示256個字符)來編碼。然而到了后來,隨著世界各地各種語言的假如,字符越來越多,于是采用兩個字節編碼的Unicode字符集又應運而生了。
???????????????????????總而言之,字符集的出現,是為了解決計算機不認識人類世界的符號,又必須要保存這些符號的矛盾。
??????????????2)表示法:
???????????????????????Java中表示單個字符,可以有以下三種形式:
???????????????????????a)直接法:直接用單引號括住字符,例如 ‘a’表示字符a
???????????????????????b)轉義法:一些特殊字符,必須通過轉義普通字符來表示,例如: ‘\r’表示”回車“字符, ‘\n’表示”換行“字符
???????????????????????c)Unicode法:用Unicode值來表示,形如: ‘\uXXXX’,其中 ‘XXXX’代表一個16進制的數
??????????????3)與int類型的關系:
????????????????????????????把一個int類型的值賦給一個char類型的變量,系統會認為該int值是char字符的編碼,例如:char c = 97 ,當輸出c的值時,會發現是字符 ‘a’
??????????????4)示例程序:
public static void main(String[] args){//直接指定單個字符作為字符值char aChar = 'a';System.out.println("aChar:" + aChar);//輸出a//使用轉義字符作為字符值char enterChar = '\n';System.out.print("enterChar:" + enterChar);//輸出一個回車符//使用Unicode編碼值來指定字符值char ch = '\u9999';System.out.println("ch:" + ch);//輸出中文"香"字char zhong = '瘋';System.out.println("zhong:" + zhong);//輸出中文"瘋"int zhongVal = zhong;System.out.println("zhongVal:" + zhongVal);//輸出中文"瘋"的unicode值char c = 97;System.out.println("c:" + c);//輸出字符'a'}??????????????結果如下所示:
????????c)浮點型:
??????????????1)分類:
??????????????????????1.float:單精度,長度32位 = 1位符號+8位指數+23位尾數
??????????????????????2.double:雙精度,長度64位 = 1位符號+11位指數+52位尾數
??????????????2)特殊值:
??????????????????????1.POSITIVE_INFINITY:正無窮
??????????????????????2.NEGATIVE_INFINITY:負無窮
??????????????????????3.NAN:非數
??????????????3)示例程序:
public static void main(String[] args){//下面輸出的af并不精確,原因是Java使用二進制的科學計數法表示//浮點數float af = 5.2345556f;System.out.println("af:" + af);double a = 0.0; double b = Double.NEGATIVE_INFINITY;float d = Float.NEGATIVE_INFINITY;//double中的負無窮和float的負無窮是相等的System.out.println("b == d : " + (b == d));//0.0/0.0得到非數System.out.println("0.0 / 0,0: " + (0.0/0.0));//非數之間不相等System.out.println("a / a == Float.Nan : " + (a / a == Float.NaN));//正無窮之間是相等的System.out.println("6.0 / 0.0 == 342.0 / 0.0 : " + (6.0 / 0.0 == 342.0 / 0.0));//下面將拋出“除數不能為0”的異常//System.out.println(0 / 0);}結果如下所示:
????????d)布爾型:
?????????????布爾型只有一個boolean類型,而且取值只能是true或者false,而且不能像在C語言中一樣,用非0的數代替true,用0代替false
????????2.類型轉換
????????????????1)自動類型轉換
??????????????????????指的是一種基本類型的值,可以直接賦給另一種基本類型的變量,而不加任何限制條件,簡稱“小轉大”。
??????????????????????Java的自動類型轉換分為以下兩種:
???????????????????????????1、小數值類型—>大數值類型(存在兩條類型提升線路)
????????????????????????????????????byte–>short–>int–>long–>float–>double
????????????????????????????????????char–>int–>long–>float–>double
???????????????????????????2、非String類型—>String類型
示例程序:
public static void main(String[] args){int a = 6;//int類型自動轉換為floatfloat f = a;//將輸出6.0System.out.println("f : " + f);//定義bytebyte b = 9;//byte無法自動轉型為char//char c = b;//byte可以自動轉型為doubledouble d = b;//將輸出9.0System.out.println("d:" + d);//int、float、double與String使用“+”連接時//統統自動轉化為StringString s = "Hello" + 10 + 1.3f + 3.2;System.out.println("s : " + s);//輸出Hello101.33.2}????????????????2)強制類型轉換
??????????????????????指的是一種基本類型的值,不能直接賦值給另一種基本類型的變量,必須將該值的類型強制轉為目標變量的類型,然后才能進行賦值操作。強制類型轉換的格式形如:(TargetType)value,一般都是把類型較大的value強制轉為類型較小的TargetType,簡稱“大轉小”,容易產生溢出(關于溢出,已經在前面介紹)
示例程序:
public static void main(String[] args){int iValue = 233;//將int類型的值強制轉換為byte,發生溢出byte bValue = (byte)iValue; //輸出bValueSystem.out.println("bValue:" + bValue);//輸出-23double dValue = 4.44;//將double類型的值強制轉換為intint iValue2 = (int)dValue;//輸出iValue2System.out.println("iValue2: " + iValue2);//輸出4}????????????????3)表達式類型自動提升
??????????????????????所謂的表達式類型自動提升,有兩方面的意義:
??????????????????????1、byte、short、char,這幾個類型中的一種或多種在一個表達式中出現時,該表達式最后的類型都是int
示例程序:
public static void main(String[] args){byte bValue = 1;short sValue = 2;char cValue = 3;byte bResult = bValue + bValue;short sResult = sValue + bValue;char cResult = cValue * cValue; }執行效果:
可見,byte、short、char在進行運算的時候,自動提升為了int
??????????????????????2、在一個表達式中,如果有多種數據類型的變量(或常量)存在,那么該表達式中的其他變量(或常量)的類型將被提升到該表達式中最高等級操作數相同的類型,從而使整個表達式的類型與最高等級操作數的類型相同。簡單地來說,就是最高類型決定了該表達式的最終類型。
示例程序:
public static void main(String[] args){//定義一個short類型的變量short sValue = 5;//下面語句將發生錯誤,因為=右邊最大的數據類型是int類型,//所以右邊整體是int類型,而int類型無法自動轉換為short類型sValue = sValue - 9;byte b = 40;char c = 'a';int i = 23;double d = .231;//=右邊最高類型是double,所以應該賦給一個double類型的變量double result = b + c + d * i;//result的類型是doubleSystem.out.println("result : " + result);}三、運算符
????????1、算術運算符:
????????????????算術運算符包括加(+)、減(-)、乘(*)、除(/)、取余(%),其中,加減乘三種運算,需要注意的是確保運算結果不超過賦值目標的類型大小。而除法和取余則需要考慮到更多的問題,見如下示例程序:
public static void main(String args){double d1 = 5.5;double d2 = 4.6;double div = d1 / d2;//輸出d1 / d2的結果:1.1956521739130437System.out.println("d1 / d2 :" + (d1 / d2));//輸出正無窮大 InfinitySystem.out.println("5.0 / 0 :" + (5.0 / 0));//輸出負無窮大:-InfinitySystem.out.println("-5.0 / 0 :" + (- 5.0 / 0));//輸出非數:NaNSystem.out.println("0.0 / 0: " + (0.0 / 0)); //拋“除數不能為0”異常System.out.println("5 / 0" + (5 / 0)); }效果如圖:
????????2、賦值運算符:賦值運算符”=”比較簡單,過程就是將”=”右邊的數值賦給左邊的變量,此處不再解釋
????????3、位運算符:
????????????????位運算符針對的對象是整型變量或直接量,可分為以下幾組:
????????????????1)&、|、^:
?????????????????????????這一組分別是按位與、按位或、按位異或,操作的類型的都是整型的變量或直接量。進行操作時,將操作符兩邊的操作數都表示為二進制,對應的每一位按照下表的規則進行匹配運算:
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
示例程序:
public static void main(String[] args){//5的二進制表示是:0000_0000_0000_0000_0000_0000_0000_0101//9的二進制表示是:0000_0000_0000_0000_0000_0000_0000_1001//按位與,結果是0000_0000_0000_0000_0000_0000_0000_0001,,也就是1System.out.println("5 & 9 :" + (5 & 9));//按位或,結果是0000_0000_0000_0000_0000_0000_0000_1101,,也就是13System.out.println("5 | 9 :" + (5 | 9));//按位異或,結果是0000_0000_0000_0000_0000_0000_0000_1100,也就是12System.out.println("5 ^ 9 :" + (5 ^ 9));}結果如下:
????????????????2)~:
?????????????????????????這一組只有一個操作符——按位非。為什么把它單獨放在第二組呢,因為它是位操作符中唯一的一個單目運算符(即只有一個操作數的運算符),它的運算規則是:將操作數的每一位(包括符號位)進行取反操作,即遇1則0,遇0則1
示例程序:
public static void main(String[] args){//5的二進制表示是:0000_0000_0000_0000_0000_0000_0000_0101//-5的二進制表示是:1111_1111_1111_1111_1111_1111_1111_1011(補碼)//5取反就是:1111_1111_1111_1111_1111_1111_1111_1010(補碼)//轉換成原碼就是:1000_0000_0000_0000_0000_0000_0000_0110,也就是-6System.out.println("~5 :" + (~5));//-5取反就是:0000_0000_0000_0000_0000_0000_0000_0100(補碼),也就是4(正數的補碼和原碼相同)System.out.println("~-5 :" + (~-5));//-5取反 }結果如下:
????????????????3)<<、>>、>>>:
?????????????????????????這一組操作符的功能都是對源操作數進行移位。其中:
?????????????????????????<<:左移運算符,x << y,將x向左移動y位,右邊出來的空位補0
?????????????????????????>>:右移運算符,x >> y,將x向右移動y位,左邊多出來的位數補上符號位
?????????????????????????>>>:無符號右移運算符,x >>> y,將x向右移動y位,左邊多出來的位數補上符號位
示例程序:
public static void main(String[] args){//-5的二進制表示是:1111_1111_1111_1111_1111_1111_1111_1011(補碼)//-5左移1位,結果是1111_1111_1111_1111_1111_1111_1111_0110(補碼)//轉換成原碼:1000_0000_0000_0000_0000_0000_0000_1010,也就是-10System.out.println("-5 << 1:" + (-5 << 1));//-5右移1位,結果是1111_1111_1111_1111_1111_1111_1111_1101(補碼)//轉換成原碼:1000_0000_0000_0000_0000_0000_0000_0011,也就是-3System.out.println("-5 >> 1:" + (-5 >> 1));//-5右移1位//-5無符號右移1位,結果是0111_1111_1111_1111_1111_1111_1111_1101(正數的原碼和補碼相同),即2147483645System.out.println("-5 >>> 1:" + (-5 >>> 1));//-5無符號右移1位 }結果:
???????????????移位操作符的注意點:
?????????????????????????1.低于int類型的類型(byte、short、char)在運算的時候,統統先轉化為int(這一點和算術運算符相同)
證明:
public static void main(String[] args){byte bValue = 10;short sValue = 300;char cValue = 'a';byte bResult = bValue << 2;short sResult = sValue >> 2;char cResult = cValue >>> 1;}結果:
由上圖可知,各種整型經移位操作后,都轉化成了int類型
?????????????????????????2.當移位的位數超過被移位對象本身的類型的位數,例如 32 >> 100,我們知道32是int類型,它的位數是32,但現在要向右移動100位,這時就需要將移動的位數換成100 % 32 = 4位,即新移動位數 = 原移動位數 % 被移動類型位數,所以32 >> 100 與 32 >> 4 是一樣的
證明:
public static void main(String[] args){byte bValue = 10;int result1 = bValue << 66;int result2 = bValue << 2;System.out.println("result1 : " + result1);System.out.println("result2 : " + result2);}結果:
????????由上圖可知,將bValue左移66位和左移2位是一樣的,因為根據新移動位數 = 原移動位數 % 被移動類型位數,2 = 66 % 8
????????4、比較運算符:
????????????????比較運算符包括大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、是否等于(==)、是否不等于(!=),運算結果為布爾類型,若為真則返回true,否則返回false,由于比較運算符比較簡單,此處不再贅述。
????????5、邏輯運算符:
????????????????邏輯運算符用于操作兩個boolean類型的變量或常量。我把它分為以下幾類:
????????????????1)與系:
??????????????????????????包括&&(短路與)和&(非短路與)
??????????????????????????共同點:兩真才真——操作符兩邊都必須為true,結果才為true
??????????????????????????不同點:
??????????????????????????&&是左假即為假——&&左邊的操作數如果為false,立即終止計算,返回false
??????????????????????????&是左假看右邊——&左邊的操作數為false時,并不立即返回false,還要再看右邊的操作數,然后再返回false
示例程序:
public static void main(String[] args){int iValue1 = 10;int iValue2 = 1;//短路與,左邊"iValue1 > 10"為false,右邊"iValue2++ >= 1"不執行if((iValue1 > 10) && (iValue2++ >= 1)){iValue1 = 0; }System.out.println("iValue1 :" + iValue1);System.out.println("iValue2 :" + iValue2);System.out.println();//非短路與,兩邊都會執行if((iValue1 > 10) & (iValue2++ >= 1)){iValue1 = 0; }System.out.println("iValue1 :" + iValue1);System.out.println("iValue2 :" + iValue2);}效果:
????????????????2)或系:
??????????????????????????包括短路或(||)和非短路或(|),共同點與不同點和與系完全類似:
??????????????????????????共同點:兩真才真——操作符兩邊都必須為true,結果才為true
??????????????????????????不同點:
??????????????????????????||是左真即為真——||左邊的操作數如果為true,立即終止計算,返回true
??????????????????????????|是左真看右邊——&左邊的操作數為true時,并不立即返回true,還要再看右邊的操作數,然后再返回true
示例程序:
public static void main(String[] args){int iValue1 = 10;int iValue2 = 1;//短路或,左邊"iValue1 <= 10"為true,右邊iValue2++ >= 1不執行if((iValue1 <= 10) || (iValue2++ >= 1)){iValue1 = 0; }System.out.println("iValue1 :" + iValue1);System.out.println("iValue2 :" + iValue2);System.out.println();//非短路或,兩邊都要執行if((iValue1 <= 10) | (iValue2++ >= 1)){iValue1 = 0; }System.out.println("iValue1 :" + iValue1);System.out.println("iValue2 :" + iValue2);}效果:
????????????????3)其他:
??????????????????????????包括!(非)、^(異或),前者是一個單目運算符,運算規則是——遇true則false,遇false則true,后者是一個雙目運算符,運算規則是——不同則true,相同則false
????????6、三目運算符:
??????????????????????????Java中唯一的一個三目運算符是:
??????????????????????????[expression]?if-true-statement:if-false-statement
??????????????????????????其中,expression是一個結果為boolean類型的表達式,如果結果為true,則返回if-true-statement,否則返回if-false-statement
示例程序:
public static void main(String[] args){int iValue = 10;//[expression]部分為false,返回if-false-statementSystem.out.println(iValue > 10 ? "汪峰": "章子怡");//[expression]部分為true,返回if-true-statementSystem.out.println(iValue != 1 ? "汪峰" : "章子怡");}效果:
總結
以上是生活随笔為你收集整理的《疯狂Java讲义》第3章——数据类型和运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipguard软件安装管理策略
- 下一篇: 红旗linux镜像文件iso,红旗Lin