java學習筆記 2

關於raw type

恰好在預習龍書,就把官網上提供的那份java寫的前端代碼拖了下來看看。php

導入eclipse,發現有一堆warning,其中一個是Reference to generic type Hashtable<K, V> should be parameterized。html

google之,發現了一篇不錯的講解:What is a raw type and why shouldn't we use it?前端

簡而言之,就是泛型和C++的模版同樣,要寫上類型,否則要是玩壞了,編譯的時候不給你報錯,等着runtime來掛就很差了。嗯這代碼很老了吧……再仔細一看,貌似沒什麼註釋也,仍是默默看書好了……java

在eclipse導入已有的project

按照core java上的指示,去導入一個project看看……咦,新版的界面沒有create project from existing source了……python

google一下找到了解決方案: Eclipse Community Forums: Newcomers » helios & "create project from existing source"ios

在建立新project的時候去掉Use default location的勾,選擇對應文件夾就好了。chrome

serialVersionUID

導入另外一個project看看,這回有一個warning:The serializable class ImageViewerFrame does not declare a static final serialVersionUID fieldexpress

再google之,解答:What does it mean: The serializable class does not declare a static final serialVersionUID field?api

OK,那什麼是serializable class?學其餘語言的時候貌似看到過,可是沒仔細看什麼意思。瀏覽器

解答在這裏:

原來就是和python的pickle、JS的JSON相似做用的東西~ 用來把對象轉化成可存儲的格式叫serialization,把類從存儲的byte裏讀出來叫deserialization。eclipse給出這個警告,是由於加一個UID可以確保serialization和deserialization用的是同一版本的類,以避免中途這個類修改過,就會牛頭不對馬嘴了。

要解決這個warning,能夠在類中隨便加一個UID,好比eclipse給出的第一個解決方案就是加上:

private static final long serialVersionUID = 1L;

不過這個東西沒有也不礙事,就是沒那麼安全而已,因此才只是個warning。

demo: ImageViewer

仔細看了一下這個demo的代碼

  • main函數裏看到了多態(JFrame frame = new ImageViewerFrame();而後調用虛函數)
  • Java裏貌似能夠匿名地implement一個interface,而後直接傳給一個函數,像這樣:

    obj.method(new Interface(){
        // override some methods...
    });
  • 這個代碼寫了一個繼承JFrame的ImageViewerFrame類,在它的構造函數裏用Swing的各類輪子來畫界面

demo: WelcomeApplet

傳說中的Java applet!好懷舊的感受……

  • 這個代碼寫了一個繼承JApplet的類,而且加了一個方便跳轉URL的小函數makeAction
  • 也是用了Swing的各類輪子來畫了個界面
  • 這回編譯出.class以後,用JDK附帶的appletviwer來打開這份代碼附帶的一個html,裏面有一個<applet>標籤,其中指明瞭要用這個編譯出的名字的.class。若是使用這種方式打開,<applet>標籤之外的東西都不會被顯示。
  • 除了用命令行,也能夠用eclipse的run as java applet來跑
  • 此外還能夠在編譯完class以後,直接用瀏覽器打開那個html來跑,這回就能夠看到<applet>之外的東西了(可是我家firefox和chrome都以安全緣由把這玩意兒給block了……2333)

Not a Hello World

  • Java 的類也要自帶access modifier(public, private..., etc)
  • Java裏不管任何函數都必須做爲方法依存於類,因此main函數起碼要有個空殼class
  • 代碼文件的basename要和代碼裏那個public類的名字同樣
  • 編譯出的.class裏面是bytecode,能夠反編譯回去,跑的時候用

    java className

    就好了,記得不要加.class

  • main函數總應該是static的。從Java 1.4開始,main函數必定要是public的
  • Java的main函數不用return 0,正常結束的exit code就是0,若是要用其餘exit code結束,能夠調用System.exit(code)
  • 我本身試了一下把main函數寫到另一個文件的另外一個類裏,在裏面調用另外一個類,這樣也是OK的,看了一下eclipse怎麼給我跑的,原來是用了classpath,只要指明用的類編譯出來的.class在哪裏就OK了
  • 若是函數不須要參數,只要用()就行了,裏面不用加void
  • 打印東西到終端主要用到System.out的幾個方法
    • println會自動末尾帶換行(print line)
    • print不會帶換行
    • printf能夠用C風格的format string

