---
# System prepended metadata

title: Java學什麼?

---

# Java學什麼?
Java是如何執行呢？
撰寫 Java source code, 然後通過 javac 指令進行編譯, 將源碼編譯為 bytecode. 再來, 到了 runtime, 透過 JVM 內嵌的直譯器將 bytecode 轉換為最後的 machine code

## 變數 （..未完成
final關鍵字：
將變數定義為常數，類似const的用法
被定義的變數名稱應全數大寫

## 資料型態
![](https://i.imgur.com/U07kdqr.png)

### 基本資料型態 （Primitive type）：
一共八種

| 資料型態 | 位元數 (bit) |                       表示範圍                       | 預設值   |
| -------- |:------------:|:----------------------------------------------------:| -------- |
| Boolean  |      -       |                    true or false                     | false    |
| byte     |      8       |                       -128~127                       | 0        |
| short    |      16      |                   -32768 to +32767                   | 0        |
| int      |      32      |              -2147483648 to +2147483647              | 0        |
| long     |      64      |     -9223372036854775808 to +9223372036854775807     | 0L       |
| char     |      16      |             '/u0000'(0)~'/uffff'(65535)              | '/u0000' |
| float    |      32      |          -3.40292347E+38 to +3.40292347E+38          | 0F       |
| double   |      64      | -1.7976931348623157E+308 to +1.7976931348623157E+308 | 0D       |

#### 整數byte,short,int,long,char
整數的預設型態為int
所以當要表示long時要記得加上L，例如：
`long a = 1234L;`
整數的四種常見表現方式：
```
int a = 15;     //十進制
int b = 015;    //八進制
int c = 0x15;   //十六進制
int d = 0b1101; //二進制
```
##### char
在Java中一個英文字元或符號或中文字元或XX文字元都是一個char，而字元的本質其實就是數字，所以也有與整數型態相同的特性，可以做算術運算。
 
 若兩個字符遇到**算術運算子**，則強制轉型為int做算術運算。
 ```
 char b = '哈';
 char c = '囉';
 
 System.out.println(b + c);
 
 結果為 43921
 ```


> java.math底下有個類叫BigInteger用以實現任意精度整數運算，待日後使用到再補充說明
#### 浮點數float,double
浮點數的預設型態為double
故欲表示float時必須在後方加上F
浮點數的兩種常見表現方式：
```
float a = 3.14F;     //十進制
flaot a = 314E-2F;  //科學表示法
```

> java.math底下有個類叫BigDecimal用以實現任意精度浮點數運算，待日後使用到再補充說明
### 參考資料型態 （Reference type）：
以上『八種』以外的所有資料型態！
1. 自定義的類別 (class)
2. 陣列 (Array)
3. 介面 (interface)
4. 列舉 (enum)

> 討論兩種類型資料型態的差異，重點放在記憶體配置的不同。

#### 記憶體區間
在程式運行時期，記憶體區間可分為三個部分：
1. Global
    此區存放全域變數、靜態變數。

2. Stack
    此區存放已知生命週期的資料，如區域變數、方法參數（method parameter）、方法的回傳址（method return address）。

3. Heap
    此區存放不可被預測生命週期的資料，還有個重要的點是此區資料不會被主動回收，而記憶體過載稱呼為OutOfMemoryError，一般來說程式設計師需要自行管理此區的記憶體，但是Java有設計了一套記憶體被動回收的機制『Garbage Collection 垃圾回收』，會幫忙檢查哪一個資料不再被使用，並釋放該資料佔用的記憶體空間。
    
基本型別的宣告與給值：
```
int age;    //在stack memory上切出int空間給age變數，由於還沒給值，age會依據int規則預設為0值
age = 18;   //將18這個值指定給age
```

參考型別的宣告與給值：（先假設有個類別叫Human）
```
Human Wilson;            //在stack memory上切出一個參考大小的空間給Wilson變數，並指向物件Human，由於還沒定義物件Human，Wilson會預設為null值
Wilson = new Human();    //透過關鍵字new建構物件Human在heap memory上，再把物件Human的記憶體位址指定給在stack上的Wilson變數
```
> 具體來說參考大小的記憶體空間是多少我還不清楚，待日後查證再更新！

### 運算子
執行運算的優先度列表（由高至低排序）
![](https://i.imgur.com/a8LXV3P.png)
（表格取自[Java document](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)）







> Java命名規範？參考這篇
> https://matthung0807.blogspot.com/2019/05/java-naming-convention.html

> 編譯語言＆直譯語言？參考這篇
> https://totoroliu.medium.com/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80-vs-%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80-5f34e6bae051

> JVM,JRE,JDK是什麼關係？ 參考這篇
https://iter01.com/574266.html

---
# 撞球模型
## 直線運動
```java=
//匯入 java ?
import java.awt.*;        
import javax.swing.*;

public class BallGame extends JFrame {
    //加載圖片，撞球檯、籃球
    Image board = Toolkit.getDefaultToolkit().getImage("img/board.png");
    Image ball = Toolkit.getDefaultToolkit().getImage("img/ball.png");
    //設定籃球的x,y座標以及方向判定
    double x = 100;
    double y = 100; 
    boolean right = true;
    //建立繪圖方法
    public void paint(Graphics g){
        //加入console.log，方便觀察此function有無運行
        System.out.println("窗口被畫了一次！");
        
        //先繪製撞球檯再畫籃球，才不會讓籃球被球檯覆蓋
        //這邊先做強制轉型，將變數x,y指定為int
        g.drawImage(board,0,0,null);
        g.drawImage(ball,(int) x,(int) y,null);

        //加入籃球位移的條件，以 right 來表示x的方向
        if(right){
            x = x + 10;
        }else {
            x = x - 10;
        };
        //加入x座標的位移限制（讓籃球的位移僅在撞球檯之間）
        if(x > 762){
            right = false;
        }else if(x < 32) {
            right = true;
        }
    }
    
    //視窗加載
    void launchFrame(){
        //指定視窗預設大小
        setSize(860,500);
        //指定視窗顯示位置
        setLocation(330,250);
        //指定視窗可見度
        setVisible(true);

        //以迴圈來實現圖片的持續變化
        while(true){
            //用repaint來重複調用上述的paint功能
            repaint();
            try{
                //設定休眠時間，單位為毫秒（1/1000秒）
                //故以此表示一秒鐘重繪40次
                Thread.sleep(25);
            }catch (Exception e){
                e.printStackTrace();
            }


        }

    }
    public static void main(String[] args){
        System.out.println("");
        BallGame game = new BallGame();
        game.launchFrame();

    }
}

```
## 加上角度變化

```java=

/*import java.awt.*;
import javax.swing.*;

public class BallGame2 extends JFrame {
    
    Image board = Toolkit.getDefaultToolkit().getImage("img/board.png");
    Image ball = Toolkit.getDefaultToolkit().getImage("img/ball.png");
    
    double x = 100;
    double y = 100; */

    //新增角度變數
    double degree = 3.14/3;
    
    /*
    //建立繪圖方法
    public void paint(Graphics g){
        //加入console.log，方便觀察此function有無運行
        System.out.println("窗口被畫了一次！");

        //先繪製撞球檯再畫籃球，才不會讓籃球被球檯覆蓋
        //這邊先做強制轉型，將變數x,y指定為int
        g.drawImage(board,0,0,null);
        g.drawImage(ball,(int) x,(int) y,null); */

        //新增角度變化的位移量
        x = x + 10*Math.cos(degree);
        y = y + 10*Math.sin(degree);

        //設定上下左右的界線，超過將折返
        if(y > 410 || y < 80){
            degree = -degree;
        }

        if(x > 760 || x < 40){
            degree = 3.14 - degree;
        }

    }

    /*
    //視窗加載
    void launchFrame(){
        //指定視窗預設大小
        setSize(860,500);
        //指定視窗顯示位置
        setLocation(330,250);
        //指定視窗可見度
        setVisible(true);

        //以迴圈來實現圖片的持續變化
        while(true){
            //用repaint來重複調用上述的paint功能
            repaint();
            try{
                //設定休眠時間，單位為毫秒（1/1000秒）
                //故以此表示一秒鐘重繪40次
                Thread.sleep(25);
            }catch (Exception e){
                e.printStackTrace();
            }


        }

    }
    public static void main(String[] args){
        System.out.println("");
        BallGame2 game = new BallGame2();
        game.launchFrame();

    }*/
}
```

# 使用Scanner獲得鍵盤輸入的交互
```java=
import java.util.Scanner;

public class TestScanner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入名字");
        String name = scanner.nextLine();
        System.out.println("請輸入年齡");
        int age = scanner.nextInt();

        System.out.println("#################");
        System.out.println("哇！沒想到" + name + "你已經" + age + "歲了！");
    }
}

```
# 使用for實現數字累加
```java=
public class TestFor {
    public static void main(String[] args) {
        int sum = 0;
        for(int x = 1 ;x <= 100 ; x++){
            sum = sum + x;
        }
        System.out.println(sum);
    }
}

```
# if Else-if練習
使用Math.random()產生亂數

```java=
public class TestIfElse {
    public static void main(String[] args) {
        int age = (int)(100 * Math.random());

        if(age < 18){
            System.out.println("未成年禁止飲酒唷");
        }else if (age > 68) {
            System.out.println("你也快沒了，喝吧!多喝點!！");
        }else {
            System.out.println("喝酒可以，要有酒品！");
        }
    }
}
```
# 關於Overload,Override,Polymorphism
## 多載(Overload)

## 覆寫(Override)

## 多型(Polymorphism)

> 參考這篇
> https://matthung0807.blogspot.com/2018/02/java-overload.html

