java基礎學習(五):標識符、關鍵字和數據類型

Java語言也和其他編程語言一樣,使用標識符作爲變量、對象的名字,也提供了系列的關鍵字用以實現特別的功能。

5.1 分隔符

Java 語言裏的分號(;)、花括號({})、方括號([])、圓括號(())、空格、圓點(.)都具有特殊的分隔作用,因此被統稱分隔符。

5.1.1 分號

Java 語言裏對語句的分隔不是使用回車來完成的,Java 語言採用分號 ( ; ) ;作爲語句的分隔。因此,每個Java 語句必須使用分號作爲結尾。Java 程序允許行書寫多個語句,每個語句之間以分號隔開即可,一個語句也可以跨多行,只要在最後結束的地方使用分號結束即可。例如,下面語句都合法的Java語句。

int age = 25; String name = "李剛"
String hello = "你好!" +
	"Java";

值得指出的是, Java 語句可以跨越多行書寫,但一個字符串、變量名不能跨越多行。例如 下面的Java 語句是錯誤的。

// 字符串不能跨越多行
String a = "dddddd
	xxxxxx";
// 變量名不能跨越多行
String na
	me = "李剛";

!!! 大家最好不要像上面這樣寫,一點用都沒有。行行寫好規範。

5.1.2 花括號

花括號的作用就是定義一個代碼塊,一個代碼塊指的就是" {“和”}"所包含的一段代碼,代碼塊在邏輯上是一個整體,對Java 語言而言,類定義部分必須放在一個代碼塊裏,方法體部分也必須放在個代碼塊裏。除此之外,條件語句中的條件執行體和循環語句中的循環體通常也放在代碼塊裏。

5.1.3 方括號

方括號的主要作用是用於訪問數組元素 方括號通常緊跟數組變量名,而方括號裏指定希望訪問的數組元素的索引。
  例如,如下代碼:

// 下面代碼試圖爲名爲a的數組的第四個元素賦值
a[3]=3;

5.1.4 圓括號

圓括號是一個功能非常豐富的分隔符:定義方法時必須使用圓括號來包含所有的形參聲明,調用方法時也必須使用圓括號來傳入實參值;不僅如此,圓括號還可以將表達式中某個部分括成一個整體,保證這個部分優先計算;除此之外,圓括號還可以作爲強制類型轉換的運算符。

5.1.5 空格

Java 言使用空格分隔一條語句的不同部分。Java 語言是一門格式自由的語言,所以空格幾乎可以出現在 Java 程序的任何地方 ,也可以出現任意多個空格,但不要使用空格把 個變量名隔開成兩個,這將導致程序出錯。
  Java 語言中的空格包含空格符 (Space) 、製表符 (Tab) 和回車(Enter) 等。

5.1.6 圓點

圓點(.)通常用作類/對象和它的成員(包括成員變量、方法和內部類)之間的分隔符,表明調用某個類或某個實例的指定成員 。關於圓點分隔符的用法,後面還會有更進一步的介紹,此處不再贅述。

5. 2 Java 9 的標識符規則

標識符就是用於給程序中變量、類、方法命名的符號。Java語言的標識符必須以字母、下畫線( _ )、美元符( $ )開頭,後面可以跟任意數目的字母、數字、下畫線( _ )和美元符( $ )。此處的字母並不侷限於26個英語字母,甚至可以包含中文字符、日文字符等。
  由於 Java 9 支持 Unicode 8.0 字符集,因此 Java 的標識符可以使用 Unicode 8.0 所能表示的多種語字符。 Java語言是區分大小寫的,因此abc 和Abc是兩個不同的標識符。
  Java 9 規定:不允許使用單獨的下畫線( _ ) 作爲標識符。也就是說,下畫線必須與其他字符組合在一起才能作爲標識符。使用標識符,需要注意如下規則:

  • 標識符可以由字母、數字、下畫線( _ ) 和美元符 ( $ ) 組成,其中數字不能第一個
  • 標識符不能是Java關鍵字和保留字,但可以包含關鍵字和保留字
  • 標識符不能包含空格
  • 標識符只能包含美元符 ( $ ),不能包含@、#等其他特殊字符。

