Java™ 教程(運算符)

運算符

既然你已經學會了如何聲明和初始化變量,那麼你可能想知道如何使用它們,學習Java編程語言的運算符是一個很好的起點,運算符是對一個、兩個或三個操做數執行特定運算的特殊符號,而後返回結果。編程

在咱們探索Java編程語言的運算符時,提早知道哪些運算符具備最高優先級可能會對你有所幫助,下表中的運算符按優先順序列出,運算符出如今離表頂部越近,其優先級越高,優先級較高的運算符在優先級相對較低的運算符以前進行求值。同一行上的運算符具備相同的優先權,當具備相同優先級的運算符出如今同一表達式中時,規則必須控制首先計算的值,除了賦值運算符以外的全部二元運算符都是從左到右計算的,賦值運算符從右到左進行求值。segmentfault

運算符 優先級
後綴 expr++ expr--
一元 ++expr --expr +expr -expr ~ !
乘法 * / %
加法 + -
位移 << >> >>>
關係 < > <= >= instanceof
等於 == !=
按位與 &
按位異或 ^
按位或 |
邏輯與 &&
邏輯或 ||
三元 ? :
賦值 = += -= *= /= %= &= ^= |= <<= >>= >>>=

在通用編程中,某些運算符每每比其餘運算符更頻繁地出現,例如,賦值運算符「=」比無符號右移運算符「>>>」更常見,考慮到這一點,如下討論首先關注你最有可能常用的運算符,並最終關注那些不太常見的運算符。每一個討論都附帶能夠編譯和運行的示例代碼,研究它的輸出將有助於增強你剛剛學到的東西。編程語言

賦值、算術和一元運算符

簡單賦值運算符

你將遇到的最多見的運算符之一是簡單賦值運算符「=」,你在Bicycle類中看到了此運算符,它將右側的值賦給左側的操做數:學習

int cadence = 0;
 int speed = 0;
 int gear = 1;

此運算符也可用於對象以分配對象引用,如建立對象中所述。測試

算術運算符

Java編程語言提供執行加法,減法,乘法和除法的運算符,頗有可能你會被基礎數學方面的同行認出來,惟一可能看起來很新的符號是「」,它將一個操做數除以另外一個操做數,並將餘數做爲結果返回。code

運算符 描述
+ 加法運算符(也用於字符串鏈接)
- 減法運算符
* 乘法運算符
/ 除法運算符
% 取餘運算符

如下程序ArithmeticDemo測試算術運算符。對象

class ArithmeticDemo {

    public static void main (String[] args) {

        int result = 1 + 2;
        // result is now 3
        System.out.println("1 + 2 = " + result);
        int original_result = result;

        result = result - 1;
        // result is now 2
        System.out.println(original_result + " - 1 = " + result);
        original_result = result;

        result = result * 2;
        // result is now 4
        System.out.println(original_result + " * 2 = " + result);
        original_result = result;

        result = result / 2;
        // result is now 2
        System.out.println(original_result + " / 2 = " + result);
        original_result = result;

        result = result + 8;
        // result is now 10
        System.out.println(original_result + " + 8 = " + result);
        original_result = result;

        result = result % 7;
        // result is now 3
        System.out.println(original_result + " % 7 = " + result);
    }
}

該程序打印如下內容:繼承

1 + 2 = 3
3 - 1 = 2
2 * 2 = 4
4 / 2 = 2
2 + 8 = 10
10 % 7 = 3

你還能夠將算術運算符與簡單賦值運算符組合以建立複合賦值,例如,x+=1;x=x+1;都將x的值遞增1。接口

+運算符也可用於將兩個字符串鏈接(鏈接)在一塊兒,以下面的ConcatDemo程序所示:字符串

class ConcatDemo {
    public static void main(String[] args){
        String firstString = "This is";
        String secondString = " a concatenated string.";
        String thirdString = firstString+secondString;
        System.out.println(thirdString);
    }
}

