Skip to content

บทที่ 1 — ติดตั้ง + เขียน Hello World แบบเข้าใจทุกบรรทัด

← บทที่ 0 | สารบัญ | บทที่ 2: ตัวแปรและประเภทข้อมูล →

บทนี้เราจะ:

  1. ติดตั้ง JDK (Java Development Kit)
  2. ติดตั้ง IntelliJ IDEA (IDE ที่จะใช้เขียน Java)
  3. เขียนโปรแกรม Java แรก — Hello World
  4. อธิบายทุกคำในโปรแกรม ว่าทำไมต้องเขียนแบบนี้
  5. ทดลอง 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

ตั้งค่า:

ช่องใส่อะไร
NameHelloWorld
Locationเลือกโฟลเดอร์ที่อยากเก็บ project เช่น C:\Users\jirap\java-projects\
LanguageJava
Build systemIntelliJ (ง่ายที่สุดสำหรับ 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 วิธี เลือกอันที่ถนัด:

  1. คลิกลูกศรเขียวเล็ก ๆ (สามเหลี่ยมสีเขียว ▶) ที่ แถบซ้ายสุดของ editor (เรียกว่า gutter — แถบที่แสดงเลขบรรทัดและปุ่ม run) ตรงบรรทัดที่มี public static void main — ถ้ายังไม่เห็นลูกศร ลองรอ IntelliJ index project ให้เสร็จก่อน (มี progress bar ล่างขวา)
  2. กด Shift + F10 (Windows/Linux) หรือ Ctrl + R (Mac — หมายถึง ^ Control key ไม่ใช่ ⌘ Command) — คีย์ลัดนี้ใช้ run ซ้ำหลังจาก run ด้วยวิธีที่ 1 หรือ 3 ไปแล้วครั้งหนึ่ง (ครั้งแรกสุดให้ใช้วิธีที่ 1 หรือ 3)
  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, mainnJVM จะไม่เจอ:

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
';' expected

4.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 แยกตัวพิมพ์ใหญ่/เล็ก:

  • Stringstring (ตัวเล็กผิด)
  • Systemsystem
  • Mainmain

⚠️ 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 = ประกาศ class
  • static = ไม่ต้องสร้าง object
  • void = ไม่ return ค่า
  • main(String[] args) = entry point + รับ command-line args
  • System.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 (+, -, *, /, %)

→ ไปบทที่ 2: ตัวแปรและประเภทข้อมูล