日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

《疯狂Java讲义》第3章——数据类型和运算符

發布時間:2023/12/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《疯狂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)整形:

????????各種整型的表示范圍如下表:

類型位數字節數大小最高位
byte81-2^7 ~ 2^7 - 1符號位
short162-2^15 ~ 2^15 - 1符號位
int324-2^31 ~ 2^31 - 1符號位
long648-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)&、|、^:

?????????????????????????這一組分別是按位與、按位或、按位異或,操作的類型的都是整型的變量或直接量。進行操作時,將操作符兩邊的操作數都表示為二進制,對應的每一位按照下表的規則進行匹配運算:

操作數1操作數2按位與(&)按位或(|)按位異或(^)
00000
01011
10011
11110


示例程序:

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章——数据类型和运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。