基础二:操作符
使用Java操作符
操作符接受一個或者多個參數,并生成一個新值。
操作符用于操作數,生成一個新值。 另外有些操作符可能會改變操作數自身的值,這被稱為“副作用”。
這些能改變操作數的操作符最普遍的作用就是產生副作用。
幾乎所有的操作符都只能操作“基本類型”。 例外的操作符是 = == 和 != 。
這些操作符能操作所有的對象。 除此之外,String類支持 + 和 +=.
優先級
當一個表達式中存在多個操作符時,操作符的優先級決定了各個部分的計算順序。 最簡單的規則就是先乘除后加減。另外也要明確括號的作用。
賦值
賦值使用操作符 “=” 。
它的意思是 取右邊的值 ,把它賦值給左邊。
右邊可以是任意數、變量或者表達式(只要能生成一個值就行),左邊必須是一個明確的已命名的變量。 也就是說,必須有一個物理空間可以存儲等號右邊的值。
比如 :
a = 4 ;但是不能把任何東西賦值給一個常數,常數不能作為左值。比如(4 = a ; worong !)
對于基本數據類型的賦值:
基本類型存儲了實際的數值,而并非指向一個對象的引用,所以在為其賦值的時候,是直接將一個地方的內容復制到了另一個地方。 另外,對基本數據類型使用 a = b ,那么b的內容就復制給a,若緊接著修改a,b的值不受這種修改的影響但是在為對象賦值的時候,情況卻發生了變化:
對一個對象進行操作時,我們真正操作的是對象的引用。 所以倘若“將一個對象賦值給另外一個對象”,實際上是將“引用”從一個地方復制到另外一個地方。 這意味著假若對對象使用c = d ,那么c和d都指向原來只有d指向的那個對象。Tank類有兩個實例 t1和t2, 分別對level域賦不同的值,然后將t2賦給t1,緊接著又修改t1.
由于賦值操作的是一個對象的引用,所有修改t1的同時,也改變了t2. 這是由于t1和t2包含的是相同的引用,他們指向相同的對象(原來t1包含的對對象的引用,是指向一個值為9的對象,在對t1賦值的時候,這個引用被覆蓋了,也就是丟失了;而那個不再被引用的對象會有垃圾回收器自動清理)。
這種特使的現象被稱為“別名現象”,是java操作對象的一種基本方式,如何避免的?可以這樣寫
t1.level = t2.level ;這樣便可以保持兩個對象彼此獨立,而不是將t1和t2綁定到相同的對象上。
算數操作符
+ - * / 加減乘除 以及取模操作符 %。
要將x+4,并將結果賦值給x ,可以寫成 x +=4 ;
通過Random類的對象,程序可以生成許多不同類型的隨機數字,只需要調用
傳遞給netxtInt()的參數設置了所產生隨機數的上線,而其下限為0 。 但是這個下限并不是我們所想要的,可以對結果進行+1操作。
自動遞增和遞減
++ –
舉個例子 假設 a是一個int值,++a 就能等價于 a = a +1 ;
遞增和遞減操作符不僅改變了變量,并且以變量值作為生成的結果。
這兩個操作符各有兩種使用方式,通常稱為前綴式和后綴式。
前綴遞增: 表示 ++操作符位于變量或者表達式的前面,反之 后綴遞增 ++操作符位于變量或者表達式的后面。
類似的,前綴遞增遞減 一樣的..
**對于前綴形式:執行完運算后才得到值。
對于后綴形式:在運算之前就得到值**。
他們是除了那些設計賦值的操作符以外,唯一就有“副作用”的操作符。 也就是說,他們會改變操作數,而不僅僅是使用自己的值。
int i = 1;System.out.println("i:" + i); // 1System.out.println("=======================");System.out.println("++i:" + ++i); // 2 先執行運算 i首先加1,此時i為2,并以變量(即i=2)的值作為結果System.out.println("i:" + i); // 2System.out.println("i++:" + i++); // 2 先給變量i賦值(i=2)因為是以變量的的值作為結果,所以 i++ 的值為2,在執行運算,運算后 i+1變為3System.out.println("i:" + i); // 3System.out.println("=======================");System.out.println("--i:" + --i); // 2 先運算,運算后3-1后 i為2 ,再賦值,此時i 為2System.out.println("i:" + i); // 2System.out.println("i--:" + i--); // 2System.out.println("i:" + i); // 1關系操作符
關系操作符生成的是一個boolean結果。
真實則為true,反之false。
主要包括一下符號:
< 、 > 、<=、>= 、 == 以及 !=
測試對象的等價性
盡管對象的內容相同,但是對象的引用確實不同的,而 ==和 != 比較的是對象的引用。
如果相比較兩個對象的實際內容是否相同,需要使用 equals().
假設我們創建了自己的類,就像下面那樣
what the fuck ? 又是false了…..
這是因為 equals()的默認行為是比較引用, 所以除非在自己的新類中覆蓋equals方法,否則不可能表現出我們希望的行為。
大多是java庫都實現了equals方法,以便用來比較對象的內容,而非對象的引用。
邏輯操作符
與 && 或 || 非 ! ,返回一個布爾值。
直接常量
直接常量后面的后綴字符標識了它的類型。
若為 大寫或者小寫的L,代表long
F ,代表float
D,代表都變了
十六進制適用于所有整數數據類型,以前綴 0x或者0X,后面跟隨0~9或者大寫(或小寫)的a~f來表示。
八進制數由前綴0以及后續的0~7的數字來表示。
按位操作符
用來操作二進制
&= 按位與賦值
|= 按位或賦值
^= 按位非賦值
移位操作符
也是用來操作二進制
= 右移賦值
= 無符號右移賦值
<<= 賦值左移
三目表達式
boolean-exp ? value0 : value1
boolean-exp 為true,則計算 value0 ,反之計算 value1 .
字符串操作符 + 和 +=
這個操作符在java中有一項特殊的用途: 連接不同的字符串
總結
- 上一篇: Android通用流行框架汇总
- 下一篇: 基础三:控制执行流程