5.3 Java關鍵字

Java語言中有一些具有特殊用途的單詞被稱爲關鍵字(keyword),當定義標識符時,不要讓標識符和關鍵字相同。例如,下面代碼會報錯:

//試圖定義一個名爲boolen的變量,但boolen是關鍵字,不能作爲標識符
int boolen;

Java的所有關鍵字都是小寫,TURE,FALSE和NULL都不是Java關鍵字,Java共有50個關鍵字。

abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while

上面的50個關鍵字,enum是從Java 5 新增的關鍵字,用於定義一個枚舉。而goto和const這兩個關鍵字也被稱爲保留字(reserved word),保留字的意思是,Java現在還未使用這兩個關鍵字,可能在未來版本中會用到。不僅如此,Java還提供了三個特殊的直接量(literal):true、false和null。

5.4 數據類型分類

Java 語言是強類型(strongly typed)語言,強類型包含兩方面:1. 所有的變量必須先聲明、後使用。 2. 指定類型的變量只能接受類型與之匹配的值。這意味着每個變量和每個表達式都有一個在編譯時就確定的類型。類型限制了一個變量能被賦的值,限制了一個表達式可以產生的值,限制了在這些值上可以進行的操作,並確定了這些操作的含義。

!!! 哎,這些真的學過很多遍了,這裏就少寫一點吧,感覺也不會很想回來看。

Java語言支持的類型分成兩類:基本類型(Primitive Type) 和 引用類型( Reference Type)。

基本類型包括boolean類型和數值類型。數值類型有整數類型和浮點類型。整數類型包括bytes、short、int、long、char,浮點類型包括float 和 double。

引用類型包括類、接口和數組類型,還有一種特殊得null類型,所謂引用數據類型就是對一個對象得引用,對象包括實例和數組兩種。實際上,引用類型變量就是一個指針,只是Java語言沒有指針這個說法。

5.5 基本數據類型

在這裏插入圖片描述

5.5.1 整型

整型一般包括下面4種類型:

  • byte:一個byte類型整數在內存裏佔8位,表數範圍是:-128(-2^7)−128(−27)~ 127(2^7-1)127(27−1)
  • short: 一個short類型整數在內存裏佔16位,表數範圍是:-32768(-2^{15})−32768(−215) ~ 32767(2^{15}-1)32767(215−1)
  • int: 一個int類型整數在內存裏佔32位,表數範圍是: -2147483648(-2^{31})−2147483648(−231) ~ 2147483647(2^{31}-1)2147483647(231−1)
  • long: 一個long類型整數在內存裏佔64位,表數範圍:(-2{63})(−263)~(2{63}-1)(263−1)

