โหมดมืด
บทที่ 1 — ติดตั้ง + เขียน Hello World แบบเข้าใจทุกบรรทัด
บทนี้เราจะ:
- ติดตั้ง JDK (Java Development Kit)
- ติดตั้ง IntelliJ IDEA (IDE ที่จะใช้เขียน Java)
- เขียนโปรแกรม Java แรก — Hello World
- อธิบายทุกคำในโปรแกรม ว่าทำไมต้องเขียนแบบนี้
- ทดลอง compile + run ทั้งผ่าน IDE และผ่าน command line (เพื่อเข้าใจสิ่งที่อยู่ใต้)
ใช้เวลาประมาณ 60-90 นาที — รวมติดตั้ง
💡 ถ้าติดตั้งติดขัด: ถ้าเกิน 1 ชม. ยังลงไม่ได้ — หยุดก่อน อย่าทุบหน้าจอ ลองดู section "ถ้าเจอปัญหา" ในหัวข้อ 1.3 ข้างล่าง หรือถามใน community Java ไทย (Facebook group, Discord) — มือใหม่ติดตรงนี้กันเยอะ ไม่ใช่คุณคนเดียว
1. ติดตั้ง JDK 25
1.1 ตรวจก่อนว่ามีอยู่แล้วหรือยัง
เปิด PowerShell (กด Win + R พิมพ์ powershell แล้ว Enter — หรือบน Windows 11 คลิกขวาที่ปุ่ม Start → Terminal) หรือ Terminal บน Mac/Linux
📖 PowerShell / Terminal คืออะไร: หน้าต่างสีดำ ๆ (หรือพื้นน้ำเงิน) ที่พิมพ์คำสั่งให้คอมทำงานแทนการคลิก — มาในตัวทุกเครื่อง (Windows = PowerShell, Mac = Terminal, Linux = Terminal). ใน Mac เปิดได้จาก Spotlight (Cmd+Space) → พิมพ์ "Terminal"
พิมพ์ (ใช้ได้ทั้ง PowerShell และ Terminal):
sh
java --versionถ้าเห็น:
text
openjdk 25 2025-09-16แปลว่ามี Java 25 แล้ว → ข้ามไปข้อ 1.3
📝 หมายเหตุ: เลขเวอร์ชันย่อย/วันที่อาจต่างกันได้ (เช่น
openjdk 25.0.1 2025-10-21) — ขอแค่ขึ้นต้นด้วย25ก็ใช้ได้ และปกติจะมีบรรทัดรายละเอียดตามมาอีก 2 บรรทัด
ถ้าเห็นเลขเก่า (เช่น 8, 11, 17) → ติดตั้ง Java 25 ทับ ถ้าเห็น 'java' is not recognized → ยังไม่มี ติดตั้งกันเลย
1.2 ติดตั้ง JDK
เลือกตาม OS ของคุณ:
Windows
วิธีที่ 1: ผ่าน winget (แนะนำ)
📖 winget คืออะไร: เครื่องมือติดตั้งโปรแกรมในตัวของ Windows 10/11 — เหมือน App Store แต่ใช้ผ่าน command line (ถ้าพิมพ์แล้วเจอ
winget not recognizedแปลว่าเครื่องเก่า ใช้วิธีที่ 3 ดาวน์โหลด installer ตรงได้)
powershell
winget install EclipseAdoptium.Temurin.25.JDK📝 ถ้าเจอ
No package found matching input: package id ของเวอร์ชันใหม่บางทีขึ้นทะเบียนช้ากว่าตัว JDK เอง — ลองรันwinget search Temurinเพื่อดู id ที่มีอยู่จริงตอนนี้ หรือข้ามไปวิธีที่ 3 (ดาวน์โหลด installer ตรง ๆ)
📖 Chocolatey คืออะไร: เครื่องมือติดตั้งโปรแกรมของ Windows คล้าย winget แต่เป็น third-party (ต้องลง chocolatey ก่อนถึงใช้
chocoได้) — ถ้าไม่มี ข้ามไปวิธีที่ 3
วิธีที่ 2: ผ่าน Chocolatey
powershell
choco install temurin25วิธีที่ 3: ดาวน์โหลด installer ตรง ๆ ไปที่ https://adoptium.net → คลิก "Other platforms and versions" → เลือก Version 25 → Windows → x64 → MSI installer → ติดตั้งตามปกติ
📝 หมายเหตุ: ปุ่ม "Latest LTS" บนหน้าแรก Adoptium อาจแสดง Temurin 21 (ซึ่งยังเป็น active LTS อยู่) แทนที่จะเป็น 25 — Java 25 เป็น LTS แต่ปุ่มหน้าแรกอาจยังไม่อัพเดต ให้คลิก "Other platforms and versions" แล้วเลือก Version 25 ด้วยตัวเอง
macOS / Linux (SDKMAN)
ผ่าน Homebrew (แนะนำสำหรับ macOS):
bash
brew install --cask temurin@25ผ่าน SDKMAN (ดีถ้าจะใช้หลาย version):
bash
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# ดู identifier ที่มีอยู่ก่อน แล้วเลือก Temurin 25 (tag ที่มี "tem")
sdk list java | grep "25.*tem"
# จะเห็นบรรทัดแบบนี้ (เลขย่อยอาจต่างกัน):
# 25.0.1-tem
# คัดลอก identifier ที่เห็นมาใส่คำสั่งนี้:
sdk install java 25.0.1-tem📝 หมายเหตุ: เลขย่อย (เช่น
25.0.1) อาจต่างกันตาม version ที่ SDKMAN มีอยู่ขณะนั้น — ให้รันsdk list java | grep temก่อนเสมอเพื่อหา identifier ที่ถูกต้อง
Linux (Ubuntu/Debian)
bash
sudo apt update
sudo apt install -y wget apt-transport-https
sudo mkdir -p /etc/apt/keyrings
wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update
sudo apt install -y temurin-25-jdk💡 ทำไมเลือก Temurin (Eclipse Adoptium)? Java มีหลาย "distribution" ที่ build จาก source เดียวกัน — Temurin คือตัวที่ Eclipse Foundation build ฟรี, ใช้ใน production ได้ และเป็น community standard ที่ TCK-certified
เรื่อง Oracle JDK: Oracle JDK เวอร์ชันเก่า (ก่อน Java 17) มีปัญหา license สำหรับ commercial use แต่ตั้งแต่ Java 17 เป็น NFTC (No-Fee Terms and Conditions) = ฟรีสำหรับ dev/production แล้ว — เราเลือก Temurin เพราะเป็น community standard ไม่ขึ้นกับ Oracle ไม่ใช่เพราะเรื่อง license อย่างเดียว
1.3 ตรวจสอบหลังติดตั้ง
ปิด terminal เก่า เปิดใหม่ (สำคัญ — terminal ที่เปิดอยู่ยังจำค่า PATH เก่าอยู่ การปิดแล้วเปิดใหม่บังคับให้รับค่า PATH ที่อัปเดตแล้ว)
bash
java --version
javac --versionต้องเห็น:
text
openjdk 25 2025-09-16
javac 25📖 ศัพท์ที่ต้องรู้ก่อน:
- environment variable = ค่าตัวแปรของระบบปฏิบัติการ (Windows/Mac/Linux) ที่โปรแกรมต่าง ๆ ใช้ดูว่า "เครื่องมือ" อยู่ที่ไหน — เหมือนสมุดที่อยู่ที่ใคร ๆ เปิดดูได้
- JAVA_HOME = ตัวแปรที่บอกว่า JDK ถูกติดตั้งโฟลเดอร์ไหน (เช่น
C:\Program Files\Eclipse Adoptium\jdk-25)- PATH = รายการโฟลเดอร์ที่ระบบจะค้นหาคำสั่งให้อัตโนมัติเวลาเราพิมพ์คำสั่งใน terminal (ถ้า
java.exeอยู่ในโฟลเดอร์ที่อยู่ใน PATH → เราพิมพ์แค่javaก็พอ)- PowerShell Admin = PowerShell ที่เปิดด้วยสิทธิ์ผู้ดูแลระบบ (เปิด: คลิกขวาที่ปุ่ม Start → "Terminal (Admin)" หรือ "Windows PowerShell (Admin)")
ถ้าเจอปัญหา:
javaใช้ได้แต่javacใช้ไม่ได้ → คุณติดตั้ง JRE ไม่ใช่ JDK → ลงใหม่ให้แน่ใจว่าเป็น JDK- ทั้งคู่ใช้ไม่ได้ → environment variable ไม่ถูก → ตั้ง
JAVA_HOMEและเพิ่ม%JAVA_HOME%\bin(Win) หรือ$JAVA_HOME/bin(Mac/Linux) เข้า PATH
Set JAVA_HOME (Windows)
💡 หมายเหตุ: ถ้าติดตั้งด้วย
wingetหรือ MSI installer แล้วjava --versionใช้ได้ปกติ ปกติไม่ต้องตั้งJAVA_HOMEเอง — ทำส่วนนี้เฉพาะเมื่อเจอปัญหาjavacหรือ IDE หา JDK ไม่เจอ
📖
setxคืออะไร: คำสั่ง Windows สำหรับตั้ง environment variable แบบถาวร (อยู่รอด restart) — มือใหม่หลายคนเจอใน Stack Overflow (เว็บถาม-ตอบเขียนโค้ดที่โปรแกรมเมอร์ใช้บ่อย) แล้วก็อปมาใช้ แต่มันมี กับดักใหญ่:⚠️ อย่าใช้
setx PATH "$env:PATH;..."ตรง ๆ — อาจทำให้ PATH ของเครื่องเสียหาย ของเดิมหาย กู้คืนยาก ใช้วิธีข้างล่างแทน
📚 อยากรู้ลึกว่าทำไม setx อันตราย (กดเพื่อดู)
setxมี limit ที่ 1024 ตัวอักษร — PATH ของหลายเครื่องยาวกว่านี้$env:PATHใน PowerShell คือ process PATH (รวม user + system) ถ้า paste ตรง ๆ ผ่านsetx PATHจะเขียนทับ user PATH ของเดิม ทำให้ entry ที่เคยมีหาย- วิธีที่ปลอดภัยคือใช้ .NET API อ่าน user PATH ปัจจุบัน → ต่อ entry ใหม่ → เขียนกลับ (read-modify-write)
วิธีที่ปลอดภัย (PowerShell Admin) — แก้เฉพาะ user scope ผ่าน .NET API ที่ read-modify-write ตัว user PATH โดยตรง:
powershell
# 1) หา path JDK จริงก่อน (อย่าก๊อปเลขเวอร์ชันจากตัวอย่าง — เลขอาจต่างกัน)
Get-ChildItem 'C:\Program Files\Eclipse Adoptium\'
# 2) ตั้ง JAVA_HOME (ใช้ path ที่หาได้จากข้อ 1 — เลข version อาจต่างกัน)
[Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Eclipse Adoptium\jdk-25.0.1.9-hotspot', 'User')
# 3) อัพเดต $env:JAVA_HOME ใน session ปัจจุบันด้วย (SetEnvironmentVariable เขียนแค่ registry ไม่อัพ session ทันที)
$env:JAVA_HOME = 'C:\Program Files\Eclipse Adoptium\jdk-25.0.1.9-hotspot'
# 4) เติม bin ของ JDK เข้า user PATH (ไม่ทับของเดิม)
# อ่าน PATH ปัจจุบันของ user (เฉพาะ user scope ไม่รวม system)
$old = [Environment]::GetEnvironmentVariable('Path', 'User')
# ใช้ path จริง (ขยาย %JAVA_HOME% ออกมาเลย) เพราะ SetEnvironmentVariable เก็บแบบ plain text
$jdkBin = "$env:JAVA_HOME\bin"
# ถ้า PATH ยังไม่มี path นี้อยู่ → เพิ่มเข้าไป
if ($old -notlike "*$jdkBin*") {
[Environment]::SetEnvironmentVariable('Path', "$old;$jdkBin", 'User')
}
# 5) ปิด-เปิด terminal ใหม่ แล้ว verify
java --version
javac --versionทางเลือก GUI ถ้าไม่อยากแตะ PowerShell: Win+R → sysdm.cpl → Advanced → Environment Variables → แก้ที่ "User variables" ส่วน Path (เพิ่ม entry ที่เป็น path จริงของ bin เช่น C:\Program Files\Eclipse Adoptium\jdk-25.0.1.9-hotspot\bin)
⚠️ ระวัง: กดปุ่ม New เพื่อเพิ่มบรรทัดใหม่เข้าไปในลิสต์ Path เท่านั้น — อย่าพิมพ์ทับ ลงในช่องข้อความเดิมที่มี entry อื่นอยู่แล้ว เพราะจะลบ path เก่าที่เคยตั้งไว้ทั้งหมดโดยไม่รู้ตัว (เหมือนกับดักของ
setxที่เตือนไปข้างบน)
📝 หมายเหตุ:
java -version(ขีดเดียว) และjava --version(สองขีด) ใช้ได้ทั้งคู่ — ผลต่างกันแค่รูปแบบ output เล็กน้อย หนังสือนี้ใช้--versionให้สม่ำเสมอ
Set JAVA_HOME (Mac/Linux)
เพิ่มในไฟล์ ~/.zshrc หรือ ~/.bashrc:
bash
export JAVA_HOME=$(/usr/libexec/java_home -v 25) # macOS
# หรือ
export JAVA_HOME=/usr/lib/jvm/temurin-25-jdk-amd64 # Linux
export PATH=$JAVA_HOME/bin:$PATHแล้ว source ~/.zshrc หรือเปิด terminal ใหม่
2. ติดตั้ง IntelliJ IDEA
IDE (Integrated Development Environment) = โปรแกรมที่ใช้เขียนโค้ด มีเครื่องมือครบในตัว:
- autocomplete — เติมโค้ดอัตโนมัติขณะพิมพ์
- debugger — หยุดโปรแกรมที่บรรทัดที่ต้องการเพื่อดูค่าตัวแปรทีละขั้น
- refactoring — ปรับโครงสร้างโค้ดโดยไม่เปลี่ยนผลลัพธ์ (เช่น เปลี่ยนชื่อตัวแปรทั้งโปรเจกต์พร้อมกัน)
ทำไมต้อง IntelliJ ไม่ใช้ VS Code:
- IntelliJ เป็น "ตัวจริง" สำหรับ Java — feature ทุกอย่างถูก optimize สำหรับ Java
- Refactoring ฉลาดสุดในตลาด
- Plugin Spring Boot, database, Git ครบในตัว
- มี Community Edition ฟรี ที่พอใช้สำหรับเรา
ไปที่ https://www.jetbrains.com/idea/download → เลือก Community Edition (ฟรี) — ไม่ต้องใช้ Ultimate (เสียเงิน) สำหรับบทนี้
ติดตั้งตามปกติ → เปิดโปรแกรม
💡 ทางเลือก: ถ้าชอบ VS Code มากกว่า, ลง extension "Extension Pack for Java" ก็ทำได้ — แต่หนังสือนี้จะใช้ IntelliJ เป็นหลัก
3. สร้าง project แรก
เปิด IntelliJ IDEA → New Project
ตั้งค่า:
| ช่อง | ใส่อะไร |
|---|---|
| Name | HelloWorld |
| Location | เลือกโฟลเดอร์ที่อยากเก็บ project เช่น C:\Users\jirap\java-projects\ |
| Language | Java |
| Build system | IntelliJ (ง่ายที่สุดสำหรับ project แรก) |
| JDK | เลือก temurin-25 ที่เพิ่ง install (ถ้าไม่เจอ คลิก "Add JDK" → ชี้ไปที่ folder JDK) |
| Add sample code | ✅ ติ๊กไว้ (เดี๋ยวอ่านเทียบ) |
📖 Build system คืออะไร: โปรแกรมที่จัดการการ compile และสร้างไฟล์ executable ให้อัตโนมัติ — พูดง่าย ๆ คือตัวที่เรียก
javacให้เราแทนที่จะพิมพ์เองทุกครั้ง แถมยังจัดการ dependency (ไลบรารีที่โปรเจกต์ต้องใช้) ให้ด้วย — เลือก IntelliJ ก่อนสำหรับ project เล็ก ๆ เดี๋ยวบทที่ 14 จะสอน Maven/Gradle ที่ใช้จริงในงาน
กด Create
IntelliJ จะสร้าง project + เปิดไฟล์ Main.java
📝 หมายเหตุ: โค้ดที่ IntelliJ สร้างให้อาจหน้าตาไม่เหมือนด้านล่างเป๊ะ (แต่ละ version ของ IntelliJ อาจสร้างโค้ดตัวอย่างคนละแบบ) — ให้ลบทั้งหมดแล้วพิมพ์โค้ดข้างล่างนี้แทน:
java
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}ก่อนจะอธิบาย ลอง run ก่อนเพื่อให้เห็นผล
3.1 Run โปรแกรม
มี 3 วิธี เลือกอันที่ถนัด:
- คลิกลูกศรเขียวเล็ก ๆ (สามเหลี่ยมสีเขียว ▶) ที่ แถบซ้ายสุดของ editor (เรียกว่า gutter — แถบที่แสดงเลขบรรทัดและปุ่ม run) ตรงบรรทัดที่มี
public static void main— ถ้ายังไม่เห็นลูกศร ลองรอ IntelliJ index project ให้เสร็จก่อน (มี progress bar ล่างขวา) - กด Shift + F10 (Windows/Linux) หรือ Ctrl + R (Mac — หมายถึง ^ Control key ไม่ใช่ ⌘ Command) — คีย์ลัดนี้ใช้ run ซ้ำหลังจาก run ด้วยวิธีที่ 1 หรือ 3 ไปแล้วครั้งหนึ่ง (ครั้งแรกสุดให้ใช้วิธีที่ 1 หรือ 3)
- คลิกขวาที่ไฟล์ → Run 'Main.main()'
ด้านล่างจะมี panel ชื่อ Run ขึ้นมา แสดง:
text
Hello, World!
Process finished with exit code 0🎉 ถ้าได้แบบนี้ = ทำงานแล้ว!
📖 Exit code คืออะไร:
Process finished with exit code 0— ตัวเลขนี้คือสัญญาณที่โปรแกรมส่งให้ระบบปฏิบัติการตอนจบ
- 0 = โปรแกรมจบแบบปกติ ไม่มี error
- เลขอื่น ๆ (1, 2, -1 ฯลฯ) = มี error หรือโปรแกรม exit ผิดปกติ
4. มาดูทุกบรรทัดว่ามันแปลว่าอะไร
นี่คือโค้ดของเรา — เราจะวิเคราะห์ทีละชิ้นจริง ๆ:
java
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}4.1 บรรทัด 1: public class Main {
public
"ใครเรียกได้บ้าง" — public แปลว่า "ทุกคนเรียกได้"
ใน Java, ทุก class/method/field ต้องบอก access modifier (ตัวกำหนดว่าใครเรียกหรือเข้าถึงได้บ้าง) — Java มี 4 ระดับ:
public— ทุก class เข้าถึงได้private— เฉพาะใน class นี้protected— class นี้ + class ลูก (เดี๋ยวเรียนตอน inheritance)- (เว้นไว้) — package-private — เฉพาะ class ใน package เดียวกัน (package = หมวดหมู่ของ class — เดี๋ยวบทที่ 5 อธิบาย)
ตอนนี้ใส่ public ไปก่อน — เดี๋ยวบทที่ 5 จะอธิบายความสำคัญละเอียดอีกที
class
keyword บอกว่า "ฉันจะประกาศ class ใหม่"
ใน Java, ทุกอย่างต้องอยู่ใน class — แม้แต่ "Hello World" — เป็นกฎที่ตามมาตั้งแต่ Java เป็น OOP-only
(ตั้งแต่ Java 25 มี feature ที่ไม่ต้องเขียน class — ชื่อปัจจุบันคือ "Compact Source Files & Instance Main Methods" — แต่ในหนังสือนี้เราจะเขียนแบบเต็มก่อนเพื่อให้เข้าใจโครงสร้าง class — ไม่ต้องกดลิงก์อ่านตอนนี้ เดี๋ยวบทที่ 10 จะกลับมาสอนละเอียดอีกที)
Main
ชื่อ class — เราตั้งเองอะไรก็ได้ตามกติกา:
กฎตั้งชื่อ class:
- ขึ้นต้นด้วยตัวอักษร,
$, หรือ_(อย่าใช้ตัวเลขขึ้นต้น) - ใช้ตัวอักษร, ตัวเลข,
_,$ได้ในตำแหน่งอื่น - convention: ใช้ PascalCase (ขึ้นต้นด้วยตัวใหญ่, คำใหม่ใช้ตัวใหญ่) — เช่น
Main,HelloWorld,BankAccount - ห้ามใช้ reserved keyword เช่น
class,int,void
กฎสำคัญ: ชื่อ class ต้อง ตรงกับชื่อไฟล์ ถ้า class นั้นเป็น public
- class
Main→ ไฟล์ต้องชื่อMain.java - class
HelloWorld→ ไฟล์ต้องชื่อHelloWorld.java
ถ้าไม่ตรง → compile error
{
เปิด block — บอกว่า "ทุกอย่างจาก { ถึง } คือเนื้อหาของ class นี้"
Java ใช้ { } เหมือนภาษา C, C++, JavaScript — ต่างจาก Python ที่ใช้ indentation
4.2 บรรทัด 2: public static void main(String[] args) {
นี่คือ entry point — จุดเริ่มต้นที่ JVM จะหา
วิเคราะห์ทีละคำ:
public
JVM ต้องเรียก method นี้จาก "ข้างนอก" — ต้องเข้าถึงได้ → public
ถ้าใส่ private แล้ว run → จะได้ error:
text
Main method not found in class Main, please define the main method as:
public static void main(String[] args)static
"ไม่ต้องสร้าง object ของ class นี้ก่อน ก็เรียกได้"
ปกติ method ใน class ต้องสร้าง object ก่อนแล้วเรียก:
java
Main m = new Main();
m.someMethod();แต่ main คือจุด เริ่มต้นโปรแกรม — JVM ยังไม่มี object ของ Main (ใครจะสร้างให้ในเมื่อเรายังไม่ได้ run?)
static แปลว่า "method นี้เป็นของ class ไม่ใช่ของ object" — JVM เรียกได้ทันที:
java
Main.main(args); // JVM ทำแบบนี้ (ตัวอย่างสมมติ — จริง ๆ JVM เป็นคนเรียก ไม่ใช่เรา)ถ้าลืม static → error:
text
Error: Main method is not static in class Main, please define the main method as:
public static void main(String[] args)เดี๋ยวบทที่ 5 (OOP) จะอธิบาย static vs non-static ละเอียดอีกที — ตอนนี้แค่จำว่า
mainต้อง static
void
return type — method นี้ "ไม่ return อะไรกลับมา"
main แค่ run โปรแกรม → จบ ไม่ต้องส่งค่าให้ใคร → void (ว่างเปล่า)
ถ้า method return ค่าจะใส่ type อื่น เช่น:
int main(...)— return จำนวนเต็ม (ไม่ใช่กฎของ Java — ภาษา C ใช้แบบนี้)String main(...)— return string
แต่ Java กำหนดว่า main ต้อง void
main
ชื่อ method — ต้องเป็น "main" พอดี เป๊ะ ๆ
ถ้าตั้งเป็น Main, MAIN, mainn → JVM จะไม่เจอ:
text
Error: Main method not found in class Main(String[] args)
นี่คือ parameter list — สิ่งที่ method รับเข้ามา
String[]
type — array ([]) ของ String (ข้อความ)
📖
arrayคืออะไร: กลุ่มของข้อมูลหลาย ๆ ตัวที่เก็บต่อกันเป็นลำดับ — คิดว่าเป็น "ลิสต์" ก็ได้ เช่นString[]= ลิสต์ของ String หลายตัว จะเรียนละเอียดบทต่อ ๆ ไป
นี่คือ "arguments ที่ส่งจาก command line"
เช่น run โปรแกรมแบบนี้:
bash
java Main hello world→ args จะเป็น ["hello", "world"]
args[0]= "hello"args[1]= "world"args.length= 2
ถ้า run โดยไม่ใส่อะไร:
bash
java Main→ args เป็น array ว่าง [], args.length = 0
args
ชื่อ parameter — ตั้งอะไรก็ได้ แต่ convention ใช้ args (ย่อจาก arguments)
{
เปิด block ของ method body
4.3 บรรทัด 3: System.out.println("Hello, World!");
นี่คือบรรทัดที่ "ทำงานจริง" ลอง break ดู:
System
class ที่มาพร้อม Java — อยู่ใน package java.lang (โหลดอัตโนมัติ ไม่ต้อง import)
System เก็บของที่ใช้กับ "ระบบ" เช่น:
System.out— stdout (standard output = ช่องส่งออกมาตรฐาน, ปกติคือจอภาพ)System.err— stderr (standard error = ช่องส่งข้อความ error มาตรฐาน, ปกติคือจอภาพ)System.in— stdin (standard input = ช่องรับเข้ามาตรฐาน, ปกติคือ keyboard)System.currentTimeMillis()— เวลาปัจจุบัน (ms ตั้งแต่ 1970)
.out
field ของ System — เป็น object ของ class PrintStream (class ของ Java ที่จัดการการพิมพ์ข้อความ — ยังไม่ต้องสนใจรายละเอียดตอนนี้) ที่ชี้ไปที่ stdout
อ่านได้ว่า: "เอา field out จาก System"
.println(...)
method ของ PrintStream — print + line break (\n) ตอนท้าย
method ที่ใกล้กัน:
print(x)— print เฉย ๆ ไม่ขึ้นบรรทัดใหม่println(x)— print + ขึ้นบรรทัดใหม่printf("format", args...)— print แบบมี format (เหมือน C)
"Hello, World!"
string literal — ค่าคงที่ของ string
ใน Java ใช้ double quote (") สำหรับ string เสมอ ส่วน single quote (') ใช้สำหรับ char (ตัวอักษรเดี่ยว):
"A"— String ที่มี 1 ตัวอักษร'A'— char ตัวอักษร 'A'
ต่างกันอย่างมีนัยสำคัญ! เดี๋ยวบทที่ 2 จะอธิบาย
;
ปิดประโยค (statement terminator)
ทุก statement ใน Java ต้องจบด้วย ; — เหมือน "." ในประโยคภาษาอังกฤษ
ลืมใส่ ; → compile error:
text
';' expected4.4 บรรทัด 4-5: } }
ปิด block — บรรทัดแรกปิด main method, บรรทัดที่สองปิด class
5. ทดลอง compile + run ผ่าน command line (สำคัญ — เพื่อเข้าใจ)
IDE ทำให้ทุกอย่างง่ายเกินไป — ลองดูว่าจริง ๆ "อยู่ใต้" มันคืออะไร
5.1 หา folder ที่มีไฟล์ .java
โดยปกติ IntelliJ จะเก็บไว้ที่:
text
<project-folder>/src/Main.javaเปิด terminal (ใน IntelliJ กด Alt + F12 หรือใช้ PowerShell ภายนอก) → cd ไปที่ folder นั้น:
📖 คำสั่ง terminal พื้นฐาน:
cd <folder>= change directory เปลี่ยนเข้าไปในโฟลเดอร์ (เช่นcd src)cd ..= ย้อนกลับขึ้นไปโฟลเดอร์แม่ls(Mac/Linux/PowerShell) หรือdir(Windows cmd) = ดูรายการไฟล์ในโฟลเดอร์ปัจจุบันpwd(Mac/Linux/PowerShell) = แสดงว่าเราอยู่ที่ไหนอยู่ตอนนี้
bash
cd <โฟลเดอร์ที่เลือกตอนสร้าง project>\HelloWorld\src
ls
# จะเห็น Main.java📝 แทนที่
<โฟลเดอร์ที่เลือก...>ด้วย path จริงของคุณ เช่นC:\Users\YourName\java-projects\HelloWorld\src(ดูได้จาก IntelliJ → คลิกขวาที่ไฟล์ → "Copy Absolute Path")
5.2 Compile ด้วย javac
bash
javac Main.javaดูว่าเกิดอะไรขึ้น:
bash
ls
# Main.java
# Main.class ← ใหม่!ไฟล์ .class คือ bytecode ที่ JVM อ่านได้
ลองเปิดดู (ระวัง — มันเป็น binary):
bash
# ดู structure (javap = เครื่องมือดู bytecode ของไฟล์ .class มาพร้อม JDK)
javap Main.classจะเห็น:
text
Compiled from "Main.java"
public class Main {
public Main();
public static void main(java.lang.String[]);
}นี่คือ "หน้าตา" ของ class ที่ JVM เห็น
5.3 Run ด้วย java
bash
java Main(สังเกต — ไม่มี .class หลังชื่อ เพราะ java รู้เอง)
ผลลัพธ์:
text
Hello, World!5.3.5 Run ตรงจากไฟล์ source โดยไม่ต้อง compile (Java 11+)
ตั้งแต่ Java 11 (JEP 330 — JEP = JDK Enhancement Proposal เลขข้อเสนอ feature ใหม่ของ Java) — สามารถ run ไฟล์ .java ตรง ๆ ได้เลย ไม่ต้อง javac ก่อน:
bash
java Main.java— JVM compile ในหน่วยความจำแล้ว run ทันที (ไม่สร้าง .class บน disk)
ดี:
- ใช้สำหรับ script สั้น ๆ — เช่น tool ที่เรียกครั้งเดียว
- ทดลอง snippet เร็ว ๆ
- เริ่มสอนได้โดยไม่ต้องอธิบาย compile-step
ข้อจำกัด:
- ใช้ได้ไฟล์เดียวเท่านั้น (ใน Java 11) — Java 22+ (JEP 458) รองรับ multi-file source-code program แล้ว
- ไม่มี artifact
.class→ ไม่เหมาะกับ production
💡 ในบทที่ 10 จะเจอ Compact Source Files + Instance Main (Java 25 — เป็นทางการแล้ว) ที่ทำให้ Hello World สั้นลงไปอีก
5.4 ส่ง argument
bash
java Main hello world friendผลลัพธ์: ยังเป็น "Hello, World!" เพราะโค้ดไม่ได้ใช้ args
ลองแก้โค้ด (ยังไม่ต้องเข้าใจ for-loop — ให้ copy block นี้ทั้งหมดแบบเป๊ะ ๆ แล้วดูผลเท่านั้น บทที่ 3 จะอธิบาย for-loop ละเอียด):
java
public class Main {
public static void main(String[] args) {
System.out.println("Number of arguments: " + args.length);
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "] = " + args[i]);
}
}
}compile + run ใหม่:
bash
javac Main.java
java Main hello world friendผลลัพธ์:
text
Number of arguments: 3
args[0] = hello
args[1] = world
args[2] = friend🎉 ตอนนี้ args ทำงานแล้ว!
6. โครงสร้างเต็ม ๆ ของไฟล์ Java (Anatomy — แยกดูทีละส่วน)
ตอนนี้ลองดูภาพรวม:
java
// (1) package declaration — บอกว่าไฟล์นี้อยู่ใน "หมวดหมู่" ไหน
// (เว้นไว้ก็ได้สำหรับ project เล็ก ๆ — เดี๋ยวบทที่ 5 จะอธิบาย)
// com.example = ตัวอย่างชื่อ package — โปรเจกต์จริงจะตั้งตามโดเมนของบริษัท (เช่น com.scb, com.kbank)
package com.example;
// (2) import — โหลด class จาก package อื่น
import java.util.List;
// (3) class declaration — เริ่ม class
public class Main {
// (4) field — ตัวแปรที่ class เก็บไว้ (ตอนนี้ยังไม่มี)
// (5) method — function (ฟังก์ชัน) ของ class
public static void main(String[] args) {
// body (เนื้อใน method)
System.out.println("Hello, World!");
}
// (6) method อื่น ๆ (ถ้ามี)
}ตอนนี้ Hello World ของเราไม่มี (1) (2) (4) (6) — มีแค่ (3) และ (5) — เพราะยังเล็กอยู่
7. ลองแก้โค้ดเล่น
🛠️ Checkpoint 1.1 — แก้ message
แก้โค้ดให้พิมพ์ชื่อตัวเอง:
java
System.out.println("Hello, ฉันชื่อ <ชื่อคุณ>!");run แล้วต้องเห็นชื่อตัวเอง
🛠️ Checkpoint 1.2 — พิมพ์หลายบรรทัด
ใช้ println หลาย ๆ ครั้ง พิมพ์:
text
ชื่อ: <ชื่อคุณ>
อาชีพ: นักเขียน Java มือใหม่
ปี 2026📖 เฉลย
java
public class Main {
public static void main(String[] args) {
System.out.println("ชื่อ: Jirap");
System.out.println("อาชีพ: นักเขียน Java มือใหม่");
System.out.println("ปี 2026");
}
}🛠️ Checkpoint 1.3 — รับชื่อจาก command line
แก้โค้ดให้รับชื่อจาก args[0] แล้วพิมพ์ "Hello, <ชื่อ>!"
ใบ้: ใช้ args[0] เพื่อเอาตัวแรก, ใช้ + เพื่อต่อ string
run:
bash
java Main Jirapต้องเห็น Hello, Jirap!
📖 เฉลย
⚠️ อ่านก่อน: โค้ดด้านล่างตั้งใจ ไม่มีการตรวจสอบ
args— ถ้า run โดยไม่ใส่ argument โปรแกรมจะ crash (Checkpoint 1.4 จะสอนวิธีป้องกัน)
java
public class Main {
public static void main(String[] args) {
System.out.println("Hello, " + args[0] + "!");
}
}📝 หมายเหตุ: โค้ดนี้ตั้งใจไม่มีการตรวจสอบ
argsก่อนใช้ เพื่อให้เห็นว่าเกิดอะไรขึ้นเมื่อไม่ป้องกัน — Checkpoint 1.4 ข้างล่างจะสอนวิธีเขียนให้ปลอดภัย
⚠️ Pitfall: ถ้า run โดยไม่ใส่ argument → args[0] จะ error เพราะ array ว่าง จะ throw ArrayIndexOutOfBoundsException — เดี๋ยวบทที่ 8 จะอธิบาย exception
ตอน run จะเห็นข้อความสีแดง ๆ ใน terminal ประมาณนี้:
text
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at Main.main(Main.java:3)ไม่ต้องตกใจ — อ่าน error message แบบนี้:
ArrayIndexOutOfBoundsException= ชื่อ error: "พยายามอ่าน array นอกขอบเขต"Index 0 out of bounds for length 0= รายละเอียด: ขอช่องที่ 0 แต่ array ว่างเปล่า (มี 0 ช่อง)at Main.main(Main.java:3)= ตำแหน่ง: เกิดที่บรรทัด 3 ของไฟล์ Main.java
Checkpoint 1.4 ข้างล่างจะสอนวิธีป้องกัน
🛠️ Checkpoint 1.4 (ท้าทาย) — ตรวจสอบก่อนใช้ args
แก้ checkpoint 1.3 ให้ปลอดภัย:
- ถ้ามี
args[0]→ พิมพ์Hello, <ชื่อ>! - ถ้าไม่มี → พิมพ์
Hello, stranger!
ใบ้: ใช้ if (args.length > 0) (จะเรียนละเอียดบทที่ 3)
📖 เฉลย
java
public class Main {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println("Hello, " + args[0] + "!");
} else {
System.out.println("Hello, stranger!");
}
}
}ทดสอบ:
bash
java Mainผลลัพธ์: Hello, stranger!
bash
java Main Jirapผลลัพธ์: Hello, Jirap!
8. Pitfall ที่มือใหม่เจอบ่อย
⚠️ Pitfall 1.1: ชื่อไฟล์ไม่ตรงกับชื่อ class
java
// ไฟล์ชื่อ HelloWorld.java
public class Main { // ❌ error: class Main is public, should be declared in file Main.javaแก้: ตั้งชื่อให้ตรงกัน
⚠️ Pitfall 1.2: ลืม ;
java
System.out.println("hi") // ❌ ';' expectedทุก statement ต้องจบด้วย ;
⚠️ Pitfall 1.3: ใช้ ' กับ string
java
System.out.println('Hello'); // ❌ unclosed character literalใช้ "..." สำหรับ string เสมอ — '..' คือ char ตัวเดียว
⚠️ Pitfall 1.4: case sensitive
Java แยกตัวพิมพ์ใหญ่/เล็ก:
String≠string(ตัวเล็กผิด)System≠systemMain≠main
⚠️ Pitfall 1.5: ลืม public static void
java
class Main {
void main(String[] args) { // ❌ ไม่ใช่ entry point
System.out.println("hi");
}
}compile ผ่าน แต่ run ไม่ได้ — JVM หา public static void main ไม่เจอ
9. สรุปสิ่งที่ได้จากบทนี้
✅ ติดตั้ง JDK 25 และตรวจสอบด้วย java --version, javac --version ✅ ติดตั้ง IntelliJ IDEA Community Edition ✅ สร้าง project + run Hello World ผ่าน IDE ✅ เข้าใจทุกคำในโปรแกรม Hello World:
public= ใครเรียกได้class= ประกาศ classstatic= ไม่ต้องสร้าง objectvoid= ไม่ return ค่าmain(String[] args)= entry point + รับ command-line argsSystem.out.println(...)= พิมพ์ stdout;= จบ statement ✅ Compile + run ผ่าน command line ด้วยjavac+java✅ ส่ง argument ผ่าน command line + อ่านผ่านargs
10. ก่อนไปบทต่อไป
ลอง run Java ทุก ๆ checkpoint ในบทนี้อย่างน้อย 1 รอบด้วยตัวเอง — อย่า copy-paste จากหน้าเว็บ — type เองทุกตัวอักษร
มือใหม่หลายคนพยายามอ่านอย่างเดียวแล้วข้ามไปบทต่อ — ห้ามทำแบบนั้น สมองคนเราจำผ่านการ "พิมพ์" และ "เห็นผล" มากกว่าการอ่านมาก
🎯 เป้าหมายของบทต่อไป: เรียนรู้ "ตัวแปร" — กล่องเก็บข้อมูล + ประเภทข้อมูล (int, double, String, boolean...) + operator (+, -, *, /, %)