Java: ngôn ngữ này là gì, các đặc điểm của nó và phát triển Android

Tác giả: IT Sectr Đã đăng: 2026-02-10 Thời gian đọc: 11 phút

Java là ngôn ngữ lập trình hướng đối tượng, là ngôn ngữ chính của Android SDK trong hơn một thập kỷ. Bất chấp sự chuyển đổi chính thức của Google sang Kotlin, Java vẫn là một phần quan trọng của hệ sinh thái: các dự án kế thừa, ứng dụng doanh nghiệp và hàng triệu dòng mã trên Google Play tiếp tục chạy trên Java. Theo báo cáo JetBrains Developer Ecosystem (2025), khoảng 35% dự án Android vẫn sử dụng Java. Đọc thêm về xu hướng hiện tại trong báo cáo chính thức của JetBrains.

Những điểm chính

  • Java — ngôn ngữ Android chính cho đến năm 2019, mã kế thừa chiếm ~35% dự án
  • JVM — máy ảo đảm bảo đa nền tảng của mã bytecode Java
  • Android SDK — bộ công cụ hoàn chỉnh bao gồm trình biên dịch, trình giả lập và hồ sơ
  • Kotlin — người kế nhiệm Java, nhưng cả hai ngôn ngữ đều biên dịch sang cùng một bytecode JVM
  • Gradle — hệ thống xây dựng quản lý phụ thuộc và cấu hình trong các dự án Android

Java là gì?

Java là ngôn ngữ lập trình đa năng được tạo ra bởi Sun Microsystems vào năm 1995. Nguyên tắc chính là "Write Once, Run Anywhere": mã bytecode Java đã biên dịch chạy trên bất kỳ nền tảng nào có cài đặt máy ảo JVM. Trong bối cảnh phát triển di động, Java đã trở thành ngôn ngữ chính thức đầu tiên của Android SDK do Google phát hành năm 2008.

Kiến trúc Java dựa trên ba thành phần: JDK (Java Development Kit) — bộ công cụ phát triển, JRE (Java Runtime Environment) — môi trường chạy, và JVM (Java Virtual Machine) — máy ảo. Android sử dụng triển khai JVM riêng — Android Runtime (ART), thay thế Dalvik trong phiên bản 5.0 (Lollipop). ART thực thi bytecode DEX, được biên dịch từ bytecode Java thông qua tiện ích dx/d8.

Một tính năng chính của Java là quản lý bộ nhớ tự động thông qua Garbage Collector (GC). Nhà phát triển không cần giải phóng bộ nhớ một cách tường minh — GC theo dõi các đối tượng không được sử dụng và loại bỏ chúng. Trong Android ART, Concurrent Mark Sweep (CMS) và Generational GC được sử dụng, tối ưu hóa cho tài nguyên hạn chế của thiết bị di động. Điều này giảm tải cho nhà phát triển, nhưng có thể gây "lag" trong quá trình thu gom rác trên luồng UI.

Phiên bản Java và Android API

Android hỗ trợ một tập hợp con của Java API mở rộng theo từng phiên bản hệ điều hành mới. Android 12 (API 31) đã thêm hỗ trợ Java 11, bao gồm lambda với capture biến, hệ thống mô-đun JPMS và máy khách HTTP java.net.http. Android 14 (API 34) đã giới thiệu hỗ trợ thử nghiệm cho Java 17 thông qua desugaring D8/R8 — một số tính năng (records, sealed classes) được dịch sang mã tương thích cho các phiên bản cũ.

Phiên bản JavaAndroid API (min)Phiên bản AndroidTính năng chính
Java 7API 194.4 KitKattry-with-resources, multi-catch
Java 8API 247.0 NougatLambda, Stream API, Optional
Java 11API 3112HTTP Client, Local-Variable Syntax
Java 17API 3414Records, Sealed Classes (D8)

Java SDK và phát triển Android

Android SDK bao gồm trình biên dịch Java, tiện ích dex (d8), aapt (Asset Packaging Tool), trình giả lập và các thư viện android.* và java.*. Nhà phát triển viết mã bằng Java, biên dịch nó thành các tệp .class (bytecode JVM), sau đó d8 chuyển đổi chúng thành các tệp .dex (Dalvik Executable), được đóng gói vào APK cùng với tài nguyên và AndroidManifest.xml.

