Java 自學筆記 01 - Basics

JVM, JRE & JDK

JVM, JRE & JDK

Java vs C

當開發 C 或 C++ 程式時,通常會先將原始碼透過編譯器轉換成目標機器可以理解的 Object Code。這個 Object Code 是特定於目標機器架構的,因此在不同的硬體平台上可能會產生不同的機器碼。因此,當將程式移植到不同的機器或架構時,通常需要重新編譯原始碼以生成適用於該特定平台的新 Object Code。

JVM (Java Virtual Machine)

Java 通過 JVM 來解決跨平台的問題,程式在編譯時是先翻譯成 JVM 的 Byte code,執行時才由 JVM 轉換為機器碼,由於不是直接編譯成機械碼,這表示只要新的平台有安裝 JVM,就不用重新編譯一遍了。
某方面來說 JVM 算是一種 interpreter,負責執行 Byte code。
JVM

JRE (Java Runtime Environment)

JRE 包含了執行 Java 程式所需的所有檔案和庫,包括 JVM、Class Libraries、Java API 等,也就是說單單是執行而不需要開發的話安裝 JRE 就夠了。

JDK (Java Development Kit)

JDK 是一個完整的 Java 開發套件,包括了 JRE、編譯器 (javac) 以及開發所需要的各種工具和庫。

Hello Java

  • Hello.java
1
2
3
4
5
6
7
public class Hello //Class 的名稱要跟檔名一模一樣
{
public static void main(String[] args)
{
System.out.println("Hello Java");
}
}
  • compile
1
$ javac Hello.java
  • run
1
$ java Hello

Data Type

Java Data Type

資料型態轉換

  • 浮點數大於整數
    double > float > long > int > short > byte
  • 小轉大OK,大轉小error
    Java Casting
  • 大轉小可以強制轉換,但可能失真
1
2
int n1 = 1024;
byte n2 = (byte)n1; // 不一樣 (2進位高位被截斷)
  • 字串轉數字
1
2
int n1 = Integer.parseInt("1234")
long n2 = Long.parseLong("1234")
  • 數字轉字串
1
2
String s1 = String.valueOf(1234);
String s2 = String.valueOf(1.234);

標準輸入

1
2
3
4
5
import java.util.Scanner;
Scanner s = new Scanner(System.in);

int x = s.nextInt();
String text = s.next();

Array

Java 的陣列跟 C 不一樣,不是以連續的記憶體表達陣列,而是以一種 object 的形式實作,因此多維的陣列係由前一層指向後一層,所以不同層的 Array 長度可以不一樣 !!!

Java Array

Array 的宣告與初始化方法。

1
2
3
int[][] x = new int[2][2];
x = {{1,2},{3,4}};
x.length // x的長度

Class and Object

  • Object 產生時一定要呼叫的方法,稱為 Constructor (建構子)
  • Objec 消滅需要呼叫的方法,稱為 Destructor (解構子)
  • 表達 Object 內部狀態的變數,稱為 Object Variable (物件變數成員)
  • Object 可以接收的訊息,稱為 Object Method (物件方法成員)
  • 上述兩個可總稱為 Object Member
  • 屬於 Class 的變數,稱為Class Variable (類別變數)
  • 屬於 Class 的方法,稱為 Class Method (類別方法)
  • 上述兩個可總稱為 Class Member
  • 和其他 Class 間的繼承關係
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Vehicle {
private int speed; // Object Variable
private String direction; // Object Variable, direction is a reference to String Object
private static int numVehicle = 0; // Class Variable
public Vehicle() { // Constructor, called when new a Object
this(0,"north"); // call another constructor to do initialization
}
public Vehicle(int s, String dir) { // Another Constructor. Use overloading to define two constructors
float speed; // define a local variable
speed = s; // the speed here refers to the above local variable
this.speed = s; // If we want to set object variable, use this.speed to refer object variable speed
direction = dir; // dir is a reference to object, not the object itself
numVehicle++; // increase the Vehicle number
}
protected void finalize() { // Destructor, called when the object is garbage collected by JVM
System.out.println("finalize has been called");
numVehicle--;
}
void setSpeed(int newSpeed) { // Object Method
this.speed = newSpeed;
}
void setDir(String dir) { // Object Method
this.direction = dir;
}
int getSpeed() { // Object Method
return speed;
}
String getDir() { // Object Method
return direction;
}
public static int totalVehicle() { // Class Method
return numVehicle;
}
}

參考資料

https://www.geeksforgeeks.org/differences-jdk-jre-jvm/
https://programming.im.ncnu.edu.tw/J_index.html