Java — 一种面向对象的编程语言,十多年来一直是Android SDK的主要语言。尽管谷歌正式转向Kotlin,Java仍然是生态系统的重要组成部分:遗留项目、企业应用程序和Google Play中的数百万行代码继续在Java上运行。根据JetBrains Developer Ecosystem(2025)报告,约35%的Android项目仍在使用Java。更多关于当前趋势的信息,请阅读JetBrains官方报告。
要点
Java — 由Sun Microsystems于1995年创建的一种通用编程语言。其主要原则是「Write Once, Run Anywhere」:编译后的Java字节码可在任何安装了JVM虚拟机的平台上运行。在移动开发背景下,Java成为谷歌于2008年发布的Android SDK的第一个官方语言。
Java架构基于三个组件:JDK(Java开发工具包)——开发者工具集,JRE(Java运行环境)——运行时环境,以及JVM(Java虚拟机)——虚拟机。Android使用自己的JVM实现——Android Runtime(ART),它在5.0(Lollipop)版本中取代了Dalvik。ART执行通过dx/d8工具从Java字节码编译而来的DEX字节码。
Java的关键特性——通过垃圾回收器(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)通过D8/R8脱糖引入了对Java 17的实验性支持——某些功能(records、sealed classes)被转换为与旧版本兼容的代码。
| Java版本 | Android API(最低) | 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(资源打包工具)、模拟器以及android.*和java.*库。开发者用Java编写代码,将其编译为.class文件(JVM字节码),然后d8将其转换为.dex文件(Dalvik可执行文件),这些文件与资源和AndroidManifest.xml一起打包到APK中。
Gradle——Android项目的构建系统。build.gradle(Groovy)或build.gradle.kts(Kotlin DSL)文件描述依赖关系、SDK版本、产品风味(product flavors)和签名。Android Gradle Plugin(AGP)8.x版本自动化脱糖——将现代Java特性转换为向后兼容的代码。例如,java.time.LocalDate无需更改开发者的源代码即可转换为与API 21+兼容的代码。
// Java中的简单Android Activity
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("来自Java的问候!");
}
// 处理按钮点击的方法
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("按钮已点击");
}
}MainActivity类继承自AppCompatActivity——来自AndroidX的基类以实现向后兼容。onCreate方法在创建Activity时调用,通过setContentView设置布局。findViewById将Java变量与XML布局中的元素关联。onButtonClick方法通过XML中的android:onClick属性绑定到按钮。
Activity的生命周期在Java中——一系列回调: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文件包含一个公共类,其名称与文件名相同。Java不支持类之外的函数——一切都是方法。入口点是控制台应用程序的静态方法public static void main(String[] args)或移动应用的Android Activity生命周期方法。
Java将类型分为基本类型(int、double、boolean、char、byte、short、long、float)和引用类型(类、接口、数组、枚举)。基本类型存储在栈中并按值传递。对象在堆中,按引用传递。自动装箱(autoboxing)自动将基本类型转换为包装对象(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);
}
// 用于固定值集合的枚举
public enum Status {
PENDING, LOADING, SUCCESS, ERROR
}
}泛型List<T>确保集合的类型安全。getFirst方法返回任何类型的元素——具体类型在调用点确定。枚举Status编译为具有固定常量集的类,每个实例都是单例。在Android中,枚举由于内存消耗而较少使用:ProGuard/R8在可能的情况下将枚举优化为int常量。
Java与Kotlin的比较用于Android开发——自2019年谷歌宣布Kotlin为首选语言以来的主要话题之一。Kotlin与Java完全兼容——两者都编译为JVM字节码,可以相互调用并使用相同的库。然而,编写代码的方法根本不同。
Kotlin消除了Java的冗长性:数据类(data class)取代了50多行带有getter、setter、equals、hashCode、toString和copy的Java类。空安全内置于Kotlin的类型系统中——NullPointerException几乎不可能发生。扩展函数允许向现有类添加方法而无需继承。智能转换(Smart Casts)在检查后自动转换类型。
| 方面 | Java | Kotlin |
|---|---|---|
| 空安全 | @Nullable / @NonNull注解 | String? / String — 内置 |
| 数据类 | 50+行(带Lombok) | data class User(val name: String) |
| 扩展 | 静态工具类 | fun String.isEmail(): Boolean |
| 协程 | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| Lambda | FunctionalInterface + ::method | 默认Lambda |
| DI注解 | @Inject, @Module, @Provides | 类似,但代码更少 |
在性能方面,Java和Kotlin是相同的——两者都编译为JVM字节码,Android ART执行方式相同。APK大小的差异:Kotlin为kotlin-stdlib库添加了约200-400KB。Java项目由于没有额外的运行时,APK大小更小,但在使用Java Stream API和Optional时,APK大小可能因脱糖而增加。
Java开发者的工具用于Android包括Android Studio、Gradle、性能分析器和模拟器。Android Studio——基于IntelliJ IDEA Community的官方IDE,包括具有Java自动完成功能的编辑器、代码分析器(lint)、重构和可视化布局编辑器(Layout Editor)。
Android Gradle Plugin(AGP)8.x版本管理构建:将Java编译为类、脱糖、ProGuard/R8压缩、打包为APK/AAB。R8——改进的脱糖和混淆器,取代ProGuard。构建变体(debug/release + product flavors)通过build.gradle配置。Gradle守护进程通过缓存加速后续构建。
// 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版本。目标SDK——应用程序测试所针对的版本。compileSdk和targetSdk之间的区别:compileSdk——用于编译的API,targetSdk——运行时行为。
Java的局限性在Android中成为了谷歌转向Kotlin的原因。NullPointerException——Java-Android应用程序中最常见的异常,因为类型系统不区分可空和非空引用。谷歌推荐来自androidx.annotation包的@Nullable和@NonNull注解,但编译器不检查它们——只有lint进行检查。
缺少协程——另一个局限性:Java中的异步操作需要回调、AsyncTask(自API 30起已弃用)、ExecutorService或RxJava。这导致了回调地狱和屏幕旋转时的内存泄漏。Kotlin协程通过结构化并发(Structured Concurrency)在语言层面解决了这个问题:协程在Activity销毁时自动取消,无需手动管理。
Java中的样板代码——手动编写equals/hashCode、Parcelable实现和RecyclerView的ViewHolder时错误来源。Android KTX库和Jetpack Compose面向Kotlin。新的Android API(Room、Navigation、Compose)默认发布Kotlin示例,尽管Java版本也存在。
常见问题
Java — Sun Microsystems(1995年)开发的面向对象编程语言,运行在JVM虚拟机上。在2019年之前是Android SDK的主要语言。用于移动开发中的遗留项目、服务器端(Spring)和企业应用程序。以强类型、自动垃圾回收和字节码跨平台为特点。
谷歌于2019年宣布Kotlin为Android的首选语言。新的AndroidX库、Jetpack Compose、架构建议和文档默认以Kotlin提供。Java仍然完全受支持,但API是以Kotlin优先的方法设计的。Java项目需要更多样板代码,并且不能首先获得新的语言特性。
Android完全支持Java 8,部分支持Java 11(Android 12+),通过D8脱糖实验性支持Java 17。Android Gradle Plugin(AGP)8.x通过脱糖将现代字节码转换为与旧API兼容的代码。开发者可以使用lambda、Optional和DateTime API编写Java 11+代码,但records和sealed classes只能通过D8使用。
Kotlin需要更少的代码:数据类取代了数十行Java样板代码,空安全内置于类型中,协程简化了异步操作。Java为初学者提供更简单的语法、经过验证的库生态系统和稳定的工具。运行时性能相同——两者都编译为JVM字节码,由Android ART执行。
Android Studio — 支持Java和Kotlin的Android开发标准IDE。包括模拟器、性能分析器(CPU、内存、网络)、布局检查器、APK分析器。IntelliJ IDEA适用于服务器端Java。Eclipse ADT已过时,不受谷歌支持。Android Studio还提供通过内置转换器将Java代码迁移到Kotlin的工具。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。