在該程序結束時,變量thirdString包含「This is a concatenated string.」,它被打印到標準輸出。

一元運算符

一元運算符只須要一個操做數,它們執行各類操做,例如將值遞增/遞減1,否認表達式或反轉布爾值。

運算符 描述
+ 一元加運算符,表示正值(可是沒有這個,數字也是正數)
- 一元減運算符,否認表達式
++ 增量運算符,將值遞增1
-- 遞減運算符,將值減1
! 邏輯補碼運算符,反轉布爾值

如下程序UnaryDemo測試一元運算符:

class UnaryDemo {

    public static void main(String[] args) {

        int result = +1;
        // result is now 1
        System.out.println(result);

        result--;
        // result is now 0
        System.out.println(result);

        result++;
        // result is now 1
        System.out.println(result);

        result = -result;
        // result is now -1
        System.out.println(result);

        boolean success = false;
        // false
        System.out.println(success);
        // true
        System.out.println(!success);
    }
}

能夠在操做數以前(前綴)或以後(後綴)應用遞增/遞減運算符,代碼result++;++result;將兩個結果都加1。惟一的區別是前綴版本(++result)評估爲增量值,然後綴版本(result++)評估爲原始值。若是你只是執行簡單的增量/減量,那麼選擇哪一個版本並不重要,可是,若是你在較大的表達式中使用此運算符,則你選擇的運算符可能會產生顯着差別。

如下程序PrePostDemo演示了前綴/後綴一元增量運算符:

class PrePostDemo {
    public static void main(String[] args){
        int i = 3;
        i++;
        // prints 4
        System.out.println(i);
        ++i;               
        // prints 5
        System.out.println(i);
        // prints 6
        System.out.println(++i);
        // prints 6
        System.out.println(i++);
        // prints 7
        System.out.println(i);
    }
}

等於、關係和條件運算符

等於與關係運算符

等於和關係運算符肯定一個操做數是否大於,小於,等於或不等於另外一個操做數,這些運算符中的大多數也可能看起來很熟悉,請記住,在測試兩個原始值是否相等時,必須使用「==」而不是「=」。

運算符 描述
== 等於
!= 不等於
> 大於
>= 大於或等於
< 小於
<= 小於或等於

如下程序ComparisonDemo測試比較運算符:

class ComparisonDemo {

    public static void main(String[] args){
        int value1 = 1;
        int value2 = 2;
        if(value1 == value2)
            System.out.println("value1 == value2");
        if(value1 != value2)
            System.out.println("value1 != value2");
        if(value1 > value2)
            System.out.println("value1 > value2");
        if(value1 < value2)
            System.out.println("value1 < value2");
        if(value1 <= value2)
            System.out.println("value1 <= value2");
    }
}

輸出:

value1 != value2
value1 <  value2
value1 <= value2

條件運算符

&&||運算符對兩個布爾表達式執行條件與和條件或運算,這些運算符表現出「最少運算」行爲,這意味着僅在須要時才評估第二個操做數。

運算符 描述
&& 條件與
|| 條件或

如下程序ConditionalDemo1測試這些運算符:

class ConditionalDemo1 {

    public static void main(String[] args){
        int value1 = 1;
        int value2 = 2;
        if((value1 == 1) && (value2 == 2))
            System.out.println("value1 is 1 AND value2 is 2");
        if((value1 == 1) || (value2 == 1))
            System.out.println("value1 is 1 OR value2 is 1");
    }
}

另外一個條件運算符是?:,這能夠被認爲是if-then-else語句的簡寫(在本課程的控制流語句部分中討論),此運算符也稱爲三元運算符,由於它使用三個操做數,在如下示例中,應將此運算符讀做:「若是someConditiontrue,則將value1的值賦給result,不然,將value2的值賦給result。」

如下程序ConditionalDemo2測試?:運算符:

