Java編程思想(第四版)學習筆記(3)

第三章 操作符

1.靜態導入(static import)

格式如下:
import static com.....ClassName.* ;

此處多了個static關鍵字,并且在類名ClassName后面多了個 .* ,意思是導入這個類里的所有靜態方法和靜態字段(屬性)。當然,也可以只導入某個靜態方法,只要把 .* 換成靜態方法名就行了。然后在這個類中,就可以直接用方法名調用靜態方法,而不必用ClassName.方法名的方式來調用。這種方法的好處就是可以簡化一些操作,例如打印操作System.out.println(...);就可以將其寫入一個靜態方法print(...),在使用時直接print(...)就可以了。 但是這種方法建議在有很多重復調用的時候使用,如果僅有一到兩次調用,不如直接寫來的方便。

示例如下:

//: net/mindview/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
package edu.ustc.home.util;
import java.io.*;

public class Print {
  // Print with a newline:
  public static void print(Object obj) {
    System.out.println(obj);
  }
  // Print a newline by itself:
  public static void print() {
    System.out.println();
  }
  // Print with no line break:
  public static void printnb(Object obj) {
    System.out.print(obj);
  }
  // The new Java SE5 printf() (from C):
  public static PrintStream
  printf(String format, Object... args) {
    return System.out.printf(format, args);
  }
} ///:~

使用上述代碼:

import static net.mindview.util.Print.*;

public class A {
  public static void main(String[] args) {
    print("Hello,static import!");
  }
}
2.Random 類的使用:
  1. 要生成隨機數,可以先創建一個Random類的對象,若在創建的過程中沒有傳遞任何參數,那么Java就會將當前時間作為隨機數生成器的種子,并由此在程序每次執行時都會產生不同的隨機數;
  1. 若想讓程序每次執行時都產生相同的隨機數(以使得輸出可驗證),可通過在創建Random對象時提供種子(用于數生成器的初始化值,隨機數生成器對于特定的種子值總是產生相同的隨機數序列)。
    示例:
Random rand = new Random(47);//每次運行結果相同
Random randDif = new Random();//每次運行結果不同
int i;
// Choose value from 1 to 100:
//rand.nextInt(100)設置了所產隨機數的上限為100,而其下限為0,為避免除零,應該進行加1操作。
i = rand.nextInt(100) + 1;
float u; // Applies to doubles, too
//chosen (approximately) uniformly from the range 0.0f (inclusive) to 1.0f (exclusive)
u = rand.nextFloat();
long l;
l = rand.nextLong();
double d;
//chosen (approximately) uniformly from the range 0.0d (inclusive) to 1.0d (exclusive)
d = rand.nextDouble();
3.一元減號用于轉變數據的符號,而一元加號只是為了與一元減號相對應,但是它唯一的作用僅僅是將較小數據類型的操作數提升為int。
4.++和--說明

對于前綴形式(++i和--i),在執行完運算后才得到值;對于后綴形式(i++和i--),則是在執行運算之前就得到值。

5.關系操作符

關系操作符中,等于和不等于適用于所有基本數據類型,而其他比較符不適用于boolean類型,因為boolean值只能為true或false,“大于”和“小于”沒有實際意義。

和!=也適用于所有對象,但是它們比較的是對象的引用。要比較兩個對象的實際內容,應該使用所有對象都適用的特殊方法equals()。但是該方法不適用于基本類型,基本類型直接使用和!=即可。

注意實現自己的類時,若想使得該類的兩個對象的內容可以作比較運算,應該覆蓋自己設計類中的equals()方法,因為equals()的默認行為是比較對象的引用。

6.邏輯操作符

"&&"、“||”、“!”操作只可應用于布爾值,與C和C++不同的是:不可以將一個非布爾值當做布爾值在邏輯表達式中使用。

7.關于二進制

在C、C++或Java中,二進制數沒有直接常量表示方法。但是,通過Integer和Long的靜態方法toBinaryString()可以很容易地實現二進制形式輸出。

8.指數計數法

“e”代表10的冪次,如1.39e-43f表示1.39x10-43,編譯器將指數字面量當成double處理,所以在指數常量后最好加上后綴"d"和"f"。

