# 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