Gradle là hệ thống xây dựng dự án Android. Tệp build.gradle (Groovy) hoặc build.gradle.kts (Kotlin DSL) mô tả các phụ thuộc, phiên bản SDK, hương vị và chữ ký. Android Gradle Plugin (AGP) phiên bản 8.x tự động hóa desugar — dịch các tính năng Java hiện đại thành mã tương thích ngược. Ví dụ: java.time.LocalDate được chuyển đổi thành mã tương thích API 21+ mà không thay đổi mã nguồn của nhà phát triển.

java
// Activity Android đơn giản bằng 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!");
    }

    // Phương thức xử lý nhấp nút
    public void onButtonClick(View view) {
        TextView tv = findViewById(R.id.textView);
        tv.setText("Button clicked");
    }
}

Lớp MainActivity mở rộng AppCompatActivity — một lớp cơ sở từ AndroidX để tương thích ngược. Phương thức onCreate được gọi khi Activity được tạo; trong đó bố cục được thiết lập thông qua setContentView. findViewById liên kết một biến Java với một phần tử từ bố cục XML. Phương thức onButtonClick được liên kết với nút thông qua thuộc tính android:onClick trong XML.

Làm việc với Activity và vòng đời

Vòng đời Activity trong Java là một chuỗi các callback: onCreate → onStart → onResume (hoạt động), onPause → onStop → onDestroy (kết thúc). Nhà phát triển ghi đè các phương thức này để quản lý tài nguyên. onCreate — khởi tạo, onPause — lưu dữ liệu, onDestroy — giải phóng tài nguyên. Android gọi các phương thức này khi xoay màn hình, vào nền và nhận cuộc gọi.

java
// Vòng đời Activity với quản lý trạng thái
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) {
        // Tải dữ liệu theo định danh
    }
}

Phương thức onSaveInstanceState lưu trạng thái Activity khi xoay màn hình hoặc chuyển đổi tác vụ. Bundle chứa các cặp khóa-giá trị — kiểu đơn giản, đối tượng Parcelable hoặc Serializable. onRestoreInstanceState khôi phục trạng thái đã lưu. Mẫu này rất quan trọng đối với Android, vì hệ thống có thể hủy Activity khi thiếu bộ nhớ và khôi phục khi người dùng quay lại.

Cú pháp Java: lớp, phương thức và kiểu

Cú pháp Java giống C, được kiểu hóa mạnh, hướng đối tượng. Mỗi tệp .java chứa một lớp public có tên trùng với tên tệp. Java không hỗ trợ hàm bên ngoài lớp — mọi thứ đều là phương thức. Điểm vào là phương thức tĩnh public static void main(String[] args) cho ứng dụng console hoặc các phương thức vòng đời Android Activity cho di động.

Kiểu dữ liệu Java

Java chia kiểu thành nguyên thủy (int, double, boolean, char, byte, short, long, float) và kiểu tham chiếu (lớp, giao diện, mảng, enum). Nguyên thủy được lưu trên ngăn xếp và truyền theo giá trị. Đối tượng nằm trong heap, truyền theo tham chiếu. Autoboxing tự động chuyển đổi nguyên thủy thành đối tượng wrapper (Integer, Double, Boolean), nhưng tạo ra các đối tượng thừa — trong Android, điều này rất quan trọng đối với hiệu suất UI.

java
// Ví dụ về kiểu dữ liệu và cấu trúc Java
public class DataTypes {
    // Nguyên thủy
    int count = 42;
    double price = 19.99;
    boolean isActive = true;
    char grade = 'A';

    // Kiểu tham chiếu
    String name = "Android";
    Integer boxed = 100; // autoboxing
    List<String> items = new ArrayList<>();

    // Phương thức với Generics
    public <T> T getFirst(List<T> list) {
        return list.isEmpty() ? null : list.get(0);
    }

    // Enum cho tập hợp giá trị cố định
    public enum Status {
        PENDING, LOADING, SUCCESS, ERROR
    }
}

Generics List<T> cung cấp an toàn kiểu cho các bộ sưu tập. Phương thức getFirst trả về một phần tử của bất kỳ kiểu nào — kiểu cụ thể được xác định tại điểm gọi. Enum Status biên dịch thành một lớp với một tập hợp hằng số cố định, mỗi instance là một singleton. Trong Android, enum ít được sử dụng hơn do tiêu thụ bộ nhớ: ProGuard/R8 tối ưu hóa enum thành hằng số int nếu có thể.

