---
# System prepended metadata

title: Java 課程整理（二）
tags: [course2, course, tutorial article]

---

## 1, 開發第一步

### 1-1, 新增專案, class, package, main 定義區塊 等. 

```java
//created class
public class TestClass {
   //這樣就是一個最基本程式的殼了，但也因為只是個基本的殼，所以無法做任何事情
}
```
### 1-2, 簡述 main 跟 package

#### package
```
Package（套件）是 Java 中一個用於組織和管理類別（Class）的機制。
可以把套件看作是一個容器，用於將相關的類放在一起，以便更好地組織和管理您的程式碼。

與現實生活中的包裹或盒子類似，Java 的套件允許您將相關的類放在同一個套件中。
這樣做的好處是可以使程式碼更具結構性和可讀性。您可以將相關的類放在同一個套件中，
以便更輕鬆地查找和使用它們。

套件使用關鍵字 package 來聲明，位於 Java 程式檔案的頂部。
例如，package com.example.myapp; 表示這個檔案屬於 com.example.myapp 套件。

當您在程式碼中聲明了一個套件後，其他檔案中可以使用相同套件名稱的類來訪問它。
這需要使用 import 關鍵字將相關的類引入到您的檔案中，以便在程式碼中使用它們。

總結來說，套件是一個用於組織和管理相關類的機制。
它可以幫助您保持程式碼的結構性和可讀性，並且讓您更方便地使用和訪問類。
```
#### package 命名規則
```
在 Java 中，套件的命名需要遵守一些規則，以下是套件命名的常見規則：

1, 名稱使用小寫字母：套件名稱應該全部使用小寫字母，不應該包含任何大寫字母。

2, 使用句點作為分隔符：套件名稱中的各個部分應該使用句點（.）作為分隔符。
例如，com.example.myapp 是一個合法的套件名稱。

3, 使用有意義的名稱：套件名稱應該能夠描述該套件中包含的類的功能或用途。
儘量選擇具有意義且易於理解的名稱，以提高程式碼的可讀性。

使用反轉的網域名稱：為了避免套件名稱的衝突，通常建議在套件名稱中使用反轉的網域名稱。
例如，如果您的網域名稱是 example.com，您可以使用 com.example 作為套件名稱的前綴。

總結來說，套件命名應該使用全小寫字母，使用句點分隔不同的部分，
選擇具有意義的名稱並遵從反轉的網域名稱的慣例。
這些規則有助於提高程式碼的可讀性和組織性。
```
```java
//接續著剛剛的殼，把 package 加上去，更完整這個架構
package com.mypackage;

public class TestClass {
}
```
#### main
```
在 Java 中，main 是一個特殊的方法，是整個程式的進入點，
當你執行一個 Java 程式時，JVM 會自動去尋找名為 main 的方法並執行它。

在 main 方法中，你可以撰寫程式的邏輯，包括宣告變數、執行方法等等。
初學者可以將 main 想像成一個啟動程式的開關，讓你的程式開始運行。
在 main 中撰寫的程式碼會依序執行，直到程式結束為止。
因此，瞭解如何使用 main 方法非常重要，是學習 Java 程式設計的第一步。
```
```java
package com.mypackage;

public class TestClass {
   
    //最後把 main 加上去，這就是可運作程式最基礎的樣子
    public staitc void main(String[] args) {
    }
}
```
### 1-3, 執行第一個程式, Hello World
* 解釋字面常量(literal constant)
* 若不使用變數，有大量的字面常量要修改時，就會產生困擾，此時使用變數會更好。
```java
package com.mypackage;

public class TestClass {
    public staitc void main(String[] args) {
        //然後試著加上第一個程式
        System.out.println("Hello World");
    }   
}
```
### 1-4, 說明變數使用, 如何宣告形態
* 何謂變數 https://openhome.cc/zh-tw/java/syntax-abc/variable/
  * 宣告變數：國中數學有教過 a = 1, b = 2 這樣的概念
  * 如何宣告變數: 類別/形態 名稱 = 值;
  ```java
    String text = "123";
    int i = 123;
  ``` 
  * 若變數重複宣告會如何？
  ```java
    String text = "123";
    text = "456"; //ok
    String text = "789"; //error
  ``` 
  
