Javaは、10年以上にわたって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バイトコードは、JVM仮想マシンがインストールされている任意のプラットフォームで実行できます。モバイル開発の文脈では、Javaは2008年にGoogleがリリースしたAndroid SDKの最初の公式言語になりました。
Javaアーキテクチャは3つのコンポーネントに基づいています:JDK(Java Development Kit)— 開発者ツールセット、JRE(Java Runtime Environment)— 実行環境、JVM(Java Virtual Machine)— 仮想マシン。Androidは独自のJVM実装であるAndroid Runtime(ART)を使用しており、バージョン5.0(Lollipop)でDalvikを置き換えました。ARTはDEXバイトコードを実行し、これはdx/d8ユーティリティを介してJavaバイトコードからコンパイルされます。
Javaの重要な機能は、ガベージコレクタ(GC)による自動メモリ管理です。開発者は明示的にメモリを解放する必要はありません。GCが未使用のオブジェクトを追跡して削除します。Android ARTでは、モバイルデバイスの限られたリソースに最適化されたConcurrent Mark Sweep(CMS)およびGenerational GCが使用されています。これにより開発者の負担は軽減されますが、UIスレッドでのガベージコレクション中に「ラグ」が発生する可能性があります。
Androidは、OSの新しいバージョンごとに拡張されるJava APIのサブセットをサポートしています。Android 12(API 31)はJava 11のサポートを追加し、変数キャプチャを伴うラムダ、JPMSモジュールシステム、java.net.http HTTPクライアントが含まれます。Android 14(API 34)はD8/R8デシュガリングを介してJava 17の実験的サポートを導入しました—一部の機能(レコード、sealedクラス)は古いバージョンと互換性のあるコードに変換されます。
| Javaバージョン | Android API (min) | Androidバージョン | 主要機能 |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | ラムダ, 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バイトコード)にコンパイルし、d8がそれらを.dexファイル(Dalvik Executable)に変換し、リソースやAndroidManifest.xmlとともにAPKにパッケージ化します。
GradleはAndroidプロジェクトのビルドシステムです。build.gradle(Groovy)またはbuild.gradle.kts(Kotlin DSL)ファイルは、依存関係、SDKバージョン、フレーバー、署名を記述します。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("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メソッドは、XMLのandroid:onClick属性を介してボタンにバインドされています。
JavaでのActivityライフサイクルはコールバックのシーケンスです: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ファイルには1つのpublicクラスが含まれ、その名前はファイル名と一致します。Javaはクラス外の関数をサポートしていません—すべてがメソッドです。エントリポイントは、コンソールアプリケーションの場合は静的メソッドpublic static void main(String[] args)、モバイルの場合はAndroid Activityのライフサイクルメソッドです。
Javaは型をプリミティブ(int, double, boolean, char, byte, short, long, float)と参照型(クラス、インターフェース、配列、enum)に分類します。プリミティブはスタックに格納され、値で渡されます。オブジェクトはヒープに格納され、参照で渡されます。オートボクシングはプリミティブを自動的にラッパーオブジェクト(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定数に最適化します。
Android開発におけるJavaとKotlinの比較は、GoogleがKotlinを優先言語と宣言した2019年以来、主要なトピックの1つです。KotlinはJavaと完全に互換性があります—両方ともJVMバイトコードにコンパイルされ、相互に呼び出し可能で、同じライブラリを使用できます。ただし、コードの記述方法は大きく異なります。
KotlinはJavaの冗長性を排除します:data classはゲッター、セッター、equals、hashCode、toString、copyを含むJavaクラスの50行以上を置き換えます。Null安全性はKotlinの型システムに組み込まれています—NullPointerExceptionは実質的に不可能です。拡張関数を使用すると、継承なしで既存のクラスにメソッドを追加できます。スマートキャストはチェック後に自動的に型を変換します。
| 側面 | Java | Kotlin |
|---|---|---|
| Null安全性 | @Nullable / @NonNull アノテーション | String? / String — 組み込み |
| データクラス | Lombokで50行以上 | data class User(val name: String) |
| 拡張 | 静的ユーティリティクラス | fun String.isEmail(): Boolean |
| コルーチン | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| ラムダ | FunctionalInterface + ::method | デフォルトでラムダ |
| DIアノテーション | @Inject, @Module, @Provides | 同様だがコードが少ない |
パフォーマンスの面では、JavaとKotlinは同じです—両方ともJVMバイトコードにコンパイルされ、Android ARTが同様に実行します。違いはAPKサイズにあります:Kotlinはkotlin-stdlibライブラリに約200〜400KBを追加します。Javaプロジェクトは追加のランタイムがないためAPKサイズが小さくなりますが、Java Stream APIとOptionalを使用すると、デシュガリングによりAPKサイズが増加する可能性があります。
Android向けのJava開発者ツールには、Android Studio、Gradle、プロファイラ、エミュレータが含まれます。Android Studioは公式IDEで、IntelliJ IDEA Communityをベースとしており、Javaオートコンプリートエディタ、コードアナライザ(lint)、リファクタリング、ビジュアルレイアウトエディタ(Layout Editor)を備えています。
Android Gradle Plugin(AGP)バージョン8.xはビルドを管理します:クラスへのJavaコンパイル、デシュガリング、ProGuard/R8による縮小、APK/AABへのパッケージ化。R8は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バージョンを決定します。ターゲットSDKはアプリケーションがテストされたバージョンです。compileSdkとtargetSdkの違い:compileSdkはコンパイル用のAPI、targetSdkはランタイムの動作です。
AndroidでのJavaの制限が、GoogleのKotlinへの移行の原因となりました。NullPointerExceptionはJava Androidアプリケーションで最も一般的な例外です。型システムがnull許容参照と非null参照を区別しないためです。Googleはandroidx.annotationパッケージの@Nullableおよび@NonNullアノテーションを推奨していますが、コンパイラはこれらをチェックしません—lintのみがチェックします。
コルーチンの欠如も制限です:Javaでの非同期操作にはコールバック、AsyncTask(API 30で非推奨)、ExecutorService、またはRxJavaが必要です。これにより、コールバック地獄と画面回転時のメモリリークが発生します。Structured Concurrencyを備えたKotlinコルーチンは、言語レベルでこの問題を解決します:手動管理なしで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)、エンタープライズアプリケーションに使用されています。厳格な型付け、自動ガベージコレクション、バイトコードのクロスプラットフォームが特徴です。
Googleは2019年にKotlinをAndroidの優先言語と宣言しました。新しいAndroidXライブラリ、Jetpack Compose、アーキテクチャの推奨事項、ドキュメントはデフォルトでKotlinで提供されています。Javaは完全にサポートされ続けていますが、APIはKotlinファーストのアプローチで設計されています。Javaプロジェクトはより多くのボイラープレートコードを必要とし、新しい言語機能を最初に受け取ることはありません。
AndroidはJava 8を完全にサポートし、Java 11はAndroid 12+から部分的に、Java 17はD8デシュガリングを介して実験的にサポートしています。Android Gradle Plugin(AGP)8.xは、desugarを介して最新のバイトコードを古いAPIと互換性のあるコードに変換します。開発者はJava 11+で記述し、ラムダ、Optional、DateTime APIを使用できますが、レコードとsealedクラスはD8を介してのみ利用可能です。
Kotlinはより少ないコードで済みます:data classはJavaのボイラープレートの数十行を置き換え、null安全性は型に組み込まれ、コルーチンは非同期処理を簡素化します。Javaは初心者にとってよりシンプルな構文、実績のあるライブラリエコシステム、安定したツールチェーンを提供します。ランタイムパフォーマンスは同じです—両方ともAndroid ARTで実行されるJVMバイトコードにコンパイルされます。
Android Studioは、JavaとKotlinをサポートするAndroid開発の標準IDEです。エミュレータ、プロファイラ(CPU、メモリ、ネットワーク)、Layout Inspector、APK Analyzerが含まれています。IntelliJ IDEAはサーバーサイドJavaに適しています。Eclipse ADTは非推奨で、Googleはサポートしていません。Android Studioは、組み込みコンバーターを介してJavaコードをKotlinに移行するツールも提供しています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。