Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向對象程序設計語言和 Java 平臺的總稱。由 James Gosling和同事們共同研發(fā)督怜,并在 1995 年正式推出殴瘦。
后來 Sun 公司被 Oracle (甲骨文)公司收購,Java 也隨之成為 Oracle 公司的產(chǎn)品号杠。
Java分為三個體系:
- JavaSE(J2SE)(Java2 Platform Standard Edition蚪腋,java平臺標準版)
- JavaEE(J2EE)(Java 2 Platform,Enterprise Edition丰歌,java平臺企業(yè)版)
- JavaME(J2ME)(Java 2 Platform Micro Edition,java平臺微型版)屉凯。
2005 年 6 月立帖,JavaOne 大會召開,SUN 公司公開 Java SE 6悠砚。此時晓勇,Java 的各種版本已經(jīng)更名,以取消其中的數(shù)字 "2":J2EE 更名為 Java EE灌旧,J2SE 更名為Java SE绑咱,J2ME 更名為 Java ME。
主要特性
-
Java 語言是簡單的:
Java 語言的語法與 C 語言和 C++ 語言很接近枢泰,使得大多數(shù)程序員很容易學習和使用描融。另一方面,Java 丟棄了 C++ 中很少使用的宗苍、很難理解的稼稿、令人迷惑的那些特性,如操作符重載讳窟、多繼承让歼、自動的強制類型轉換。特別地丽啡,Java 語言不使用指針谋右,而是引用。并提供了自動分配和回收內(nèi)存空間补箍,使得程序員不必為內(nèi)存管理而擔憂改执。
-
Java 語言是面向對象的:
Java 語言提供類、接口和繼承等面向對象的特性坑雅,為了簡單起見辈挂,只支持類之間的單繼承,但支持接口之間的多繼承裹粤,并支持類與接口之間的實現(xiàn)機制(關鍵字為 implements)终蒂。Java 語言全面支持動態(tài)綁定,而 C++語言只對虛函數(shù)使用動態(tài)綁定遥诉∧雌總之,Java語言是一個純的面向對象程序設計語言矮锈。
-
Java語言是分布式的:
Java 語言支持 Internet 應用的開發(fā)霉翔,在基本的 Java 應用編程接口中有一個網(wǎng)絡應用編程接口(java net),它提供了用于網(wǎng)絡應用編程的類庫苞笨,包括 URL债朵、URLConnection子眶、Socket、ServerSocket 等葱弟。Java 的 RMI(遠程方法激活)機制也是開發(fā)分布式應用的重要手段壹店。
-
Java 語言是健壯的:
Java 的強類型機制、異常處理芝加、垃圾的自動收集等是 Java 程序健壯性的重要保證硅卢。對指針的丟棄是 Java 的明智選擇。Java 的安全檢查機制使得 Java 更具健壯性藏杖。
-
Java語言是安全的:
Java通常被用在網(wǎng)絡環(huán)境中将塑,為此,Java 提供了一個安全機制以防惡意代碼的攻擊蝌麸。除了Java 語言具有的許多安全特性以外点寥,Java 對通過網(wǎng)絡下載的類具有一個安全防范機制(類 ClassLoader),如分配不同的名字空間以防替代本地的同名類来吩、字節(jié)代碼檢查敢辩,并提供安全管理機制(類 SecurityManager)讓 Java 應用設置安全哨兵。
-
Java 語言是體系結構中立的:
Java 程序(后綴為 java 的文件)在 Java 平臺上被編譯為體系結構中立的字節(jié)碼格式(后綴為 class 的文件)弟疆,然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行戚长。這種途徑適合于異構的網(wǎng)絡環(huán)境和軟件的分發(fā)。
-
Java 語言是可移植的:
這種可移植性來源于體系結構中立性怠苔,另外同廉,Java 還嚴格規(guī)定了各個基本數(shù)據(jù)類型的長度。Java 系統(tǒng)本身也具有很強的可移植性柑司,Java 編譯器是用 Java 實現(xiàn)的迫肖,Java 的運行環(huán)境是用 ANSI C 實現(xiàn)的。
-
Java 語言是解釋型的:
如前所述攒驰,Java 程序在 Java 平臺上被編譯為字節(jié)碼格式蟆湖,然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行。在運行時玻粪,Java 平臺中的 Java 解釋器對這些字節(jié)碼進行解釋執(zhí)行隅津,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運行環(huán)境中。
-
Java 是高性能的:
與那些解釋型的高級腳本語言相比奶段,Java 的確是高性能的。事實上剥纷,Java 的運行速度隨著 JIT(Just-In-Time)編譯器技術的發(fā)展越來越接近于 C++痹籍。
-
Java 語言是多線程的:
在 Java 語言中,線程是一種特殊的對象晦鞋,它必須由 Thread 類或其子(孫)類來創(chuàng)建蹲缠。通常有兩種方法來創(chuàng)建線程:其一棺克,使用型構為 Thread(Runnable) 的構造子類將一個實現(xiàn)了 Runnable 接口的對象包裝成一個線程,其二线定,從 Thread 類派生出子類并重寫 run 方法娜谊,使用該子類創(chuàng)建的對象即為線程。值得注意的是 Thread 類已經(jīng)實現(xiàn)了 Runnable 接口斤讥,因此纱皆,任何一個線程均有它的 run 方法,而 run 方法中包含了線程所要運行的代碼芭商。線程的活動由一組方法來控制派草。Java 語言支持多個線程的同時執(zhí)行,并提供多線程之間的同步機制(關鍵字為 synchronized)铛楣。
-
Java 語言是動態(tài)的:
Java 語言的設計目標之一是適應于動態(tài)變化的環(huán)境近迁。Java 程序需要的類能夠動態(tài)地被載入到運行環(huán)境,也可以通過網(wǎng)絡來載入所需要的類簸州。這也有利于軟件的升級鉴竭。另外,Java 中的類有一個運行時刻的表示岸浑,能進行運行時刻的類型檢查搏存。
Java 關鍵字
Java是解釋執(zhí)行還是編譯執(zhí)行的?(配合JVM理解)
這個問題并沒有統(tǒng)一的答案助琐,JVM規(guī)范并沒有強制要求JVM實現(xiàn)應該使用哪種方式來執(zhí)行程序祭埂,只能說不同的JVM實現(xiàn)的方式不一樣。有純解釋執(zhí)行的兵钮、純編譯執(zhí)行的(JRockit)蛆橡、還有解釋+編譯兩者混用的(HotSpot)。
目前主流的商用JVM(如HotSpot)內(nèi)部都同時包含解釋器+編譯器掘譬。
解釋器與編譯器兩者各有優(yōu)勢:
- 當程序需要迅速啟動時泰演,解釋器可以發(fā)揮優(yōu)勢,省去編譯的時間葱轩,立即執(zhí)行睦焕。
- 程序啟動后,隨著時間的推移靴拱,編譯器開始發(fā)揮作用垃喊,JVM會將越來越多的熱點代碼編譯成本地代碼,減少解釋器的中間損耗袜炕,獲得更高的執(zhí)行效率本谜。
使用參數(shù)-Xint
可以要求JVM只使用解釋器,這時編譯器完全不介入工作偎窘,所有代碼均通過解釋執(zhí)行乌助。
參數(shù)-Xcomp
要求JVM優(yōu)先編譯執(zhí)行溜在,但是解釋器仍然要在編譯器無法進行的情況下介入工作。
何時編譯他托?
能觸發(fā)JIT編譯的熱點代碼有兩類:
- 多次調用的方法
- 多次調用的循環(huán)體
不管是方法被多次調用掖肋,還是某一段循環(huán)體代碼被多次調用,JIT編譯的最小單位都是整個方法體赏参。
如果一個方法被JIT編譯后志笼,下次JVM再執(zhí)行這個方法時,就會直接編譯執(zhí)行登刺。
而對于一個循環(huán)體而言籽腕,由于方法已經(jīng)打包成棧幀入棧執(zhí)行了,JVM必須在方法運行時進行替換纸俭,因此也被稱為“棧上替換”皇耗。
方法被多次執(zhí)行,這個【多次】指的到底是多少次呢揍很?JVM如何判斷代碼是否屬于熱點代碼呢郎楼?這就需要熱點探測技術的支持了。
目前主流的熱點探測技術有兩種:
- 基于采樣的熱點探測
JVM周期性的檢查線程方法棧頂窒悔,進行數(shù)據(jù)采樣呜袁,如果發(fā)現(xiàn)某些方法經(jīng)常出現(xiàn)在棧頂,就認為它是熱點代碼简珠。
這種方式實現(xiàn)簡單高效阶界,但是統(tǒng)計結果會有誤差,因為方法經(jīng)常出現(xiàn)在棧頂不一定是執(zhí)行次數(shù)多聋庵,也可能是方法阻塞了膘融。
- 基于計數(shù)器的熱點探測
JVM為每個方法(甚至是代碼塊)維護一個計數(shù)器,每調用一次計數(shù)器就加1祭玉,計數(shù)器超過閾值后就會被認為是熱點代碼氧映。
這種方式實現(xiàn)復雜,需要為每個方法都維護一個計數(shù)器脱货,但是統(tǒng)計結果準確岛都。
方法調用計數(shù)器和回邊計數(shù)器
- 方法調用計數(shù)器
統(tǒng)計方法被調用的次數(shù),Client模式下閾值為1500次振峻,Server模式下閾值為10000次臼疫,閾值可以通過JVM參數(shù)
-XX:CompileThreshold
設置,默認情況下扣孟,方法調用次數(shù)統(tǒng)計的并不是絕對次數(shù)烫堤,而是一段時間內(nèi)的調用頻率,在一個時間段內(nèi)如果調用次數(shù)不足以觸發(fā)編譯,次數(shù)就會減半進入半衰期塔逃,可以使用參數(shù)-XX:-UseCounterDecay
來關閉熱度衰減,關閉后統(tǒng)計的就是絕對次數(shù)了料仗,時間長了幾乎所有的代碼都會被編譯執(zhí)行湾盗。
- 回邊計數(shù)器
統(tǒng)計方法中循環(huán)體代碼的執(zhí)行次數(shù),在字節(jié)碼中遇到控制流程向后跳轉的指令就稱為“回邊”立轧,例如For格粪、While循環(huán)。遇到一次回邊指令氛改,回邊計數(shù)器就會加1帐萎,當計數(shù)器超過閾值后就會觸發(fā)熱點代碼編譯,回邊計數(shù)器沒有半衰期胜卤,統(tǒng)計的是絕對次數(shù)疆导。
觸發(fā)熱點代碼編譯后,程序會繼續(xù)解釋執(zhí)行葛躏,只有當編譯工作完成以后澈段,系統(tǒng)會將方法的調用入口地址寫入新值,下一次再調用該方法舰攒,才會使用已編譯的版本败富。
Java 的兩大數(shù)據(jù)類型:
- 內(nèi)置數(shù)據(jù)類型
- 引用數(shù)據(jù)類型
內(nèi)置數(shù)據(jù)類型
Java語言提供了八種基本類型。六種數(shù)字類型(四個整數(shù)型摩窃,兩個浮點型)兽叮,一種字符類型,一種布爾型猾愿。
byte:
- byte 數(shù)據(jù)類型是8位鹦聪、有符號的,以二進制補碼表示的整數(shù)匪蟀;
- 最小值是 -128(-2^7)椎麦;
- 最大值是 127(2^7-1);
- 默認值是 0材彪;
- byte 類型用在大型數(shù)組中節(jié)約空間观挎,主要代替整數(shù),因為 byte 變量占用的空間只有 int 類型的四分之一段化;
- 例子:byte a = 100嘁捷,byte b = -50。
short:
- short 數(shù)據(jù)類型是 16 位显熏、有符號的以二進制補碼表示的整數(shù)
- 最小值是 -32768(-2^15)雄嚣;
- 最大值是 32767(2^15 - 1);
- Short 數(shù)據(jù)類型也可以像 byte 那樣節(jié)省空間。一個short變量是int型變量所占空間的二分之一缓升;
- 默認值是 0鼓鲁;
- 例子:short s = 1000,short r = -20000港谊。
int:
- int 數(shù)據(jù)類型是32位骇吭、有符號的以二進制補碼表示的整數(shù);
- 最小值是 -2,147,483,648(-2^31)歧寺;
- 最大值是 2,147,483,647(2^31 - 1)燥狰;
- 一般地整型變量默認為 int 類型;
- 默認值是 0 斜筐;
- 例子:int a = 100000, int b = -200000龙致。
long:
- long 數(shù)據(jù)類型是 64 位、有符號的以二進制補碼表示的整數(shù)顷链;
- 最小值是 -9,223,372,036,854,775,808(-2^63)目代;
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 這種類型主要使用在需要比較大整數(shù)的系統(tǒng)上嗤练;
- 默認值是 0L像啼;
- 例子: long a = 100000L猖闪,Long b = -200000L肠缔。
"L"理論上不分大小寫鳍征,但是若寫成"l"容易與數(shù)字"1"混淆也祠,不容易分辯萍恕。所以最好大寫末誓。
float:
- float 數(shù)據(jù)類型是單精度丸逸、32位锦援、符合IEEE 754標準的浮點數(shù)蝗碎;
- float 在儲存大型浮點數(shù)組的時候可節(jié)省內(nèi)存空間湖笨;
- 默認值是 0.0f;
- 浮點數(shù)不能用來表示精確的值蹦骑,如貨幣慈省;
- 例子:float f1 = 234.5f。
double:
- double 數(shù)據(jù)類型是雙精度眠菇、64 位边败、符合IEEE 754標準的浮點數(shù);
- 浮點數(shù)的默認類型為double類型捎废;
- double類型同樣不能表示精確的值笑窜,如貨幣;
- 默認值是 0.0d登疗;
- 例子:double d1 = 123.4排截。
boolean:
- boolean數(shù)據(jù)類型表示一位的信息嫌蚤;
- 只有兩個取值:true 和 false;
- 這種類型只作為一種標志來記錄 true/false 情況断傲;
- 默認值是 false脱吱;
- 例子:boolean one = true。
char:
- char類型是一個單一的 16 位 Unicode 字符认罩;
- 最小值是 \u0000(即為0)急凰;
- 最大值是 \uffff(即為65,535);
- char 數(shù)據(jù)類型可以儲存任何字符猜年;
- 例子:char letter = 'A';。
引用類型
- 在Java中疾忍,引用類型的變量非常類似于C/C++的指針乔外。引用類型指向一個對象,指向對象的變量是引用變量一罩。這些變量在聲明時被指定為一個特定的類型杨幼,比如 Employee、Puppy 等聂渊。變量一旦聲明后差购,類型就不能被改變了。
- 對象汉嗽、數(shù)組都是引用數(shù)據(jù)類型欲逃。
- 所有引用類型的默認值都是null。
- 一個引用變量可以用來引用任何與之兼容的類型饼暑。
- 例子:Site site = new Site("Runoob")稳析。
Java 變量類型
Java語言支持的變量類型有:
- 類變量:獨立于方法之外的變量,用 static 修飾弓叛。
- 實例變量:獨立于方法之外的變量彰居,不過沒有 static 修飾。
- 局部變量:類的方法中的變量撰筷。
類變量(靜態(tài)變量)
- 類變量也稱為靜態(tài)變量陈惰,在類中以 static 關鍵字聲明,但必須在方法之外毕籽。
- 無論一個類創(chuàng)建了多少個對象抬闯,類只擁有類變量的一份拷貝。
- 靜態(tài)變量除了被聲明為常量外很少使用关筒,靜態(tài)變量是指聲明為 public/private画髓,final 和 static 類型的變量。靜態(tài)變量初始化后不可改變平委。
- 靜態(tài)變量儲存在靜態(tài)存儲區(qū)奈虾。經(jīng)常被聲明為常量,很少單獨使用 static 聲明變量。
- 靜態(tài)變量在第一次被訪問時創(chuàng)建肉微,在程序結束時銷毀匾鸥。
- 與實例變量具有相似的可見性。但為了對類的使用者可見碉纳,大多數(shù)靜態(tài)變量聲明為 public 類型勿负。
- 默認值和實例變量相似。數(shù)值型變量默認值是 0劳曹,布爾型默認值是 false奴愉,引用類型默認值是 null。變量的值可以在聲明的時候指定铁孵,也可以在構造方法中指定锭硼。此外,靜態(tài)變量還可以在靜態(tài)語句塊中初始化蜕劝。
- 靜態(tài)變量可以通過:ClassName.VariableName的方式訪問檀头。
- 類變量被聲明為 public static final 類型時,類變量名稱一般建議使用大寫字母岖沛。如果靜態(tài)變量不是 public 和 final 類型暑始,其命名方式與實例變量以及局部變量的命名方式一致。
實例變量
- 實例變量聲明在一個類中婴削,但在方法廊镜、構造方法和語句塊之外;
- 當一個對象被實例化之后唉俗,每個實例變量的值就跟著確定期升;
- 實例變量在對象創(chuàng)建的時候創(chuàng)建,在對象被銷毀的時候銷毀互躬;
- 實例變量的值應該至少被一個方法播赁、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取實例變量信息吼渡;
- 實例變量可以聲明在使用前或者使用后容为;
- 訪問修飾符可以修飾實例變量;
- 實例變量對于類中的方法寺酪、構造方法或者語句塊是可見的坎背。一般情況下應該把實例變量設為私有。通過使用訪問修飾符可以使實例變量對子類可見寄雀;
- 實例變量具有默認值得滤。數(shù)值型變量的默認值是0,布爾型變量的默認值是false盒犹,引用類型變量的默認值是null懂更。變量的值可以在聲明時指定眨业,也可以在構造方法中指定;
- 實例變量可以直接通過變量名訪問沮协。但在靜態(tài)方法以及其他類中龄捡,就應該使用完全限定名:ObejectReference.VariableName。
Java 局部變量(棧幀慷暂,配合JVM)
- 局部變量聲明在方法聘殖、構造方法或者語句塊中;
- 局部變量在方法行瑞、構造方法奸腺、或者語句塊被執(zhí)行的時候創(chuàng)建,當它們執(zhí)行完成后血久,變量將會被銷毀突照;
- 訪問修飾符不能用于局部變量;
- 局部變量只在聲明它的方法洋魂、構造方法或者語句塊中可見;
- 局部變量是在棧上分配的喜鼓。
- 局部變量沒有默認值副砍,所以局部變量被聲明后,必須經(jīng)過初始化庄岖,才可以使用豁翎。
Java 修飾符
訪問控制修飾符
Java中,可以使用訪問控制符來保護對類隅忿、變量心剥、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限背桐。
default (即默認优烧,什么也不寫): 在同一包內(nèi)可見,不使用任何修飾符链峭。使用對象:類畦娄、接口、變量弊仪、方法熙卡。
private : 在同一類內(nèi)可見。使用對象:變量励饵、方法驳癌。 注意:不能修飾類(外部類)
public : 對所有類可見。使用對象:類役听、接口颓鲜、變量表窘、方法
protected : 對同一包內(nèi)的類和所有子類可見。使用對象:變量灾杰、方法蚊丐。 注意:不能修飾類(外部類)。
修飾符 | 當前類 | 同一包內(nèi) | 子孫類(同一包) | 子孫類(不同包) | 其他包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N(說明) | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
非訪問修飾符
為了實現(xiàn)一些其他的功能艳吠,Java 也提供了許多非訪問修飾符麦备。
-
static 修飾符,用來修飾類方法和類變量昭娩。
static 關鍵字用來聲明獨立于對象的靜態(tài)變量凛篙,無論一個類實例化多少對象,它的靜態(tài)變量只有一份拷貝栏渺。 靜態(tài)變量也被稱為類變量呛梆。局部變量不能被聲明為 static 變量。
static 關鍵字用來聲明獨立于對象的靜態(tài)方法磕诊。靜態(tài)方法不能使用類的非靜態(tài)變量填物。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù),然后計算這些數(shù)據(jù)霎终。
-
final 修飾符滞磺,用來修飾類、方法和變量莱褒,final 修飾的類不能夠被繼承击困,修飾的方法不能被繼承類重新定義,修飾的變量為常量广凸,是不可修改的阅茶。
final 修飾符通常和 static 修飾符一起使用來創(chuàng)建類常量。
父類中的 final 方法可以被子類繼承谅海,但是不能被子類重寫脸哀。聲明 final 方法的主要目的是防止該方法的內(nèi)容被修改。
final 類不能被繼承扭吁,沒有類能夠繼承 final 類的任何特性企蹭。
-
abstract 修飾符,用來創(chuàng)建抽象類和抽象方法智末。
抽象類不能用來實例化對象谅摄,聲明抽象類的唯一目的是為了將來對該類進行擴充。一個類不能同時被 abstract 和 final 修飾系馆。如果一個類包含抽象方法送漠,那么該類一定要聲明為抽象類,否則將出現(xiàn)編譯錯誤由蘑。抽象類可以包含抽象方法和非抽象方法闽寡。
抽象方法是一種沒有任何實現(xiàn)的方法代兵,該方法的的具體實現(xiàn)由子類提供。抽象方法不能被聲明成 final 和 static爷狈。任何繼承抽象類的子類必須實現(xiàn)父類的所有抽象方法植影,除非該子類也是抽象類。如果一個類包含若干個抽象方法涎永,那么該類必須聲明為抽象類思币。抽象類可以不包含抽象方法。
synchronized 和 volatile 修飾符羡微,主要用于線程的編程谷饿。
transient 修飾符,序列化的對象包含被 transient 修飾的實例變量時妈倔,java 虛擬機(JVM)跳過該特定的變量博投。
Java 運算符
- 算術運算符
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加運算符兩側的值 | A + B 等于 30 |
- | 減法 - 左操作數(shù)減去右操作數(shù) | A – B 等于 -10 |
* | 乘法 - 相乘操作符兩側的值 | A * B等于200 |
/ | 除法 - 左操作數(shù)除以右操作數(shù) | B / A等于2 |
% | 取余 - 左操作數(shù)除以右操作數(shù)的余數(shù) | B%A等于0 |
++ | 自增: 操作數(shù)的值增加1 | B++ 或 ++B 等于 21( |
-- | 自減: 操作數(shù)的值減少1 | B-- 或 --B 等于 19 |
自增(++)自減(--)運算符是一種特殊的算術運算符,在算術運算符中需要兩個操作數(shù)來進行運算盯蝴,而自增自減運算符是一個操作數(shù)毅哗。
- 關系運算符
運算符 | 描述 | 例子 |
---|---|---|
== | 檢查如果兩個操作數(shù)的值是否相等,如果相等則條件為真捧挺。 | (A == B)為假虑绵。 |
!= | 檢查如果兩個操作數(shù)的值是否相等,如果值不相等則條件為真松忍。 | (A != B) 為真蒸殿。 |
> | 檢查左操作數(shù)的值是否大于右操作數(shù)的值筷厘,如果是那么條件為真鸣峭。 | (A> B)為假。 |
< | 檢查左操作數(shù)的值是否小于右操作數(shù)的值酥艳,如果是那么條件為真摊溶。 | (A <B)為真。 |
>= | 檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值充石,如果是那么條件為真莫换。 | (A> = B)為假。 |
<= | 檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值骤铃,如果是那么條件為真拉岁。 | (A <= B)為真。 |
- 位運算符
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相對應位都是1惰爬,則結果為1喊暖,否則為0 | (A&B),得到12撕瞧,即0000 1100 |
| | 如果相對應位都是 0陵叽,則結果為 0狞尔,否則為 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相對應位值相同巩掺,則結果為0偏序,否則為1 | (A ^ B)得到49,即 0011 0001 |
? | 按位取反運算符翻轉操作數(shù)的每一位胖替,即0變成1研儒,1變成0。 | (?A)得到-61刊殉,即1100 0011 |
<< | 按位左移運算符殉摔。左操作數(shù)按位左移右操作數(shù)指定的位數(shù)。 | A << 2得到240记焊,即 1111 0000 |
>> | 按位右移運算符逸月。左操作數(shù)按位右移右操作數(shù)指定的位數(shù)。 | A >> 2得到15即 1111 |
>>> | 按位右移補零操作符遍膜。左操作數(shù)的值按右操作數(shù)指定的位數(shù)右移碗硬,移動得到的空位以零填充。 | A>>>2得到15即0000 1111 |
- 邏輯運算符
操作符 | 描述 | 例子 |
---|---|---|
&& | 稱為邏輯與運算符瓢颅。當且僅當兩個操作數(shù)都為真恩尾,條件才為真。 | (A && B)為假挽懦。 |
| | | 稱為邏輯或操作符翰意。如果任何兩個操作數(shù)任何一個為真,條件為真信柿。 | (A | | B)為真冀偶。 |
! | 稱為邏輯非運算符渔嚷。用來反轉操作數(shù)的邏輯狀態(tài)进鸠。如果條件為true,則邏輯非運算符將得到false形病。 | ?湍辍(A && B)為真。 |
當使用與邏輯運算符時漠吻,在兩個操作數(shù)都為true時量瓜,結果才為true,但是當?shù)玫降谝粋€操作為false時途乃,其結果就必定是false绍傲,這時候就不會再判斷第二個操作了。
- 賦值運算符
操作符 | 描述 | 例子 |
---|---|---|
= | 簡單的賦值運算符欺劳,將右操作數(shù)的值賦給左側操作數(shù) | C = A + B將把A + B得到的值賦給C |
+ = | 加和賦值操作符唧取,它把左操作數(shù)和右操作數(shù)相加賦值給左操作數(shù) | C + = A等價于C = C + A |
- = | 減和賦值操作符铅鲤,它把左操作數(shù)和右操作數(shù)相減賦值給左操作數(shù) | C - = A等價于C = C - A |
* = | 乘和賦值操作符,它把左操作數(shù)和右操作數(shù)相乘賦值給左操作數(shù) | C * = A等價于C = C * A |
/ = | 除和賦值操作符枫弟,它把左操作數(shù)和右操作數(shù)相除賦值給左操作數(shù) | C / = A邢享,C 與 A 同類型時等價于 C = C / A |
(%)= | 取模和賦值操作符,它把左操作數(shù)和右操作數(shù)取模后賦值給左操作數(shù) | C%= A等價于C = C%A |
<< = | 左移位賦值運算符 | C << = 2等價于C = C << 2 |
>> = | 右移位賦值運算符 | C >> = 2等價于C = C >> 2 |
&= | 按位與賦值運算符 | C&= 2等價于C = C&2 |
^ = | 按位異或賦值操作符 | C ^ = 2等價于C = C ^ 2 |
| = | 按位或賦值操作符 | C | = 2等價于C = C | 2 |
-
條件運算符(?:)
條件運算符也被稱為三元運算符淡诗。該運算符有3個操作數(shù)骇塘,并且需要判斷布爾表達式的值。該運算符的主要是決定哪個值應該賦值給變量韩容。
b = (a == 1) ? 20 : 30;
variable x = (expression) ? value if true : value if false
-
instanceof 運算符
- 該運算符用于操作對象實例款违,檢查該對象是否是一個特定類型(類類型或接口類型)。