1. 程式人生 > >操作符的詳解

操作符的詳解

方向 操作符 也會 sizeof 算法 mark 定義 可能 stat

操作符

更簡單的打印語句

  1. 靜態導入, 讓我們省去了new這個類的步驟,會在加載類的時候自動默認加載。
  2. think中使用打印語句system.out.print,用一個方法將它縮短print這樣輸出的使用就可以直接使用print去打印, 但是實際開發基本用不到靜態導入,也基本不會去用另一個方法去縮短輸出語句,畢竟編輯器中有輸出的快捷方式。

使用Java操作符號

操作符基本只能操作基本數據類型, 除了等於, 不等於,恒等於這些關系的 操作符號。
String,可以接受+ +=進行連接: 把數字和字符串進行連接變成一個字符串

優先級

其實對於優先級的理解只要小括號優先, 其他的數字,邏輯運算優先於關系運算, 普通的加減乘除會比其他的來的優先一點。

賦值

關於賦值有一道題目, 是:

Demo t1 = new Demo() 
Demo t2 = new Demo() 

t1.level  =  t2.level;
t1.level = 27

請問這個時候t2.level的值為多少?
呃呃呃。。。 根據引用傳遞的原則, 因為t2的引用賦值給了t1,所以t1改變的也會讓t2改變

算數操作符號

這個章節主要是講述了, 加減乘除,取模運算, 在整數裏面, 除法如果不夠除會直接得數為0而不是為小數。 浮點型裏面按照位數進行保留, 然後還提到一點, 隨機數是利用時間進行充當種子進行計算,因為每個時間段都不一樣, 也就造成了隨機數的不一樣, 假設我們new Random 對象的時候進行了提供隨機數, 那麽我們也就能得到相同的時間序列了
 public static void main(String[] args) {

  public static void main(String[] args) {

      java.util.Random r=newjava.util.Random(10);

      for(int i=0;i<10;i++){

          System.out.println(r.nextInt());

      }

  } 

運行以上代碼就可以發現每次隨機數都是相同的。

自動遞增和遞減

  • 自增和自減, 要把握的精髓就是要知道, 增加放在前面就是語句運行前增加, 放在後面就是語句結束的時候增加。 當然如果把自增或者自減 ,放在單獨的一行,那麽結果一定是一樣的。
    關於自增我們看到源碼我們也能知道, for循環的底層,就是用while語句中用一個flag(標識變量)進行控制,從而達到控制循環的目的。
  • 順便再提一下, while循環其實就是用goto進行不斷的返回之前的代碼地址,從而達到循環的目的。
  • 提到循環不得不提一下, foreache的循環其實就是for循環。 可以試著寫一個foreach的代碼,生成的class文件進行反編譯後。 可以得到代碼 ,裏面就會驚奇的發現原來的foreach其實就是for循環。
  • 得出的結論, 其實Java中很多類都是通過之前的類進行封裝修飾, 得到現有的類。
  • 實際用途上我們也可以運用這種理念進行學習封裝, 就好像我們平時打的jar包, 各種的插件, 讓我們避免了重復性的代碼工作。

關系操作符

  • 再關系運算符我們只要知道:
    等於號, 不等於, 大於小於,恒等於...
    裏面要註意的點就是:== 和 equal的區別
    == 是比較的數據的地址, 而 equal方法的實現是比較的是值的比較。方法的思路就是, 把一類轉化成值, 然後進行比較。
    由以上可以知道
Integer a = 2;
Integer b = 2;

String c = "你猜";
String d = "你猜";

a b如果用== 結果是不一樣的因為地址是不一樣的, 但如果用equal則比較的是值的大小所以是相同的。
但是c 和d 用 == 運行的時候為什麽又相同呢。 因為String類型再堆裏面的方法區中有一個常量池, String類型的數據首先會到常量池裏面去尋找如果有的化就不用重新進行創建對象,也就是給內存空間。 所以c和d 結果是true。

邏輯操作符號

  1. 邏輯操作符: 與 或 非。
  2. 裏面比較特別的就是短路問題, 如果在或中,其中一個判斷條件如果已經確定了, 那麽就不會進行下一個的判斷條件,直接運行, 這樣在大量的工作中會節省內存。
  3. 測試的語句, 只要拿一個標誌變量在短路語句中,進行對值的操作,這樣從標誌變量中就可以看出是否有經過這個判斷。

直接常量

直接常量是指, 編譯器可以直接知道需要什麽類型的數據, 比如:

  • 比如在輸出十六進制的時候要加0x, 在八進制的時候要加0 , 在float類型的時候後面要加任意大小的f, 在long類型的時候一定要加大寫的L(害怕混肴)
  • 這邊的科學計數法用e去標識10的基底數,還有一個是在浮點型的時候科學記數法是被默認用雙精度類型的引用去裝。

按位操作符號

  • 按為運算符, 是對整數基本類型中的,單個比特(二進制位的數)進行運算, 然後再web開發中使用的很少。
    有:與 或 非 亦或

移位操作符

  • 移位運算符號,再日常項目中用到的就更加少了, 舉個實用的例子, 因為移位操作符是再二進制中的, 比如左移一位,增加了兩種可能,所以是乘二。 向反方向則相反,為除, 用移位操作符,可以提高效率, 這也算是另類的算法把。
  • 另外再不得不提的是, 移位跟符號位和非符號位不無關系, 正是因為符號位占了一位,所以int類型的數位4個字節,但它是從-2的31次方 到2的31次方

三元操作符

三元運算符:只要知道格式是 express?true: false;就行

字符串操作符

+= = 這裏講述的編譯器的一個特性, 開始為字符串的i語句中,後面跟的變量會被編譯器同樣認為是字符串進行操作

使用操作符時常犯的錯誤

這裏書中給的例子是: 當我們再進行while循環的時候。 判斷條件是a = b; 這樣的是賦值語句, 在c語言中結果就會一直進行循環操作, 只要結果是為0之外的任何數。 而Java虛擬機, 只認布爾值, 這樣的數值在編譯的時候就會報錯。 所以我們就不存在這種邏輯上的錯誤了

類型轉換操作符

  • 裏面就是指類型轉換問題:無非就是窄化轉換,和擴展轉換。
  • 窄化轉換具有數據丟失的風險。 擴展轉換則沒有, 但是浮點類型的數據和等大的整型數據之間的轉化會出現精度丟失的問題。
  • 然後值得一提的是,我們之前所說的範型,裏面就用到窄化轉換, 因為我們是單繼承的, 但是為什麽沒有事呢, 因為我們實現記錄了它的類型進行轉化的對象是自己。 轉化成最大的父類Object不會丟失數據, 父類轉化為本身的時候的值自然就不會丟失數據。

Java沒有sizeof

  • 首先什麽是sizeof , sizeof 是c或者c++的程序員用於告訴你為數據項分配的字節數,因為在不同的機子上, 數據類型的大小是不相同的, 但是在Java中, Java虛擬機將其定義為相同的。

操作符的詳解