```
同樣的變數名稱，不可以帶著形態重複宣告，會產生錯誤。

我們可以先這樣簡單理解重複宣告這件事情。
當使用者創建一個變數後（不管有沒有賦值），這個變數就會開一個記憶體位置。

而變數的名字，就是用來快速找到存儲在記憶體中的變數內容的關鍵。
當您重新賦值變數時，您實際上是通過這個名字找到該內容並修改它，
而不是創建一個新的變數。

但如果試圖重新聲明一個已經存在的變數，編譯器會報錯，
這是因為變數名稱是用來標識存儲在記憶體中的特定位置的唯一識別。
如果您試圖使用相同的名稱創建一個新的變數，
程式就無法判斷這個名稱應該指向哪個記憶體位置，因此就會報錯。
```
* [primitive type](https://openhome.cc/zh-tw/java/syntax-abc/type/) - 基本形態有八種
* [參考頁面](http://kaiching.org/pydoing/java-guide/unit-03-primitive-data-type-and-reference.html) - 數值形態的變數，其值會有上下限。
* 數字類型的變數預設類型
    * 數字類預設是 int, 即使將形態指定為 long, 必須手動轉型
    ```java
    long num = 100; // 這裡的 100 是 int，需要轉換為 long
    long num2 = (long) 100;
    long num3 = 100L;       // 推薦的寫法
    // num2, num3 這兩種寫法都可以將整數常量轉為 long 型別，但實際上有些差異。
    // num2 寫法將 int 型別的整數常量 100 強制轉換為 long 型別，
    // 因此編譯器在執行此行程式碼時會執行額外的轉換操作。
    // 而 num3 使用 long 型別的整數常量 100L，
    // 所以編譯器可以直接將其賦值給 long 型別的變數，不需要進行額外的轉換操作。
    // 因此 num3 寫法較佳，因為它更加清晰並且可以避免潛在的轉換錯誤。
    ```
    * 小數類預設是 double, 即使將形態指定為 float, 必須手動轉型
    ```java
    float a = 1.23f;  // 聲明 float 變量並初始化
    double b = 4.56;
    float c = (float) b;  // 手動將 double 轉換為 float
    ```
### 1-5, 運算子，比較，運算邏輯
* 加(+)減(-)乘(*)除(/)及餘數(%)的運用。
  小數點的除法要用含有小數點的數字，除起來才會正確。
```java
double d1 = 3/2; //若印出答案會顯示 1, 錯誤
double d2 = 3.0/2; //若印出答案會顯示 1.5, 正確
```
* 使用 double 的計算會有細微的異常，若在計算金額時請勿使用 double.
```java
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3) {
    System.out.println("等於 0.3");
} else {
    System.out.println("不等於 0.3"); //會印出這個答案
}
```
* 各種數值之間的比較方法
```java
int i = 0;
if (i == 0) {}    //i == 0 為 true
if (i != 0) {}    //i != 0 為 false
if (i < 0) {}     //i < 0 為 false
if (i <= 0) {}    //i <= 0 為 true
if (i > 0) {}     //i > 0 為 false
if (i >= 0) {}    //i >= 0 為 true 
```
* AND(&&) 及 OR(||) 的用法
* 遞增遞減運算 (++ - - 的運算)
```java
int i = 1;
System.out.println(i ++);    //印出 1, 本行結束之後 1 才會加上去
System.out.println(i --);    //印出 2, 上行結束後 i 為 2, 這行結束才會減 1

int j = 1;
System.out.println(++ j);    //印出 2, 執行後立即 j 變成 2
System.out.println(-- j);    //印出 1, 執行後 2 立即減去 1
```
  * [參考連結](https://xanxusvervr.blogspot.com/2016/04/java-i-i_52.html) : ++ i 與 i ++ 的差異
* 指定運算
```java
  int i = 1;
  i += 10;    //11 (等於 i = i + 10, 也就是 i = 1 + 10)
  i -= 10;    //1  (等於 i = i - 10, 也就是 i = 11 - 10)
  i *= 10;    //10 (等於 i = i * 10, 也就是 i = 1 * 10)
  i /= 10;    //1  (等於 i = i / 10, 也就是 i = 10 / 10)
```