Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
JustinSDK committed Nov 11, 2020
2 parents fb6e1f1 + abc7cd3 commit 0df180f
Show file tree
Hide file tree
Showing 12 changed files with 74 additions and 64 deletions.
2 changes: 1 addition & 1 deletion docs/CH06.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ public class AppendStringTest {
for(int i = 0; i < 10000; i++)
builder.append(i);

使用 StringBuilder 最後若要輸出字串結果,可以呼叫其 toString() 方法,您可以使用 length() 方法得知目前物件中的字元長度,而 capacity() 可傳回該物件目前可容納的字元容量,另外 StringBuilder 還有像是 insert() 方法可以將字元插入指定的位置,如果該位置以後有字元,則將所有的字元往後移;deleteChar() 方法可以刪除指定位置的字元,而 reserve() 方法可以反轉字串,詳細的使用可以查詢看看 java.lang.StringBuilder 的 API 文件說明。
使用 StringBuilder 最後若要輸出字串結果,可以呼叫其 toString() 方法,您可以使用 length() 方法得知目前物件中的字元長度,而 capacity() 可傳回該物件目前可容納的字元容量,另外 StringBuilder 還有像是 insert() 方法可以將字元插入指定的位置,如果該位置以後有字元,則將所有的字元往後移;deleteChar() 方法可以刪除指定位置的字元,而 reverse() 方法可以反轉字串,詳細的使用可以查詢看看 java.lang.StringBuilder 的 API 文件說明。

StringBuilder 是 J2SE 5.0 才新增的類別,在 J2SE 5.0 之前的版本若有相同的需求,是使用 java.lang.StringBuffer,事實上,StringBuilder 被設計為與 StringBuffer 具有相同的操作介面,在單機非「多執行緒」(Multithread)的情況下使用 StringBuilder 會有較好的效率,因為 StringBuilder 沒有處理「同步」(Synchronized)問題;StringBuffer 則會處理同步問題,如果您的 StringBuilder 會在多執行緒下被操作,則要改用 StringBuffer,讓物件自行管理同步問題,關於多執行緒的觀念,會在第 15 章詳細說明。

Expand Down
2 changes: 1 addition & 1 deletion docs/CH07.md
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ public class SafeArrayDemo {

public Account(String number, double money) {
accountNumber = number; // 實際等於this.accountNumber = number;
this.balance = money; // 實際等於this.balance = money;
balance = money; // 實際等於this.balance = money;
}

this 除了用來參考至呼叫方法的實際物件之外,還有一種可以帶引數的用法,主要是用於呼叫建構方法,而避免直接以建構方法的名稱來呼叫,例如在下面的程式片段中,當使用無參數的建構方法 Ball() 時,它會呼叫有參數的建構方法:
Expand Down
6 changes: 3 additions & 3 deletions docs/CH08.md
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ public class CloneDemo {

public class ConcreteCircle {
private double radius;
public void setRedius(int radius) { this.radius = radius; }
public void setRadius(double radius) { this.radius = radius; }
public double getRadius() { return radius; }
public void render() {
System.out.printf("畫一個半徑 %f 的實心圓\n", getRadius());
Expand All @@ -652,7 +652,7 @@ public class CloneDemo {

public class HollowCircle {
private double radius;
public void setRedius(int radius) { this.radius = radius; }
public void setRadius(double radius) { this.radius = radius; }
public double getRadius() { return radius; }
public void render() {
System.out.printf("畫一個半徑 %f 的空心圓\n", getRadius());
Expand All @@ -666,7 +666,7 @@ public class CloneDemo {
public abstract class AbstractCircle {
protected double radius;

public void setRedius(int radius) { this.radius = radius; }
public void setRadius(double radius) { this.radius = radius; }
public double getRadius() { return radius; }

public abstract void render();
Expand Down
2 changes: 1 addition & 1 deletion docs/CH10.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ Error 類別與 Exception 類別都繼承自 Throwable 類別,Throwable 類別

除了使用這些方法之外,您也可以簡單的利用例外物件 toString() 方法取得例外的簡單訊息描述。

您所接觸的例外通常都是衍生自 Exception 類別,其中是有些「受檢例外」(Checked exception),例如 ClassNotFoundException(嘗試載入類別時失敗所引發,例如類別檔案不存在)、InterruptedException(執行緒非執行中而嘗試中斷所引發的例外)等,而有些是「執行時期例外」(Runtime exception),也稱「非受檢例外」(Unckecked exception),例如 ArithmeticException、ArrayIndexOutOfBoundsException 等。以下列出一些重要的例外繼承架構:
您所接觸的例外通常都是衍生自 Exception 類別,其中有些是「受檢例外」(Checked exception),例如 ClassNotFoundException(嘗試載入類別時失敗所引發,例如類別檔案不存在)、InterruptedException(執行緒非執行中而嘗試中斷所引發的例外)等,而有些是「執行時期例外」(Runtime exception),也稱「非受檢例外」(Unchecked exception),例如 ArithmeticException、ArrayIndexOutOfBoundsException 等。以下列出一些重要的例外繼承架構:

Throwable
  Error(嚴重的系統錯誤)
Expand Down
4 changes: 2 additions & 2 deletions docs/CH12.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,8 +198,8 @@ public class GenericFoo2<T1, T2> {

您可以如下使用 GenericFoo2 類別,分別以 Integer 與 Boolean 設定 T1 與 T2 的真正型態:

GenericFoo<Integer, Boolean> foo =
new GenericFoo<Integer, Boolean>();
GenericFoo2<Integer, Boolean> foo =
new GenericFoo2<Integer, Boolean>();
泛型可以用於宣告陣列型態,範例 12.7 是個簡單示範。

Expand Down
6 changes: 3 additions & 3 deletions docs/CH14.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ public class StreamDemo {

### 14.2.2 FileInputStream、FileOutputStream

java.io.FileInputStream 是 InputStream 的子類,由開頭 File 名稱上就可以知道,FileInputStream 與從指定的檔案中讀取資料至目的地有關,而 java.io.FileOutputStream 是 OutputStream 的子類,顧名思義,FileOnputStream 主要與從來源地寫入資料至指定的檔案中有關。
java.io.FileInputStream 是 InputStream 的子類,由開頭 File 名稱上就可以知道,FileInputStream 與從指定的檔案中讀取資料至目的地有關,而 java.io.FileOutputStream 是 OutputStream 的子類,顧名思義,FileOutputStream 主要與從來源地寫入資料至指定的檔案中有關。

當您建立一個 FileInputStream 或 FileOutputStream 的實例時,必須指定檔案位置及檔案名稱,實例被建立時檔案的串流就會開啟,而不使用串流時,您必須關閉檔案串流,以釋放與串流相依的系統資源,完成檔案讀寫的動作。

Expand Down Expand Up @@ -751,7 +751,7 @@ public class ObjectStreamDemo {
momor 103
becky 104

注意在試圖將物件附加至一個先前已寫入物件的檔案時,由於 ObjectOutputStream 在寫入資料時,還會加上一個特別的串流頭(Stream header),而讀取檔案時會檢查這個串流頭,如果一個檔案中被多次附加物件,那麼該檔案中會有多個串流頭,如此讀取檢查時就會發現不一致,這會丟出 java.io.StreamCorrupedException,為了解決這個問題,您可以重新定義 ObjectOutputStream 的 writeStreamHeader() 方法,如果是以附加的方式來寫入物件,就不寫入串流頭:
注意在試圖將物件附加至一個先前已寫入物件的檔案時,由於 ObjectOutputStream 在寫入資料時,還會加上一個特別的串流頭(Stream header),而讀取檔案時會檢查這個串流頭,如果一個檔案中被多次附加物件,那麼該檔案中會有多個串流頭,如此讀取檢查時就會發現不一致,這會丟出 java.io.StreamCorruptedException,為了解決這個問題,您可以重新定義 ObjectOutputStream 的 writeStreamHeader() 方法,如果是以附加的方式來寫入物件,就不寫入串流頭:

ObjectOutputStream objOutputStream =
new ObjectOutputStream(
Expand Down Expand Up @@ -973,7 +973,7 @@ public class PrintStreamDemo {
### 14.2.8 ByteArrayInputStream、ByteArrayOutputStream

串流的來源或目的地不一定是檔案,也可以是記憶體中的一個空間,例如一個位元陣列,java.io.ByteArrayInputStream、java.io.ByteArray OutputStream 即是將位元陣列當作串流輸入來源、輸出目的地的類別。
串流的來源或目的地不一定是檔案,也可以是記憶體中的一個空間,例如一個位元陣列,java.io.ByteArrayInputStream、java.io.ByteArrayOutputStream 即是將位元陣列當作串流輸入來源、輸出目的地的類別。

ByteArrayInputStream 可以將一個陣列當作串流輸入的來源,而 ByteArrayOutputStream 則可以將一個位元陣列當作串流輸出的目的地,在這邊舉一個簡單的檔案位元編輯程式作為例子,您可以開啟一個簡單的文字檔案,當中有簡單的 ABCDEFG 等字元,在讀取檔案之後,您可以直接以程式來指定檔案中位元的位置來修改所指定的字元,作法是將檔案讀入陣列中,指定陣列索引修改元素,然後重新將陣列存回檔案,範例 14.14 是實作的程式內容。

Expand Down
4 changes: 2 additions & 2 deletions docs/CH16.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public class ClassDemo {

Class stringClass = String.class;

Java 在真正需要類別時才會載入類別,所謂「真正需要」通常指的是要使用指定的類別生成物件時(或是使用者指定要載入類別時,例如使用 Class.forName() 載入類別,或是使用 ClassLoader 的 loadClass() 載入類別,稍後都會說明)。使用類別名稱來宣告參考名稱並不會導致類別的載入,可以設計一個測試類別的印證這個說法
Java 在真正需要類別時才會載入類別,所謂「真正需要」通常指的是要使用指定的類別生成物件時(或是使用者指定要載入類別時,例如使用 Class.forName() 載入類別,或是使用 ClassLoader 的 loadClass() 載入類別,稍後都會說明)。使用類別名稱來宣告參考名稱並不會導致類別的載入,可以設計一個測試類別印證這個說法

#### **範例 16.2 TestClass.java**
```java
Expand Down Expand Up @@ -475,7 +475,7 @@ onlyfun.caterpillar.SomeClass 是個自訂類別,您在目前的工作目錄

由於 SomeClass 這次可以在 Bootstrap Loader 的設定路徑下找到,所以會由 Bootstrap Loader 來載入 SomeClass 類別,Bootstrap Loader 通常由 C 撰寫而成,在 Java 中沒有一個實際的類別來表示,所以顯示為 null,因為表示為 null,所以再 由 null 上嘗試呼叫 getParent() 方法就會丟出 NullPointerException 例外。

取得 ClassLoader 的實例之後,您可以使用它的 loadClass() 方法來載入類別,使用 loadClass() 方法載入別時,不會執行靜態區塊,靜態區塊的執行會等到真正使用類別來建立實例時,例如您可以改寫範例 16.7 為範例 16.12。
取得 ClassLoader 的實例之後,您可以使用它的 loadClass() 方法來載入類別,使用 loadClass() 方法載入類別時,不會執行靜態區塊,靜態區塊的執行會等到真正使用類別來建立實例時,例如您可以改寫範例 16.7 為範例 16.12。

#### **範例 16.12 ForNameDemoV3.java**
```java
Expand Down
2 changes: 1 addition & 1 deletion docs/CH17.md
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ Annotation 標示於方法上的話,就要取得方法的 Method 代表實例
TYPE, // 適用 class, interface, enum
FIELD, // 適用 field
METHOD, // 適用 method
PARAMETER, // 適用 method 上之 parametar
PARAMETER, // 適用 method 上之 parameter
CONSTRUCTOR, // 適用 constructor
LOCAL_VARIABLE, // 適用區域變數
ANNOTATION_TYPE, // 適用 annotation 型態
Expand Down
2 changes: 1 addition & 1 deletion docs/CH18.md
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,7 @@ public class MessageFormatDemo {

### 18.3.3 國際化訊息

國際化的英文是 Internationalization,因為單字中總共有18個字母而首尾字元分別為 'I' 與 'N',所以簡稱 I18N,國際化的目的是讓應用程式可以依地區不同而顯示不同的訊息,最基本的就是讓不同語系的使用者可以看到屬於自己語系的訊息,像是英文語系的看到英文內容,而中文語系的可以看到中文的內容。
國際化的英文是 Internationalization,因為單字中總共有20個字母而首尾字元分別為 'I' 與 'N',所以簡稱 I18N,國際化的目的是讓應用程式可以依地區不同而顯示不同的訊息,最基本的就是讓不同語系的使用者可以看到屬於自己語系的訊息,像是英文語系的看到英文內容,而中文語系的可以看到中文的內容。

為了在應用程式中表示一個區域,Java 提供有 java.util.Locale 類,一個 Locale 實例包括了語系資訊與區域資訊,例如 "en" 表示英文語系的國家,這個字母組合是在 ISO 639 中定義的,而區域資訊則是像 "US" 表示美國,這個字母組合則是在 ISO 3166 中定義的。

Expand Down
Loading

0 comments on commit 0df180f

Please sign in to comment.