9.按位操作符(只可用來操作整數基本數據類型中的單個“比特位”)

&、|、^、~分別為按位“與”、按位“或”、按位“異或”和按位“非”,“~”是一元操作符,所以不可與“=”聯合使用,其他三個可以。

我們可將布爾類型作為一種單比特值對待,并且可對布爾類型執行按位“與”、按位“或”和按位“異或”運算,但不能執行按位“非”。對于布爾值,按位操作符具有與邏輯操作符相同的效果,只是它們不會中途“短路”。此外,針對布爾值進行的按位運算為我們新增了一個“異或”邏輯操作符,它并未包括在“邏輯”操作符的列表中。

10.移位操作符(只可用來處理整數基本數據類型中的二進制“位”)
  1. <<,左移位操作符,低位補零;
  2. >>,右移位操作符,“有符號”右移位操作符使用“符號擴展”:若符號為正,則高位補零;若符號為負,則高位補1;
  3. >>>,“無符號”右移位操作符,使用“零擴展”:無論正負,都在高位補零。這一操作符是C或C++中所沒有的。
11.三元操作符if-else
boolean-exp ? value0 : value1
12.字符串操作符+和+=(字符串連接符)
package io.github.wzzju; /* Added by Eclipse.py */
import static io.github.wzzju.util.Print.*;
public class StringOperators {
  public static void main(String[] args) {
    int x = 0, y = 1, z = 2;
    String s = "x, y, z ";
    print(s + x + y + z);//輸出結果是x, y, z 012
    print(x + y + z + s);//輸出結果是3x, y, z 
    print(x + " " + s); // Converts x to a String
    s += "(summed) = "; // Concatenation operator
    print(s + (x + y + z));
    print("" + x); // Shorthand for Integer.toString()
  }
}
13.使用操作符常犯的錯誤
while(x = y){
//...
}

上述代碼中只要x,y不都為布爾值,在Java中就不會編譯通過,因為Java不會自動將int數值轉換為布爾值。Java編譯器不會允許我們隨便把一種類型當做另外一種類型來用。

14.關于類型轉換
  • 窄化轉換(narrowing conversion),必須顯示進行類型轉換。
  • 擴展轉換(widening conversion),不必顯示進行類型轉換。

注意:Java允許我們把任何基本數據類型轉換為別的基本數據類型,但布爾型除外,因為布爾型根本不允許進行任何類型的轉換處理。
將float或double轉型為整型值時,總是對該數字執行結尾。如果想要得到四舍五入的結果,就需要使用java.lang.Math中的round()方法,由于round()是java.lang的一部分,因此使用它時不需要額外導入。
對基本數據類型執行算術運算或按位運算,只要類型比int小(即char、byte或者short),在運算之前這些值會自動轉換成int。

15.Java沒有sizeof

sizeof在c/c++中存在主要是為了解決移植問題的,但是在Java中所有數據類型在所有機器中的大小都是相同的,所有不需要sizeof()操作符來解決移植問題。

16.關于布爾型值

能夠對布爾型值進行的運算非常有限。我們只能賦予true和false值,并測試它的真假,而不膩對布爾值進行其他任何運算(如加、減等)。

17.關于溢出

兩個較大的int值相乘可能會溢出,但是編譯器不會給出任何出錯或警告的信息。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • Win7下如何打開DOS控制臺? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,614評論 4 12
  • 芒果興奮的告訴我,他男神打電話給她讓她等一下走,說會晚一點來公司,讓她多等一下。芒果耐著性子在加完班后又在公司百無...
    百事可愛喲閱讀 284評論 0 0
  • 我們在做分享之前,多多少少都是有些害怕的。這里說的分享包括寫作,演講,培訓等。我們與別人分享自己觀點總有一些顧慮和...
    看見繁花閱讀 828評論 6 16
  • 為進一步推動農村電子商務加快發展,財政部、商務部、國務院扶貧辦三部門聯合發布了《關于開展2017年電子商務進農村綜...
    云店互聯閱讀 162評論 0 0