第三章 操作符

飄過的小熊發表於2016-09-07

第三章 操作符

標籤(空格分隔): AgainThinkingInJava


挑出幾個似乎已經忘記了的點


  • 別名問題
  • Random類物件的種子
  • 短路
  • 直接常量
  • 移位操作符的道道
  • Java中為什麼沒有sizeof()

別名問題


這個問題就是說的

String s=new String ();
String s1;
s1=s;

此時s1s是指向的同一個物件,假如執行語句s1=new ("dhgh"),則在執行語句System.out.println(s)會輸出dhgh
事實上我記得有的資料在解釋引用的時候就是講的引用是一個變數的別名

於是牽扯出了一個更大的問題就是,呼叫方法的時候,雖然很多人知道是複製的引用,但是不知道原理,這裡的原理就是別名現象。是不是有一種頓悟的感覺。

Random類的種子


很多人知道要給種子或者可以不給種子,但是很多人在使用的並不知道在什麼場合選擇什麼樣的方式。

  • Random rand =new Random(47);

給一個數字的目的是產生相同序列的隨機數,假如有的場合你需要多次產生相同的隨機數序列就可以使用這種方式,可能有的人不是很理解,什麼叫相同的隨機數序列,多動腦。

  • Random rand =new Random();

這種方式就是預設用時間作為隨機數生成器的種子,每次生成的隨機數序列都不一樣

短路


書中對於短路的證明很到位,短路就是說的,要是吃兩個包子就已經飽了,就不用再多吃了。

直接常量


都知道在定義常量的時候怎麼定義,都知道雙精度常量數要這樣

double d=1.2d;

但是不知道應該怎麼來描述,好吧,這樣直接定義的變數叫直接常量,與什麼區域性變數,全域性變數還是很有區別的,只是範圍的問題。至於末尾加的d字母,是為了對編譯器進行指導

注意到二進位制數是沒有直接變數表示的,和C++一樣,可以使用某種方法將值進行轉化成二進位制數。Java中就是Integer.toBinaryString(),當然顯然是對int型別及以下的基本資料型別使用。單雙精度都不可以。我就奇怪難道二進位制小數就沒辦法轉了?,還有一點值得注意的這個方法對前導零無感,輸出的時候不會出現前導零。

移位操作符的道道


一個數字進行左移。沒問題,直接低位及以上整體左移,低位補0.
一個數字進行右移,如果是無符號,右移的操作符變為>>>,無論正負都是在高位插入0.這叫零擴充套件
如果是有符號的,右移操作符不變,但是假如符號位為正,就在高位連續的補0,假如為負,就在高位補1。,這叫符號擴充套件

當然要是有人問為什麼說無符號但是還有正負呢。因為計算機中的數字二進位制是用補碼錶示的。

Java中為什麼沒有sizeof()


這個sizeof()本來是C系列用來測量為資料項分配的位元組數。C和C++要用這個方法在“移植”的時候出力。因為在不同的機器上就算是相同的資料型別都可能被分配不一樣的大小。比如在一個32位機器和64位機器上跑同一個程式就要考慮考慮這個問題。但是Java不需要,所有的資料型別在所有的機器中的大小是相同。不必考慮移植問題,因為它已經被設計在語言中了。

相關文章