# Java學什麼?
Java是如何執行呢?
撰寫 Java source code, 然後通過 javac 指令進行編譯, 將源碼編譯為 bytecode. 再來, 到了 runtime, 透過 JVM 內嵌的直譯器將 bytecode 轉換為最後的 machine code
## 變數 (..未完成
final關鍵字:
將變數定義為常數,類似const的用法
被定義的變數名稱應全數大寫
## 資料型態

### 基本資料型態 (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變數
```
> 具體來說參考大小的記憶體空間是多少我還不清楚,待日後查證再更新!
### 運算子
執行運算的優先度列表(由高至低排序)

(表格取自[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