Java เป็นภาษาโปรแกรมเชิงวัตถุซึ่งเป็นภาษาหลักของ Android SDK มานานกว่าทศวรรษ แม้ว่า Google จะเปลี่ยนไปใช้ Kotlin อย่างเป็นทางการ แต่ Java ยังคงเป็นส่วนสำคัญของระบบนิเวศ: โปรเจกต์เดิม แอปพลิเคชันองค์กร และโค้ดหลายล้านบรรทัดใน Google Play ยังคงทำงานบน Java ตามรายงาน JetBrains Developer Ecosystem (2025) ประมาณ 35% ของโปรเจกต์ Android ยังคงใช้ Java อ่านเพิ่มเติมเกี่ยวกับเทรนด์ปัจจุบันได้ใน รายงานอย่างเป็นทางการของ JetBrains
ประเด็นสำคัญ
Java เป็นภาษาโปรแกรมเอนกประสงค์ที่สร้างโดย Sun Microsystems ในปี 1995 หลักการสำคัญคือ "Write Once, Run Anywhere": Java bytecode ที่คอมไพล์แล้วทำงานบนแพลตฟอร์มใดก็ได้ที่ติดตั้งเครื่องเสมือน JVM ในบริบทของการพัฒนามือถือ Java กลายเป็นภาษาทางการภาษาแรกของ Android SDK ที่เผยแพร่โดย Google ในปี 2008
สถาปัตยกรรม Java ประกอบด้วยสามองค์ประกอบ: JDK (Java Development Kit) — ชุดเครื่องมือนักพัฒนา JRE (Java Runtime Environment) — สภาพแวดล้อมรันไทม์ และ JVM (Java Virtual Machine) — เครื่องเสมือน Android ใช้ JVM ในแบบของตัวเอง — Android Runtime (ART) ซึ่งแทนที่ Dalvik ในเวอร์ชัน 5.0 (Lollipop) ART ดำเนินการ DEX bytecode ซึ่งคอมไพล์จาก Java bytecode ผ่านยูทิลิตี้ dx/d8
คุณลักษณะสำคัญของ Java คือการจัดการหน่วยความจำอัตโนมัติผ่าน Garbage Collector (GC) นักพัฒนาไม่จำเป็นต้องปล่อยหน่วยความจำอย่างชัดเจน — GC ติดตามออบเจกต์ที่ไม่ได้ใช้และลบออก ใน Android ART ใช้ Concurrent Mark Sweep (CMS) และ Generational GC ซึ่งปรับให้เหมาะสมสำหรับทรัพยากรที่จำกัดของอุปกรณ์มือถือ สิ่งนี้ช่วยลดภาระของนักพัฒนา แต่อาจทำให้เกิด "แล็ก" ระหว่างการเก็บขยะในเธรด UI
Android รองรับเซตย่อยของ Java API ที่ขยายตัวตามเวอร์ชันระบบปฏิบัติการใหม่แต่ละเวอร์ชัน Android 12 (API 31) เพิ่มการรองรับ Java 11 รวมถึง lambda พร้อมการจับตัวแปร ระบบโมดูล JPMS และไคลเอ็นต์ HTTP java.net.http Android 14 (API 34) นำการรองรับทดลองสำหรับ Java 17 ผ่าน desugaring D8/R8 — คุณสมบัติบางอย่าง (records, sealed classes) ถูกแปลเป็นโค้ดที่เข้ากันได้สำหรับเวอร์ชันเก่า
| เวอร์ชัน Java | Android API (min) | เวอร์ชัน Android | คุณสมบัติสำคัญ |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | Lambda, Stream API, Optional |
| Java 11 | API 31 | 12 | HTTP Client, Local-Variable Syntax |
| Java 17 | API 34 | 14 | Records, Sealed Classes (D8) |
Android SDK ประกอบด้วยคอมไพเลอร์ Java ยูทิลิตี้ dex (d8), aapt (Asset Packaging Tool), อีมูเลเตอร์และไลบรารี android.* และ java.* นักพัฒนาเขียนโค้ดใน Java คอมไพล์เป็นไฟล์ .class (JVM bytecode) จากนั้น d8 แปลงเป็นไฟล์ .dex (Dalvik Executable) ซึ่งบรรจุใน APK พร้อมกับทรัพยากรและ AndroidManifest.xml
Gradle คือระบบสร้างโปรเจกต์ Android ไฟล์ build.gradle (Groovy) หรือ build.gradle.kts (Kotlin DSL) อธิบายการพึ่งพา เวอร์ชัน SDK รสชาติและลายเซ็น Android Gradle Plugin (AGP) เวอร์ชัน 8.x ทำให้ desugar เป็นอัตโนมัติ — การแปลคุณสมบัติ Java สมัยใหม่เป็นโค้ดที่เข้ากันได้ย้อนหลัง ตัวอย่างเช่น java.time.LocalDate ถูกแปลงเป็นโค้ดที่เข้ากันได้กับ API 21+ โดยไม่มีการเปลี่ยนแปลงในซอร์สโค้ดของนักพัฒนา
// Activity Android อย่างง่ายใน Java
package com.example.myapp;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.textView);
tv.setText("Hello from Java!");
}
// เมธอดสำหรับจัดการการคลิกปุ่ม
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("Button clicked");
}
}คลาส MainActivity ขยาย AppCompatActivity — คลาสพื้นฐานจาก AndroidX เพื่อความเข้ากันได้ย้อนหลัง เมธอด onCreate ถูกเรียกเมื่อสร้าง Activity โดยตั้งค่าเลย์เอาต์ผ่าน setContentView findViewById เชื่อมต่อตัวแปร Java กับองค์ประกอบจากเลย์เอาต์ XML เมธอด onButtonClick ผูกกับปุ่มผ่านแอตทริบิวต์ android:onClick ใน XML
วงจรชีวิต Activity ใน Java คือลำดับของ callback: onCreate → onStart → onResume (ทำงาน), onPause → onStop → onDestroy (สิ้นสุด) นักพัฒนาโอเวอร์ไรด์เมธอดเหล่านี้เพื่อจัดการทรัพยากร onCreate — การเริ่มต้น, onPause — การบันทึกข้อมูล, onDestroy — การปล่อยทรัพยากร Android เรียกเมธอดเหล่านี้เมื่อหมุนหน้าจอ เข้าสู่พื้นหลัง และรับสายโทรศัพท์
// วงจรชีวิต Activity พร้อมการจัดการสถานะ
public class DetailActivity extends AppCompatActivity {
private String itemId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
itemId = getIntent().getStringExtra("ITEM_ID");
loadData(itemId);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("item_id", itemId);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
itemId = savedInstanceState.getString("item_id");
loadData(itemId);
}
private void loadData(String id) {
// โหลดข้อมูลตามตัวระบุ
}
}เมธอด onSaveInstanceState บันทึกสถานะ Activity เมื่อหมุนหน้าจอหรือสลับงาน Bundle ประกอบด้วยคู่คีย์-ค่า — ชนิดธรรมดา ออบเจกต์ Parcelable หรือ Serializable onRestoreInstanceState คืนค่าสถานะที่บันทึกไว้ รูปแบบนี้สำคัญสำหรับ Android เนื่องจากระบบสามารถทำลาย Activity เมื่อหน่วยความจำไม่เพียงพอและคืนค่าเมื่อผู้ใช้กลับมา
ไวยากรณ์ Java คล้าย C มีการกำหนดชนิดอย่างเข้มงวด เชิงวัตถุ แต่ละไฟล์ .java มีคลาส public หนึ่งคลาสซึ่งชื่อตรงกับชื่อไฟล์ Java ไม่รองรับฟังก์ชันนอกคลาส — ทุกสิ่งคือเมธอด จุดเริ่มต้นคือเมธอด static public static void main(String[] args) สำหรับแอปพลิเคชันคอนโซลหรือเมธอดวงจรชีวิต Android Activity สำหรับมือถือ
Java แบ่งชนิดเป็นพื้นฐาน (int, double, boolean, char, byte, short, long, float) และชนิดอ้างอิง (คลาส, อินเทอร์เฟซ, อาร์เรย์, enum) ชนิดพื้นฐานถูกเก็บในสแต็กและส่งผ่านด้วยค่า ออบเจกต์อยู่ในฮีป ส่งผ่านด้วยการอ้างอิง Autoboxing แปลงชนิดพื้นฐานเป็นออบเจกต์ wrapper (Integer, Double, Boolean) โดยอัตโนมัติ แต่สร้างออบเจกต์พิเศษ — ในAndroid สิ่งนี้สำคัญสำหรับประสิทธิภาพ UI
// ตัวอย่างชนิดข้อมูลและโครงสร้าง Java
public class DataTypes {
// ชนิดพื้นฐาน
int count = 42;
double price = 19.99;
boolean isActive = true;
char grade = 'A';
// ชนิดอ้างอิง
String name = "Android";
Integer boxed = 100; // autoboxing
List<String> items = new ArrayList<>();
// เมธอดกับเจเนอริก
public <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}
// Enum สำหรับเซตค่าคงที่
public enum Status {
PENDING, LOADING, SUCCESS, ERROR
}
}เจเนอริก List<T> ให้ความปลอดภัยของชนิดสำหรับคอลเล็กชัน เมธอด getFirst คืนค่าองค์ประกอบของชนิดใดก็ได้ — ชนิดเฉพาะถูกกำหนดที่จุดเรียก Enum Status คอมไพล์เป็นคลาสที่มีเซตค่าคงที่คงที่ แต่ละอินสแตนซ์คือซิงเกิลตัน ใน Android enum ถูกใช้น้อยลงเนื่องจากใช้หน่วยความจำ: ProGuard/R8 ปรับ enum เป็นค่าคงที่ int เมื่อเป็นไปได้
การเปรียบเทียบ Java และ Kotlin สำหรับการพัฒนา Android เป็นหนึ่งในหัวข้อหลักตั้งแต่ปี 2019 เมื่อ Google ประกาศให้ Kotlin เป็นภาษาที่มีความสำคัญสูง Kotlin เข้ากันได้อย่างสมบูรณ์กับ Java — ทั้งสองคอมไพล์เป็น JVM bytecode สามารถเรียกหากันและกันและใช้ไลบรารีเดียวกัน อย่างไรก็ตาม วิธีการเขียนโค้ดแตกต่างกันอย่างมาก
Kotlin ขจัดความยาวของ Java: data class แทนที่ 50+ บรรทัดของคลาส Java พร้อม getter, setter, equals, hashCode, toString และ copy ความปลอดภัย null ถูกสร้างในระบบชนิดของ Kotlin — NullPointerException เป็นไปไม่ได้ในทางปฏิบัติ ฟังก์ชันส่วนขยายอนุญาตให้เพิ่มเมธอดให้กับคลาสที่มีอยู่โดยไม่ต้องสืบทอด Smart Casts แปลงชนิดโดยอัตโนมัติหลังการตรวจสอบ
| ด้าน | Java | Kotlin |
|---|---|---|
| ความปลอดภัย null | คำอธิบาย @Nullable / @NonNull | String? / String — ในตัว |
| Data class | 50+ บรรทัดกับ Lombok | data class User(val name: String) |
| ส่วนขยาย | คลาสยูทิลิตี้ static | fun String.isEmail(): Boolean |
| Coroutines | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| Lambda | FunctionalInterface + ::method | Lambda โดยค่าเริ่มต้น |
| คำอธิบาย DI | @Inject, @Module, @Provides | คล้ายกัน แต่โค้ดน้อยกว่า |
ในแง่ประสิทธิภาพ Java และ Kotlin เหมือนกัน — ทั้งสองคอมไพล์เป็น JVM bytecode ซึ่ง Android ART ดำเนินการเหมือนกัน ความแตกต่างอยู่ที่ขนาด APK: Kotlin เพิ่ม ~200-400 KB สำหรับไลบรารี kotlin-stdlib โปรเจกต์ Java มีขนาด APK เล็กกว่าเนื่องจากไม่มีรันไทม์เพิ่มเติม แต่เมื่อใช้ Java Stream API และ Optional ขนาด APK อาจเพิ่มขึ้นเนื่องจาก desugaring
เครื่องมือนักพัฒนา Java สำหรับ Android ประกอบด้วย Android Studio, Gradle, โปรไฟล์เลอร์และอีมูเลเตอร์ Android Studio คือ IDE ทางการ ซึ่งสร้างบน IntelliJ IDEA Community ประกอบด้วยตัวแก้ไขพร้อมการเติมข้อความอัตโนมัติ Java ตัววิเคราะห์โค้ด (lint) การปรับโครงสร้างและตัวแก้ไขเลย์เอาต์แบบภาพ (Layout Editor)
Android Gradle Plugin (AGP) เวอร์ชัน 8.x จัดการการสร้าง: การคอมไพล์ Java เป็นคลาส, desugaring, การย่อ ProGuard/R8, การบรรจุใน APK/AAB R8 คือ desugaring และ obfuscator ที่อัปเดตซึ่งแทนที่ ProGuard รูปแบบการสร้าง (debug/release + product flavors) ถูกกำหนดค่าผ่าน build.gradle Gradle Daemon เร่งการสร้างครั้งถัดไปผ่านการแคช
// build.gradle (app) — การกำหนดค่าโมดูล Java
android {
compileSdk 34
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
testImplementation 'junit:junit:4.13.2'
}บล็อก compileOptions ระบุเวอร์ชัน Java สำหรับการคอมไพล์ — Java 17 พร้อมใช้งานกับ AGP 8.x SDK ขั้นต่ำ (minSdk) กำหนดเวอร์ชัน Android ขั้นต่ำที่แอปพลิเคชันทำงาน Target SDK คือเวอร์ชันที่แอปพลิเคชันถูกทดสอบ ความแตกต่างระหว่าง compileSdk และ targetSdk: compileSdk คือ API สำหรับการคอมไพล์ targetSdk คือพฤติกรรมรันไทม์
ข้อจำกัดของ Java ใน Android นำไปสู่การเปลี่ยนของ Google เป็น Kotlin NullPointerException เป็นข้อยกเว้นที่พบบ่อยที่สุดในแอปพลิเคชัน Java Android เนื่องจากระบบชนิดไม่แยกความแตกต่างระหว่างการอ้างอิง nullable และ non-null Google แนะนำคำอธิบาย @Nullable และ @NonNull จากแพ็คเกจ androidx.annotation แต่คอมไพเลอร์ไม่ตรวจสอบ — มีเพียง lint ที่ตรวจสอบ
การไม่มี coroutines เป็นข้อจำกัดอีกประการ: การดำเนินการแบบอะซิงโครนัสใน Java ต้องใช้ callback, AsyncTask (เลิกใช้ตั้งแต่ API 30), ExecutorService หรือ RxJava สิ่งนี้นำไปสู่ callback hell และหน่วยความจำรั่วเมื่อหมุนหน้าจอ Coroutines ของ Kotlin กับ Structured Concurrency แก้ปัญหานี้ในระดับภาษา: coroutine ถูกยกเลิกเมื่อ Activity ถูกทำลายโดยไม่ต้องจัดการด้วยตนเอง
โค้ดสำเร็จรูปใน Java เป็นแหล่งของข้อผิดพลาดเมื่อเขียน equals/hashCode ด้วยตนเอง, การใช้งาน Parcelable และ ViewHolder สำหรับ RecyclerView ไลบรารี Android KTX และ Jetpack Compose มุ่งเน้นไปที่ Kotlin API Android ใหม่ (Room, Navigation, Compose) เผยแพร่ตัวอย่างใน Kotlin โดยค่าเริ่มต้น แม้ว่าจะมีเวอร์ชัน Java อยู่
คำถามที่พบบ่อย
Java เป็นภาษาโปรแกรมเชิงวัตถุจาก Sun Microsystems (1995) ทำงานบนเครื่องเสมือน JVM เป็นภาษาหลักของ Android SDK จนถึงปี 2019 ใช้ในการพัฒนามือถือสำหรับโปรเจกต์เดิม ฝั่งเซิร์ฟเวอร์ (Spring) และแอปพลิเคชันองค์กร มีลักษณะเฉพาะด้วยการกำหนดชนิดที่เข้มงวด การเก็บขยะอัตโนมัติและการทำงานข้ามแพลตฟอร์มของ bytecode
Google ประกาศให้ Kotlin เป็นภาษาที่มีความสำคัญสูงสำหรับ Android ในปี 2019 ไลบรารี AndroidX ใหม่ Jetpack Compose คำแนะนำด้านสถาปัตยกรรมและเอกสารประกอบถูกให้ใน Kotlin โดยค่าเริ่มต้น Java ยังคงได้รับการสนับสนุนอย่างเต็มที่ แต่ API ถูกออกแบบด้วยแนวทาง Kotlin-first โปรเจกต์ Java ต้องการโค้ดสำเร็จรูปมากกว่าและไม่ได้รับคุณสมบัติภาษาใหม่ก่อน
Android รองรับ Java 8 อย่างเต็มที่ Java 11 บางส่วนตั้งแต่ Android 12+ และ Java 17 แบบทดลองผ่าน D8 desugaring Android Gradle Plugin (AGP) 8.x แปล bytecode สมัยใหม่เป็นโค้ดที่เข้ากันได้สำหรับ API เก่าผ่าน desugar นักพัฒนาสามารถเขียนใน Java 11+ ใช้ lambda, Optional และ DateTime API แต่ records และ sealed classes พร้อมใช้งานผ่าน D8 เท่านั้น
Kotlin ต้องการโค้ดน้อยกว่า: data class แทนที่โค้ดสำเร็จรูป Java หลายสิบบรรทัด ความปลอดภัย null ถูกสร้างในชนิด coroutines ทำให้อะซิงโครนัสง่ายขึ้น Java มีไวยากรณ์ง่ายกว่าสำหรับผู้เริ่มต้น ระบบนิเวศไลบรารีที่ผ่านการพิสูจน์แล้วและเครื่องมือที่เสถียร ประสิทธิภาพรันไทม์เหมือนกัน — ทั้งสองคอมไพล์เป็น JVM bytecode ที่ดำเนินการโดย Android ART
Android Studio คือ IDE มาตรฐานสำหรับการพัฒนา Android ที่รองรับ Java และ Kotlin ประกอบด้วยอีมูเลเตอร์ โปรไฟล์เลอร์ (CPU, หน่วยความจำ, เครือข่าย), Layout Inspector, APK Analyzer IntelliJ IDEA เหมาะสำหรับ Java ฝั่งเซิร์ฟเวอร์ Eclipse ADT เลิกใช้แล้วและไม่ได้รับการสนับสนุนจาก Google Android Studio ยังมีเครื่องมือสำหรับโยกย้ายโค้ด Java ไปยัง Kotlin ผ่านตัวแปลงในตัว
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม