
Java Tutorial 第二堂(1)數值與字串型態
Java Tutorial 第一堂(4)套件、I/O 與例外 << 前情 第二堂上課囉!在知道怎麼撰寫、執行第一個 Java 程式之後,接下來就要瞭解一下 Java 這個程式語言,只不過我們只剩五個小時,因而採取的方式是,在這一個小時很快地瀏覽過 Java 語言的重要基本元素,之後四個小時再從更多實際的範例中瞭解 Java 語言。 那麼,哪些東西才是語言中重要而基本的元素呢?Pascal 之父 Niklaus E. Writh 曾說過: Algorithms + Data Structures = Programs 演算法與資料結構就等於程式,而一門語言提供的資料型態(Data type)、運算子(Operator)、程式碼封裝方式等,會影響演算法與資料結構的實作方式,因此這一堂對於 Java 語言講解的重點將選定在:
型態系統雖然帶動與普及了物件導向的設計,不過 Java 本身並不是純綷的物件導向語言,像是就型態系統而言,Java 就並非每個值都是物件,就目前版本的 Java 而言,混合了兩個型態系統:基本型態(Primitive type)與物件型態(Object type)。 Java 中的基本型態就是純綷的值,1 就是 1,0.2 就是 0.2, Java 支援物件導向,物件型態就是另一型態系統,物件是由一組相關的狀態,以及支援狀態的操作組成。對於基本型態,Java 亦有對應的包裹器(Wrapper)型態,可配合需要物件的場合。過去曾經討論過,在未來的版本中也許會拿掉 Java 中基本型態,只留下物件型態,不過現階段而言,基本型態與物件型態還是並存的,兩種都必須瞭解。 型態眾多,對於初學一門語言來說,或說對於學習 Java 語言來說,這邊將著重在以下幾個型態之介紹:
這篇文章中,我們要先來認識數值型態與字串型態,而數值型態中會一併介紹基本型態與對應的物件型態。 數值型態在基本型態中,依需要的資料長度不同,整數可以使用 如果僅寫下 1 這樣的實字(Literal),會是 byte number1 = 1; byte number2 = 128; // error: possible loss of precision Java 中不會自動使用 long number1 = 12345678987654321L; long number2 = 12345678987654321; // error: integer number too large: 12345678987654321
那麼超過 import java.math.BigInteger; import static java.lang.System.out; public class Cal { public static void main(String[] args) { BigInteger x = new BigInteger(args[0]); BigInteger y = new BigInteger(args[2]); switch(args[1]) { case "+": out.println(x.add(y)); break; case "-": out.println(x.subtract(y)); break; case "x": out.println(x.multiply(y)); break; case "/": out.println(x.divide(y)); } } }
如果需要將基本型態包裝為物件型態,可以直接使用對應的 Integer x = 10; Integer y = 20; Integer z = x + y; 這當中有一些語法蜜糖,目的在讓你使用這些包裹器類別時,如同使用基本型態一樣的方便。 在基本型態中,依需要的資料精確度不同,浮點數可以使用 double number1 = 0.3; float number2 = 0.3; // error: possible loss of precision 如果想要使用 float number1 = 0.3F; float number2 = (float) 0.3; 在數值前加上一個型態限定,通常被稱之為轉型,實際上,這就是關閉編譯器在此處的型態檢查,這樣編譯器就會乖乖地完成編譯,只不過你如果要編譯器在編譯時別那麼囉嗦,那執行時期如果 多數 CPU 與浮點運算器多採用 IEEE754 浮點數運算(IEEE 754 floating-point arithmetic),某些浮點數本身就有誤差,這是每個程式人都應該知道的事。像是 1.0 – 0.8 在程式中不會是 0.2,是電腦科學中違反數學的例子之一: System.out.println(1.0 - 0.8); // 顯示 0.19999999999999996 如果你需要精確度,程式中不應當使用浮點數來直接進行運算,尤其是要避免「算錢用浮點,遲早被人扁」的可能性發生,在需要浮點數精度的時候,Java 中可以使用 import java.math.BigDecimal; import static java.lang.System.out; public class Cal { public static void main(String[] args) { BigDecimal x = new BigDecimal(args[0]); BigDecimal y = new BigDecimal(args[2]); switch(args[1]) { case "+": out.println(x.add(y)); break; case "-": out.println(x.subtract(y)); break; case "x": out.println(x.multiply(y)); break; case "/": out.println(x.divide(y)); } } } 這個例子不過是將前一個計算大整數的程式,把 字元、字串型態字串是由字元組成,在 Java 中要表示字元,必須使用單引號來包裹,像是 如果要表示一串字元,也就是字串的話,Java 中使用雙引號來包裹,像是 Java 中的字串不可變(Immutable),你無法改變已建立的字串內容,字串是 import static java.lang.System.out; public class Main { public static void main(String[] args) { String name = "codedata"; out.println(name.length()); // 8 out.println(name.contains("coded")); // true out.println(name.charAt(3)); // e out.println(name.substring(2, 5)); // ded out.println(name + name); // codedatacodedata char[] characters = name.toCharArray(); for(char ch : characters) { out.printf("%c ", ch); // c o d e d a t a } } } 在 Java 中,只有陣列與具有 String desc = String.format("(%d %.2f %s)", 1, 99.3, "codedata"); System.out.println(desc); // (1 99.30 codedata) 格式化字串時所需要的語法,可以參考 Format String syntax。 談到這邊該注意的是,Java 中若要比較兩個基本型態,可以使用 import static java.lang.System.out; public class Welcome { public static void main(String[] args) { if(args[0].equals("codedata")) { out.println("Hi, Admin!"); } else { out.printf("Welcome, %s%n", args[0]); } } } 以下是這個程式原本想要的情況: 然而,如果將程式中 其實, 本來嘛!要比較兩個物件的狀態,該怎麼比,本來就該定義,Java 中就是使用 有關物件相等性更多的說明,可以參考本站 物件相等性(上)的文章,至於容器型態及 |
張瑞明
05/16
好感動,第一次看不懂,今天終於看懂了。