Java vs Kotlin: so sánh trong Android

So sánh Java và Kotlin cho phát triển Android là một trong những chủ đề chính kể từ năm 2019, khi Google tuyên bố Kotlin là ngôn ngữ ưu tiên. Kotlin hoàn toàn tương thích với Java — cả hai đều biên dịch sang bytecode JVM, có thể gọi lẫn nhau và sử dụng cùng một thư viện. Tuy nhiên, cách tiếp cận viết mã khác nhau đáng kể.

Mã boilerplate

Kotlin loại bỏ sự dài dòng của Java: data class thay thế 50+ dòng của một lớp Java với getter, setter, equals, hashCode, toString và copy. An toàn null được tích hợp vào hệ thống kiểu của Kotlin — NullPointerException thực tế không thể xảy ra. Hàm mở rộng cho phép thêm phương thức vào các lớp hiện có mà không cần kế thừa. Smart Casts tự động chuyển đổi kiểu sau khi kiểm tra.

Khía cạnhJavaKotlin
An toàn nullChú thích @Nullable / @NonNullString? / String — tích hợp
Data class50+ dòng với Lombokdata class User(val name: String)
Mở rộngLớp tiện ích tĩnhfun String.isEmail(): Boolean
CoroutinesAsyncTask / ExecutorServicesuspend + Structured Concurrency
LambdaFunctionalInterface + ::methodLambda mặc định
Chú thích DI@Inject, @Module, @ProvidesTương tự, nhưng ít mã hơn

Hiệu suất

Về hiệu suất, Java và Kotlin giống hệt nhau — cả hai đều biên dịch sang bytecode JVM, Android ART thực thi như nhau. Sự khác biệt nằm ở kích thước APK: Kotlin thêm ~200-400 KB cho thư viện kotlin-stdlib. Dự án Java có kích thước APK nhỏ hơn do không có thời gian chạy bổ sung, nhưng khi sử dụng Java Stream API và Optional, kích thước APK có thể tăng do desugaring.

Công cụ phát triển Java cho Android

Công cụ phát triển Java cho Android bao gồm Android Studio, Gradle, trình hồ sơ và trình giả lập. Android Studio là IDE chính thức, dựa trên IntelliJ IDEA Community, bao gồm trình soạn thảo với tự động hoàn thành Java, trình phân tích mã (lint), tái cấu trúc và trình soạn thảo bố cục trực quan (Layout Editor).

Công cụ chính

Android Gradle Plugin (AGP) phiên bản 8.x quản lý bản dựng: biên dịch Java thành lớp, desugaring, thu nhỏ ProGuard/R8, đóng gói vào APK/AAB. R8 là desugaring và làm rối mã đã cập nhật, thay thế ProGuard. Các biến thể xây dựng (debug/release + product flavors) được cấu hình thông qua build.gradle. Gradle Daemon tăng tốc các bản dựng tiếp theo thông qua lưu đệm.

groovy
// build.gradle (app) — cấu hình mô-đun 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'
}

Khối compileOptions chỉ định phiên bản Java cho biên dịch — Java 17 có sẵn với AGP 8.x. SDK tối thiểu (minSdk) xác định phiên bản Android tối thiểu mà ứng dụng chạy được. Target SDK là phiên bản mà ứng dụng đã được kiểm thử. Sự khác biệt giữa compileSdk và targetSdk: compileSdk là API để biên dịch, targetSdk là hành vi thời gian chạy.

Hạn chế của Java trong phát triển di động

Hạn chế của Java trong Android đã dẫn đến sự chuyển đổi của Google sang Kotlin. NullPointerException là ngoại lệ phổ biến nhất trong các ứng dụng Java Android, vì hệ thống kiểu không phân biệt giữa tham chiếu nullable và non-null. Google khuyến nghị các chú thích @Nullable và @NonNull từ gói androidx.annotation, nhưng trình biên dịch không kiểm tra chúng — chỉ lint làm điều đó.