int 是最常用的整數類型,因此在通常情況下,直接給出一個整數值默認就是 int 類型。除外,有如下兩種情形必須指出:

  • 如果直接將一個較小的整數值(在 byte 或short 類型的表數範圍內〉賦給 byte或short 變量,系統會自動把這個整數值當成tyte 或者 short 類型來處理。
  • 如果使用一個巨大的整數值(超出了 nt 類型的表數範圍)時 Java 不會自動把這個整數值當成long 類型來處理。如果希望系統把 個整數值當成 long 類型來處理,應在這個整數值後增加 l 或者 L作爲後綴 。通常推薦使用 L,因爲英文字母 l 很容易跟數字 1 搞混。
//下面正確
byte a = 56;
/*
下面代碼是錯誤的,系統不會把9999999999999當成long類型處理
所以超出int的表數範圍,從而引起錯誤
*/
// long bigValue = 9999999999999
// 下面代碼是正確的,在巨大的整數數值後使用L後綴,強制使用long類型
long bigValue2 = 92312323123242311L;

PS: 可以把一個較小的整數值(在 int 類型的表數範圍以內)直接賦給一個 long 類型的變量,這並不是因爲 Java 會把這個較小的整數值當成 long 類型來處理, Java 依然把這個整數值當成 int 類型來處理,只是因爲 int 類型的值會自動類型轉換到 long 類型。

Java中整數值有4種表達方式:十進制、二進制、八進制和十六進制,其中二進制的整數以0b 或 0B開頭;八進制的整數以0開頭;十六進制的整數以0x或者0X開頭,其中10~15 分別以a ~ f 來表示。

//以0開頭的整數值是八進制的整數
int octalValue = 013;
// 以0x或0X開頭的整數值是十六進制的整數
int hexValue1 = 0x13;
int hexValue2 - 0XaF;

某些時候,程序需要直接使用二進制整數,二進制整數更“真實”,更能表達整數在內存中的存在形式。

//定義兩個8位的二進制整數
int binVal1 = 0b11010100;
byte binVal2 = 0B01101001;

//定義一個32位的二進制整數,最高位是符號爲
int binVal3 = 0B10000000000000000000000000000011;
System.out.println(binVall); //輸出212
System.out.println(binVal2);  //輸出105
System.out.println(binVal3);  //輸出-2147483645

記住,當定義32位的二進制整數時,最高位其實是符號位,當符號位是1時,表明它是一個負數,負數在計算機裏是以補碼的形式存在的,因此還需要換算成原碼。

所有數字在計算機底層都是以二進制形式存在的,原碼是直接將一個數值換算成二進制數。但計算機以補碼的形式保存所有的整數。補碼的計算規則:正數的補碼和原碼完全相同,負數的補碼是其反碼加1;反碼是對原碼按位取反,只是最高位(符號位)保持不變。
在這裏插入圖片描述

/*
定義一個8位的二進制整數,該數值默認佔32位,因此它是一個正數
只是強制類型轉換成byte時產生了溢出,最終導致binVal4變成了-23
*/
byte binVal4 = (byte)0b11101001;
/*定義一個32位的二進制整數,最高位是1
但由於數值後添加了L後綴,因此該整數實際佔64位,第32位的l不是符號位
因此binVal5的值等於2的31次方 +2 +1
*/
long binVal5 =  0B100000000000000000000000000000llL;
System. out . println(binVa14) ; //輸出 23
System.out.println(binVa15 ); 11 輸出 2147483651

上面程序中粗體字代碼與前面程序片段的粗體字代碼基本相同,只是在定義 進制整數時添加了"L" 後綴,這就表明把它當成 lon 類型處理,因此該整數實際佔 64位,此時的第 32 位不再是符號位,因此它依然是一個正數。
  至於程序中的 byte bin Val4 = (byte )0b1110100;代碼,其中 0bl1101001 然是 32 位的正整數是程序進行強制類型轉換時發生了溢出,導致它變成了負數。

5.5.2 字符型

Java語言使用16位的Unicode 字符集作爲編碼方式,而Unicode被設計成支持所有語言,所以中文當然也適合的呀。字符型值有如下三種表示形式:

  • 直接通過單個字符來指定字符型值,例如’A’、‘9’、‘0’等
  • 通過轉義字符表示特殊字符型值,例如’\n’,‘\t’等
  • 直接使用Unicode 值來表示字符型值,格式是’\uXXXX’,其中XXXX代表一個十六進制的整數。

在這裏插入圖片描述
  由於計算機底層保存字符時,實際是保存該字符對應的編號,因此char類型的值也可以直接作爲整型來使用,它相當於16位的無符號整數,表數範圍是0~65535.
  char類型的變量,值完全可以參與加、減、乘、除等數學運算,也可以比較大小——實際上都是用該字符對應的編碼參與運算。

public class CharTest
{
	public static void main(String[] args)
	{
		//直接指定單個字符作爲字符值
		char aChar = 'a';
		//使用轉義字符來作爲字符值
		char enterChar = '\r';
		//使用Unicode編碼值來指定字符值
		char ch = '\u9999';
		//將輸出一個‘香’字符
		System.out.println(ch);
		//定義一個‘瘋’字符值
		char zhong = '瘋';
		//直接將一個char變量當成int類型變量使用
		int zhongValue = zhong
		System.out.println(zhongValue);
		//直接把一個0~65535範圍內的int整數賦給一個char變量
		char c = 97;
		System.out.println(c);
	}
}

注意:
char 類型使用單引號括起來,而字符串使用雙引號括起來,關於 String 類的用法以及對應的各種方法,讀者應該通過查 API 文檔來掌握,以 來練習使用 API 文檔。

值得指出的是, Java 語言中的單引號、雙引號和反斜線都有特殊的用途 ,如果一個字符串中包含了這些特殊字符,則應該使用轉義字符的表示形式 例如,在 Java 程序中表示 個絕對路徑 :曰 :\codes" ,但這種寫法得不到期望的結果 因爲 Java 會把反斜線當成轉義字符,所以應該寫成這種形式 “c:\codes” , 只有同時寫兩個反斜線, Java 會把第一個反斜線當成轉義字符,和後 個反斜線組成真正的反斜線。

5.5.3 浮點型

Java的浮點類型有兩種:float喝double。Java的浮點類型有固定的表數範圍和字段長度。Java的浮點數遵循 IEEE 754標準,採用二進制數據的科學記數法來表示浮點數,對於float類型,第1位是符號位,接下來8位表示指數,在接下來的23位表示尾數;對於double類數值,第1位也是符號位,接下來的11位表示指數,再接下來的52位表示尾數。

double類型代表雙精度浮點數,float類型代表單精度浮點數。一個double類型的數值佔8字節、64位,一個float類型的數值佔4字節、32位。Java語言的浮點數有兩種表示形式:

  • 十進制數形式:這種形式就是簡單的浮點數,例如:5.12、512.0、.512。浮點數必須包含一個小數點,否則會被當成int類型處理。
  • 科學計數法形式:例如 5.12e2(即 5.1210^25.12∗102),或5.12e2(即 5.1210^25.12∗102)

Java 語言的浮點類型默認是 double 類型,如果希望 Java 個浮點類型值當成 float 類型處理,應該在這個浮點類型值後緊跟f或F。5.12 代表一個 doubl 類型的值,佔64位的內存空間 5.12f 或者 5.12F 才表示一個 float 類型的值,佔32位的內存空間。

Java 還提供了 個特殊的浮點數值:正無窮大、負無窮大和非數,用於表示溢出和出錯。正無窮大通過 Double或 Float 類的 POSITIVE_INFINITY 表示:負無窮大通過Double 或Float 類的NEGATIVE_INFINITY 表示,非數通過 Double或Float 類的 NaN 表示。所有的正無窮大數值都是相等的,所有的負無窮大數值都是相等的;而NaN不與任何數值相等,甚至和NaN都不相等。

只有浮點數除以0纔可以得到正無窮大或負無窮大,因爲 Java 語言會自動把和浮點數運算的0(整數)當成 0.0(浮點數)處理。如果 個整數值除以 ,則會拋 出一個異常 :ArithmeticException: / by zero(除以 異常)

public class FloatTest
{
	public static void main(String[] args)
	{
		float af = 5.2345556f;
		//下面將看到af的值已經發生了改變
		System.out.println(af);
		double a = 0.0;
		double c = Double.NEGATIVE_INFINITY;
		float d = Float.NEGATIVE_INFINITY;
		//看到float和double的負無窮大是相等的
		System.out.println(c==d);
		//0.0 除 0.0 將出現非數
		System.out.println(a /a);
		//兩個非數之間是不相等的
		System.out.println(a/a == Float.NaN);
		//所有無窮大都是相等的
		System.out.println(6.0/ 0 == 555.0/0);
		//負數除以0.0 得到負無窮大
		System.out.println( -8/a);
		//下面代碼會拋出異常
		//System.out.println(0/0)
	}
}

5.5.3 數值中使用下畫線分割

爲了很好的計算數字的位數,可以使用下畫線來進行對數字的分割。

public class UnderscoreTest
{
	public static void main(String[] args)
	{
	//定義一個32位的二進制數,最高位是符號位
	int binVal = 0B1000_0000_0000_0000_0000_0000_0000_0011;
	double pi = 3.14_15_92_65_36;
	System.out.println(binVal);
	System.out.println(pi);
	double height = 8_8_4_8.23;
	System.out.println(height);
	}
}

5.5.4 布爾型

布爾型只有 boolean 類型,用於表示邏輯上的"真"或"假"。在 Java 語言中, boolean 類型的數值只能是 true 和 false ,不能用 0或者非0來代表。其他基本數據類型的值也不能轉換成 boolean 類型。

5.5.5 基本類型的類型轉換

Java語言所提到的7中之間可以互相轉換,有兩種轉換方式:自動類型轉換和強制類型轉換。

5.5.5.1 自動類型轉換

Java 所有的數值型變量可以相互轉換,如果系統支持把某種基本類型的值直接賦給另一種基本類型的變 ,則這種方式被稱爲自動類型轉換,當把一個表數範圍小的數值或變量直接賦給另 個表數範圍大的變時,系統將可以進行自動類型轉換;否則就需要強制轉換。
在這裏插入圖片描述
  如圖所示,視頻中箭頭指的數據類型都可以自行進行轉換。

public class AutoConversion
{
	public static void main(String[] args)
	{
		int a = 6;
		//int 類型可以自動轉換爲float類型
		float f = a;
		//下面將輸出6.0
		System.out.println(f);
		//定義一個byte類型的整數變量
		byte b = 9;
		//下面代碼會出錯,byte類型不能自動轉換爲char類型
		//char c = b;
		// byte類型可以自動轉換爲double類型
		double d = b;
		//輸出9
		System.out.println(d);
	}
}

不僅如此,當把任何基本類型的值和字符串進行連接運算時,基本類型的值將自動轉換爲字符串類型,雖然字符串類型不是基本類型,而是引用類型。因此,如果希望把基本類型轉換爲對應的字符串時,可以把基本類型的值和一個空字符串進行連接。

public class PrimitiveAndString
{
	public static void main(String[] args)
	{
		//下面代碼是錯誤的,因爲S是一個整數,不能直接賦值給一個字符串
		//String str1 = 5;
		//一個基本類型的值和字符串進行連接運算時,基本類型的值自動轉換爲字符串
		String str2 = 3.5f + "";
		//下面輸出3.5
		System.out.println(str2);
		//下面語句輸出7hello
		System.out.println(3+4+"hello!");
		//下面語句輸出Hello!34,因爲ihello!+3會把3當作字符串,再把4當作字符串
		System.out.println("Hello!"+3+4);
	}
}

感覺其實就是從左到右進行格式轉換,並沒有什麼要講的。

5.5.5.2 強制類型轉換

上面的圖,如果希望將箭頭右邊的類型轉換爲左邊的類型,則必須進行強制類型轉換。如果數據過大,會造成數據溢出。

public class NarrowConversion
{
	public static void main(String[] args)
	{
		int iValue = 233;
		//強制把一個int類型的值轉換爲byte類型的值
		byte bValue = (byte)iValue;
		//將輸出-23
		System.out.println(bValue);
		double dValue = 3.98;
		//強制把一個double類型的值轉換爲int類型的值
		int tol = (int)dValue;
		//將輸出3
		System.out.println(tol);
	}
}

在這裏插入圖片描述
32 位int 類型的 233 在內存中如圖 上面所示,強制類型轉換爲 位的 byte類型,則需要截斷前面的24位,只保留右邊8位,最左邊1的一個符號位,此處表明這是一個負數,負數在計算機裏是以補碼形式存在的,因 還需要換算成原碼將補碼減1,得到反碼形式,再將反碼取反就可以得到原碼。
&esmp; 經常上網的讀者可能會發現有些網頁上會包含臨時生成的驗證字符串,那麼這個隨機字符串是如何生成的呢?可以先隨機生成一個在指定範圍內的int數字,然後強制轉換爲char類型。

public class RandomStr
{
	public static void main(String[] args)
	{
		//定義一個空字符串
		String result = "";
		//進行6次循環
		for(int i = 0; i<6;i++)
		{
			//生成一個97~122之間的int整數
			int intVal = (int)(Math.random()*26+97);
			//將intValue強制轉換爲char後加到result後面
			result = result + (char)intVal;
		}
		//輸出
		System.out.println(result);
	}
}

下面這行代碼容易報錯:

//直接把5.6賦值給float類型變量將出現錯誤,因爲5.6默認是double類型
float a = 5.6;
//因此將 5.6 賦值給 float 類型變量將導致錯誤,必須使用強制類型轉換纔可以
float a = (float)5.6;

把字符串轉換爲int類型:

String a = "45"
int iValue = Integer.parseInt(a);

Java爲8種基本類型都提供了對應的包裝類:boolean對應Boolean、byte對應Byte、short對應Short、int對應Integer、long對應Long、char對應Character、float對應Float、double對應Double。8個包都有parseXxx(String str)將字符型轉換爲基本類型。

5.5.5.3 表達式類型的自動提升

當一個算術表達式中包含多個基本類型的值時,整個算術表達式的數據類型將發生自動提升。Java定義瞭如下的自動提升規則。

  • 所有byte類型、short類型和char類型將被提升到int類型
  • 整個算術表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。
//定義一個short類型
short sValue = 5//表達式中的sValue將自動提升到int類型,則右邊的表達式類型爲int
//將一個int類型值賦給short類型變量將發生錯誤
sValue = sValue - 2;

爲什麼會報錯呢?sValue -2 會變成整型變量,然後賦值到short類型會報錯。

byte b = 40;
char c = 'a';
int i = 23;
double d = .314;
//右邊表達式中最高等級操作數爲d
//則右邊表達式的類型爲double類型,故賦給double類型變量
double result = b+c +i *d;
//輸出 144.222
System.out.println(result);

必須指出,表達式的類型將嚴格保持和表達式中最高等級操作數相同的類型。下面代碼中兩個int 類型整數進行除法運算,即使無法除盡, 也將得到 int 類型結果。

int val = 3 ; 
// 右邊表達式中兩個操作數都是工 nt 類型,故右邊表達式的類型爲 int
// 雖然 23 不能除盡,但依然得到 in 類型整數
int intResult = 23 / val ; 
System.out.println(intResult); // 將輸出 7

5.5.5 直接量

直接量是指在程序中通過源代碼直接給出的值。例如int a = 5。Java支持8種類型的直接量:

  • int 類型的直接量:在程序中直接給出整型數值,可分爲二進制 、十進制、八進制和十六進制4種,其二進制 需要0B和0b 開頭,八進制進制需要0開頭,十六進制需要 0x 和0X開頭,123、012 (對應十進制的 10)、0x12 (對應十進制的 18)等
  • long 類型的直接量: 在整型數值後添加1L或l後就變 long 類型的直接量。 例如 3L和 0x12L.
  • float 類型的直接量:在一個浮點數後添加f或F,就變成了 float 類型的直接量,這個浮點數可以是標準小數形式,也可以是科學計數法形式。例如 5.34F、3.14E5f
  • double 類型的直接量:直接給出一個標準小數形式或者科學計數法形式的浮點數就是 double型的直接量。 例如 5.34 3.14E5
  • boolean 類型的直接量: 這個類型的直接量只有 true false
  • char 類型的直接量: char 類型的直接量有三種形式,分別是用單引號括起來的字符、轉義字符Unicode 值表示的字符,例如’a’ 、‘\n’、‘\u0061’
  • String 類型的直接 個用雙引號括起來的字符序列就是 String 類型的直接量。
  • null 類型的直接量 這個類型的直接量只有 個值,即 null

感覺就是直接賦值,沒什麼好講的。

5.5.6 運算符

Java 語言中的運算符可分爲如下幾種:

  • 算術運算符
  • 賦值運算符
  • 比較運算符
  • 邏輯運算符
  • 位運算符
  • 類型相關運算符

5.5.6.1 算術運算符

基本運算符:加(+)、減(-)、乘(*)、除(/)和求餘(%),自加(++)。這個簡單不寫了

5.5.6.2 位運算符

Java支持的位運算符有如下7個:

  • &:按位與。當兩位同時爲1時才返回1
  • | : 按位或。只要有一位爲1時才返回1
  • ~:按位非。單目運算符,將操作數的每個位(包括符號位)全部取反
  • ^:按位異或:當兩個相同時返回0,不同是返回1
  • << :左移運算符
  • >> : 右移運算符
  • >>>: 無符號右移運算符
//會轉換成二進制再取運算
System.out.println(5 & 9); //輸出1
//5爲0000101, 9爲00001001,與運算得000001

負數的話,要先轉換成補碼,在進行位運算。比如-5的話,需要先除符號位取反得到反碼,再加1得到補碼,進行運算。

注意:

  • 左移一律以0來補充
  • 右移根據符號位進行補充
  • 無符號位右移以0進行補充

進行移位運算時還要遵循如下規則:

  • 對於低於 int 類型(如 byte、short和char) 的操作數總是先自動類型轉換爲 int 類型後再移位。
  • 對於int類型的整數移位後a>>b,當b>32時,系統先用b對32求餘 (因爲 int 類型只有 32 位),得到的結果纔是真正移位的位數。例如, a>>33 和a>>1 的結果完全 樣,而 a>>32 的結果和a相同
  • 當進行移位運算時,只要被移位的二進制碼沒有發生有效住的數字丟失(對於丘數而言,通常指被移出的位全部都是 0) ,不難發現左移 位就相當於來以2n2*n*次方,右移位則是除以2n2n次方 不僅如此,進行移位運算不會改變操作數本身 ,只走得到 了一個新的運算結果,而原來的操作數本身是不會改變的。

5.5.6.3 邏輯運算符

邏輯運算符用於操作兩個布爾型的變量或常量 邏輯運算符主要有如下6個:

  • &&: 與,前後兩個操作數必須都是 true 才返回 true 否則返回 false。
  • &:不短路與,作用與&&相同,但不會短路
  • ||:或,只要兩個操作數中有 個是 true ,就可以返回 true ,否則返回 false
  • |: 不短路或,作用與 || 相同,但不會短路
  • !: 非,只需要一個操作數,如果操作數爲 true ,則返回 fa se 如果操作數爲 false ,則返回 true
  • ^:異或,當兩個操作數不同時才返回 true,如果兩個操作數相同則返回 false

至於 || 和 |,以及 && 和 & 的區別:對於短路與&&,會先執行左邊的運算,如果返回true,則不會運算右邊,而 | 兩邊都會進行運算。&&一樣

5.5.6.4 三目運算符

三目運算符只有一個: ?:

(experssion) ? if-true-satement : if-else-statement;

三目運算符的規則是 先對邏輯表達式 expresslO 求值,如果邏輯表達式返回 true ,則返回第二操作數的值,如果邏輯表達式返回 fa se ,則返回第三個操作數的值。我記得python是有這個運算的。

5.5.6.5 運算符的結合性和優先級

所有的數學運算都認爲是從左向右運算的, Java 語言中大部分運算符也是從左向右結合的,只有單目運算符、賦值運算符和 目運算符例外,其中,單目運算符、賦值運算符和三目運算符是從右向左結合的 ,也就是從右向左運算。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章