---
# System prepended metadata

title: Hello World
tags: [Java]

---

[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
      }
   }
}
```