class ConditionalDemo2 {

    public static void main(String[] args){
        int value1 = 1;
        int value2 = 2;
        int result;
        boolean someCondition = true;
        result = someCondition ? value1 : value2;

        System.out.println(result);
    }
}

由於someConditiontrue,因此此程序在屏幕上打印「1」,若是它使代碼更具可讀性,請使用?:運算符而不是if-then-else語句,例如,當表達式緊湊且沒有反作用(例如賦值)時。

類型比較運算符instanceof

instanceof運算符將對象與指定的類型進行比較,你可使用它來測試對象是不是類的實例,子類的實例或實現特定接口的類的實例。

如下程序InstanceofDemo定義了一個父類(名爲Parent),一個簡單的接口(名爲MyInterface)和一個繼承自父類並實現接口的子類(名爲Child)。

class InstanceofDemo {
    public static void main(String[] args) {

        Parent obj1 = new Parent();
        Parent obj2 = new Child();

        System.out.println("obj1 instanceof Parent: "
            + (obj1 instanceof Parent));
        System.out.println("obj1 instanceof Child: "
            + (obj1 instanceof Child));
        System.out.println("obj1 instanceof MyInterface: "
            + (obj1 instanceof MyInterface));
        System.out.println("obj2 instanceof Parent: "
            + (obj2 instanceof Parent));
        System.out.println("obj2 instanceof Child: "
            + (obj2 instanceof Child));
        System.out.println("obj2 instanceof MyInterface: "
            + (obj2 instanceof MyInterface));
    }
}

class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}

輸出:

obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true

使用instanceof運算符時,請記住null不是任何實例。

按位和位移運算符

Java編程語言還提供對整數類型執行按位和位移操做的運算符,本節中討論的運算符不太經常使用,所以,他們的報道很簡短,目的是讓你意識到這些運算符的存在。

一元按位補碼運算符「」反轉位模式,它能夠應用於任何整數類型,使每一個「0」爲「1」,每一個「1」爲「0」,例如,一個字節包含8位,將此運算符應用於位模式爲「00000000」的值會將其模式更改成「11111111」。

帶符號的左移運算符「<<」將位模式向左移位,帶符號的右移運算符「>>」將位模式向右移位,位模式由左側操做數給出,以及由右側操做數移位的位置數。無符號右移運算符「>>>」將零移動到最左側位置,而「>>」以後的最左側位置取決於符號擴展。

按位運算符執行按位與運算。
按位^運算符執行按位異或運算。
按位|運算符執行按位或運算。

如下程序BitDemo使用按位與運算符將數字「2」打印到標準輸出。

class BitDemo {
    public static void main(String[] args) {
        int bitmask = 0x000F;
        int val = 0x2222;
        // prints "2"
        System.out.println(val & bitmask);
    }
}

運算符總結

如下快速參考總結了Java編程語言支持的運算符。

簡單的賦值運算符

= 簡單賦值運算符

算術運算符

+ 加法運算符(也用於字符串鏈接)
- 減法運算符
* 乘法運算符
/ 除法運算符
% 取餘運算符

一元運算符

+ 一元加運算符,表示正值(可是沒有這個,數字也是正數)
- 一元減運算符,否認表達式
++ 增量運算符,將值遞增1
-- 遞減運算符,將值減1
! 邏輯補碼運算符,反轉布爾值

等於和關係運算符

== 等於
!= 不等於
> 大於
>= 大於或等於
< 小於
<= 小於或等於

條件運算符

&& 條件與
|| 條件或
?: 三元(簡寫的if-then-else語句)

類型比較運算符

instanceof 將對象與指定類型進行比較

按位和位移運算符

~ 一元按位補碼
<< 帶符號左移
>> 帶符號右移
>>> 無符號右移
& 按位與
^ 按位異或
| 按位或

上一篇:變量

下一篇:表達式、語句和塊

相關文章
相關標籤/搜索