Java的註釋

  • 若是你用了/** ... */ (多個星號)的話,能夠用來自動生成文檔(和python的docstring差很少的東西?)
  • 和C/C++同樣,Java的/**/也是不能嵌套滴

數據類型

  • Java的各類整型和char都是跨平臺的一致
  • 和C/C++同樣,前綴換數制,後綴換類型
  • Java 7還支持一個很nice的東西:像英文寫數字的,同樣,能夠用_分割長的數字,好比1000000=1_000_000,編譯器編譯的時候會自動無視它們,可是人眼看着會舒服一點(不用數位數了呵呵呵)
  • Java的primitive type裏沒!有!unsigned type!(反正留着也是麻煩2333)
  • Java有NaN,要用就寫Double.NaN,用法和JS的相似,整數除0拋異常,浮點數除0獲得NaN
  • Java裏的整數和布爾類型是沒有隱式轉換的,也就是說你不能if(0)這樣玩,因此就能夠防止

    if (x = 0)

    這種手誤,編譯的時候就給你報錯抓出來(果真是提防豬隊友指定語言……)

變量

  • Java的變量名能夠用$,可是基本上是預留給自動生成的代碼用的,本身寫就別用了
  • Java裏是沒有C/C++中的那種declaration和definition之分的,你不能像C同樣一處寫個extern int i,一處寫個int i = 10,或者C++那樣頭文件寫個class declaration,.cpp寫個definition。在Java裏,你們都寫一起(.java文件裏)。關於這點能夠參考:What is the difference between declaration and definition in Java?。固然若是是JS裏的那種declaration(int i)和definition(i = 10)之分,那仍是有的。
  • Java裏的常量用final,好比類的靜態常量就能夠用

    static final int x = 10;

    這樣聲明。詭異的是const也是Java的保留字,雖然如今的Java語法里根!本!沒用它!

運算符

  • 由於浮點數運算的一致性實在太難保證了(有些處理器用80bit來保存浮點數,簡直不能作朋友),因此Java默認是不保證這個的,除非你在函數名上加個strictfp,裏面的運算就會保證這個,好比

    public static strictfp void func() {...}
  • Java的&&和||也是短路的,&和|就不是了
  • 對int左右移的時候,右算子會%32,long的話%64
  • >>是算術右移(用sign bit填充),>>>是邏輯右移(用0填充),C/C++這方面是implementation dependent的,因此這算是Java的一個改進
  • 和JS同樣,常見的數學運算都是Math這個類的靜態方法。若是不想每次都寫Math.xxx這樣好麻煩,能夠用

    import static java.lang.Math.*

    (能夠看出java的import是有static之分的,和python不一樣的是想不加類名直接import,沒有from xxx import xxx這種東西)

  • cast的方法和C同樣,注意布爾型是不給cast的,手動都不行!若是你要cast,就只能相似這樣

    i == 0 ? true : false
    b ? 1 : 0
  • Java沒有逗號運算符,不過在for的第一和第三個空隙裏能夠用逗號分開表達式

enum

  • Java裏也有這個東西,囧

字符串

  • Java自帶一個String類,掌聲鼓勵~
  • 用法貌似和JS差很少,Java裏的對象和JS同樣都是引用
  • Java的String也是immutable的,要改呢你就用各類方法和運算符算好了以後賦值給本身就好了
  • 注意判斷字符串內容相等要用s.equals(t)這樣的形式,或者能夠用s.compareTo(t) == 0(貌似在algorithms裏見到過這個注意,compareTo是由於它implement了一個叫Comparable的interface)。若是用了==,判斷的是引用位置是否相等而已。(和JS裏用new String("xxx")獲得的對象的用法相似)。
  • 關於各類比較方法的資料
  • 還有一個很方便的equalsIgnoreCase()能夠用
  • 空字符串和null的區別相似於JS
  • 要獲得單個字符,用charAt,從0數起
  • 由於Java的String都是用unicode的,因此會有char和code point的區別
  • String的不少方法都和JS蠻像的……JS的大腿抱得真是好
  • 若是要將一堆小的字符串聚集成一個大的字符串,能夠用StringBuilder(Java 5引入的新類,之前用的是StringBuffer)
相關文章
相關標籤/搜索