Java探究心得之三元運算符


首先看一下三元運算符的格式

  [條件語句] ? [表達式1] : [表達式2]

其中如條件語句為真執行表達式1,否則執行表達式2.簡單的例子就不舉了,來點其它的。在JDK1.5以前的版本中,表達式1和表達式2都要求是相同的類型,比如都是String或者char之類的,在JDK1.5以后,有了自動拆箱和裝箱的原因,兩者只要其中一種或者兩者都能被拆箱即可,比如表達式1為Integer,而表達式2為int類型的,比如如下

1 int a = 1;
2 Integer b = 2;
3 boolean c = ture;
4 int d = c ? b : a;

還有個需要注意的是,如果表達式1和表達式2的類型不相同,那么他們需要對交集類型的自動參考轉換。例如如下這段代碼

 

1 String str = "abc";
2 StringBuilder strbu = new StringBuilder("def");
3 boolean boo = true;
4 CharSequence cs = boo ? str : strbu;

因為String和StringBuilder都實現了CharSequence這個接口。

確定條件表達式結果類型的規則的核心是以下3點:

  1 如果表達式1和表達式2操作數具有相同的類型,那么它就是條件表達式的類型。

  2 如果一個表達式的類型是byte、short、char類型的,而另外一個是int類型的常量表達式,且它的值可以用類型byte、short、char三者之一表示的,那么條件表達式的類型就是三者之一

  3 否則,將對操作數類型進行二進制數字提升,而條件表達式的類型就是第二個和第三個操作數被提升之后的類型

以上的三點可以用如下的代碼來幫助理解:

 

1 char ch = 'a';
2 int num = 0 ;
3 boolean bool = true;
4 System.out.print( bool ? ch : 0);  //這里不是 bool ? ch : num ,那樣會打印兩個97
5 System.out.print( !bool ? num : ch);

這段代碼打印的是 a97 。很顯然,第二點的規則應用到第一個打印上了,返回的是char,第三點的規則應用到第二個打印上了,返回的是int 。但是誰會在乎這個順序導致的打印結果,所以為了避免不必要的麻煩,很顯然顯式強制類型轉換是個很不錯的選擇 -_-

 

1 char ch = 'a';
2 int num = 0 ;
3 boolean bool = true;
4 System.out.print( bool ? (char)ch : (char)0);
5 System.out.print( !bool ? (int)num : (int)ch);

 

還有值得注意的是 表達式1 和 表達式2 不一定非得是數據類型,還可以是自己定義的方法,只要方法有返回值就行。例如

 1 static int test1(int i) {
 2         i += 1;
 3         return i;
 4 
 5     }
 6 
 7     static int test2(int i) {
 8         i += 2;
 9         return i;
10     }
11 
12     public static void ternary() {
13         boolean boo = false;
14         int c = boo ? test1(1) : test2(2);
15     }

以上就是個人的一點小心得~~有些內容可以參考條件表達式規范[JLS 15.25]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM