[toc]
# Hello World
**我們這裡先不討論外層的class, 先專注於Main Class中的內容**
建立一個.java檔, 當做主要的(入口)。
我這裡檔名想取成Main.java
所以寫一個Main class
```java!
public class Main {
}
```
---
### 入口方法
`public` (之後會講)
`static` (之後會講)
`void` (無回傳值) (之後會講)
`main(String[] args)`
有一個字串陣列參數 代表command line args。
```java=
public class Main {
public static void main(String[] args) {
System.out.print("hello, world"); // 輸出字串"hello, world"
}
}
```
(如果說, 你是直接執行一個.class, 裡面應該只會寫一個入口方法。
如果你是一個jar, 裡面可能有多個入口方法, jar內部會有一個/META-INF/MANIFEST.MF file, 裡面有寫Main class究竟是哪一個。)
---
## 簡單字串介紹
字串是個類別, 不是基本類別
### String Pool
字串系統有字串池在維護
你永遠不知道你兩個內容一樣的字串時不是同個物件
使用`==`比較物件是沒意義的。
### Representation
字串物件除了用變數, 也可以用`" "`表示。
所以你今天在路上, 不管看到
`String s = ...;` 或是 `"abcdef"`
`s` 跟 `"abcdef"` 都是物件。
### 建立字串
`String s = "123"` (可能會去字串池找也是"123"的字串物件)
`String s2 = new String("456")` (強迫建立新字串物件, 沒必要)
### 字串相加
如果是字串+字串
ex.
`"abc" + "def"`
會組成 `"abcdef"`
如果是字串+基本類別
ex.
`"abc" + 1` -> `"abc1"`
`"abc" + 1 + 1` -> `abc11"`
`"abc" + (1 + 1)` -> `"abc2"`
如果是String+物件, 物件會被調用toString()方法
物件預設的toString方法回傳classpath@hashcode
像是`new Object().toString()`
可能會是`"java.lang.Object@1b6d3586"`字串
ex.
`"abc" + new Object()`
-> `"abc" + new Object().toString()`
-> `"abc" + "java.lang.Object@1b6d3586"`
# Compile/Execute
假設檔名叫做Main.java
**編譯**成Main.class (bytecode):
```shell=
javac Main.java
```
**執行**在Main.class裡面的入口函式:
```shell=
java Main
```
**執行**xxx.jar:
```shell=
java -jar xxx.jar
```
# Command Line Arguments
假設你執行Java程式時, 後面有附帶參數
```shell=
java Main a b c
```
或是
```shell=
java -jar xxx.jar a b c
```
會在入口方法的`String[]`參數中。
```java=
public class Main {
public static void main(String[] args) {
for(String s : args) {
System.out.println(s); // a b c
}
}
}
```