Thiếu coroutines là một hạn chế khác: các thao tác bất đồng bộ trong Java yêu cầu callback, AsyncTask (không được dùng từ API 30), ExecutorService hoặc RxJava. Điều này dẫn đến callback hell và rò rỉ bộ nhớ khi xoay màn hình. Coroutines của Kotlin với Structured Concurrency giải quyết vấn đề này ở cấp độ ngôn ngữ: coroutine bị hủy khi Activity bị hủy mà không cần quản lý thủ công.

Mã boilerplate trong Java là nguồn gây lỗi khi viết thủ công equals/hashCode, triển khai Parcelable và ViewHolder cho RecyclerView. Các thư viện Android KTX và Jetpack Compose hướng đến Kotlin. Các API Android mới (Room, Navigation, Compose) đăng tải ví dụ bằng Kotlin theo mặc định, mặc dù các phiên bản Java vẫn tồn tại.

Câu hỏi thường gặp

Java là gì?

Java là ngôn ngữ lập trình hướng đối tượng của Sun Microsystems (1995), chạy trên máy ảo JVM. Nó là ngôn ngữ chính của Android SDK cho đến năm 2019. Nó được sử dụng trong phát triển di động cho các dự án kế thừa, phía máy chủ (Spring) và ứng dụng doanh nghiệp. Đặc trưng bởi kiểu hóa mạnh, thu gom rác tự động và đa nền tảng của bytecode.

Tại sao Java được coi là ngôn ngữ kế thừa cho Android?

Google đã tuyên bố Kotlin là ngôn ngữ ưu tiên cho Android vào năm 2019. Các thư viện AndroidX mới, Jetpack Compose, khuyến nghị kiến trúc và tài liệu được cung cấp mặc định bằng Kotlin. Java vẫn được hỗ trợ đầy đủ, nhưng API được thiết kế theo cách tiếp cận Kotlin-first. Các dự án Java yêu cầu nhiều mã boilerplate hơn và không nhận được các tính năng ngôn ngữ mới trước.

Phiên bản Java nào được sử dụng trong Android?

Android hỗ trợ đầy đủ Java 8, Java 11 một phần từ Android 12+, và Java 17 thử nghiệm thông qua desugaring D8. Android Gradle Plugin (AGP) 8.x dịch bytecode hiện đại thành mã tương thích cho các API cũ thông qua desugar. Nhà phát triển có thể viết bằng Java 11+, sử dụng lambda, Optional và DateTime API, nhưng records và sealed classes chỉ khả dụng thông qua D8.

Java khác Kotlin như thế nào?

Kotlin yêu cầu ít mã hơn: data class thay thế hàng chục dòng boilerplate Java, an toàn null được tích hợp trong kiểu, coroutines đơn giản hóa bất đồng bộ. Java cung cấp cú pháp đơn giản hơn cho người mới bắt đầu, hệ sinh thái thư viện đã được kiểm chứng và công cụ ổn định. Hiệu suất thời gian chạy giống hệt nhau — cả hai đều biên dịch sang bytecode JVM được thực thi bởi Android ART.

IDE nào được sử dụng để phát triển Java cho Android?

Android Studio là IDE tiêu chuẩn cho phát triển Android với hỗ trợ Java và Kotlin. Nó bao gồm trình giả lập, hồ sơ (CPU, bộ nhớ, mạng), Layout Inspector, APK Analyzer. IntelliJ IDEA phù hợp cho Java máy chủ. Eclipse ADT đã lỗi thời và không được Google hỗ trợ. Android Studio cũng cung cấp các công cụ di chuyển mã Java sang Kotlin thông qua bộ chuyển đổi tích hợp.

Tóm tắt

  • Java — ngôn ngữ hướng đối tượng, ngôn ngữ chính của Android SDK trong 11 năm
  • Bytecode JVM được dịch sang DEX qua d8 và thực thi bởi Android Runtime (ART) với GC
  • Android hỗ trợ Java 8-17 với desugaring qua D8/R8 để tương thích ngược
  • Activity Java — thành phần cơ sở với vòng đời onCreate → onStart → onResume → onPause → onStop → onDestroy
  • Gradle — hệ thống xây dựng hỗ trợ Java 17, AGP 8.x và các biến thể xây dựng
  • Kotlin — người kế nhiệm Java với cùng bytecode, nhưng cú pháp hiện đại và an toàn null
  • Mã kế thừa Java chiếm ~35% dự án Android, Google tiếp tục hỗ trợ cả hai ngôn ngữ

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm