Java:その言語の特徴とAndroid開発とは

著者: IT Sectr 公開日: 2026-02-10 読了時間: 11 分

Javaは、10年以上にわたってAndroid SDKの主要言語であったオブジェクト指向プログラミング言語です。Googleが正式にKotlinへ移行したにもかかわらず、Javaはエコシステムの重要な部分であり続けています。レガシープロジェクト、エンタープライズアプリケーション、Google Playの数百万行のコードは今もJavaで動作しています。JetBrains Developer Ecosystemレポート(2025年)によると、約35%のAndroidプロジェクトが依然としてJavaを使用しています。最新のトレンドについては、JetBrains公式レポートをご覧ください。

重要なポイント

  • Java — 2019年までAndroidの主要言語、レガシーコードはプロジェクトの約35%を占める
  • JVM — Javaバイトコードのクロスプラットフォームを保証する仮想マシン
  • Android SDK — コンパイラ、エミュレータ、プロファイラを含む完全なツールセット
  • Kotlin — Javaの後継だが、両言語とも同じJVMバイトコードにコンパイルされる
  • Gradle — Androidプロジェクトの依存関係と構成を管理するビルドシステム

Javaとは?

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スレッドでのガベージコレクション中に「ラグ」が発生する可能性があります。

JavaのバージョンとAndroid API

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 7API 194.4 KitKattry-with-resources, multi-catch
Java 8API 247.0 Nougatラムダ, Stream API, Optional
Java 11API 3112HTTP Client, Local-Variable Syntax
Java 17API 3414Records, Sealed Classes (D8)

Java SDKとAndroid開発

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
// 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属性を介してボタンにバインドされています。

Activityとライフサイクルの操作

JavaでのActivityライフサイクルはコールバックのシーケンスです:onCreate → onStart → onResume(アクティブ)、onPause → onStop → onDestroy(終了)。開発者はリソースを管理するためにこれらのメソッドをオーバーライドします。onCreate — 初期化、onPause — データ保存、onDestroy — リソース解放。Androidは画面の回転、バックグラウンドへの移動、電話の着信時にこれらのメソッドを呼び出します。

java
// 状態管理付き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の構文:クラス、メソッド、型

Javaの構文はCライクで、厳密に型付けされ、オブジェクト指向です。各.javaファイルには1つのpublicクラスが含まれ、その名前はファイル名と一致します。Javaはクラス外の関数をサポートしていません—すべてがメソッドです。エントリポイントは、コンソールアプリケーションの場合は静的メソッドpublic static void main(String[] args)、モバイルの場合はAndroid Activityのライフサイクルメソッドです。

Javaのデータ型

Javaは型をプリミティブ(int, double, boolean, char, byte, short, long, float)と参照型(クラス、インターフェース、配列、enum)に分類します。プリミティブはスタックに格納され、値で渡されます。オブジェクトはヒープに格納され、参照で渡されます。オートボクシングはプリミティブを自動的にラッパーオブジェクト(Integer, Double, Boolean)に変換しますが、余分なオブジェクトを作成します—AndroidではUIパフォーマンスにとって重要です。

java
// 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 vs Kotlin:Androidでの比較

Android開発におけるJavaとKotlinの比較は、GoogleがKotlinを優先言語と宣言した2019年以来、主要なトピックの1つです。KotlinはJavaと完全に互換性があります—両方ともJVMバイトコードにコンパイルされ、相互に呼び出し可能で、同じライブラリを使用できます。ただし、コードの記述方法は大きく異なります。

ボイラープレートコード

KotlinはJavaの冗長性を排除します:data classはゲッター、セッター、equals、hashCode、toString、copyを含むJavaクラスの50行以上を置き換えます。Null安全性はKotlinの型システムに組み込まれています—NullPointerExceptionは実質的に不可能です。拡張関数を使用すると、継承なしで既存のクラスにメソッドを追加できます。スマートキャストはチェック後に自動的に型を変換します。

側面JavaKotlin
Null安全性@Nullable / @NonNull アノテーションString? / String — 組み込み
データクラスLombokで50行以上data class User(val name: String)
拡張静的ユーティリティクラスfun String.isEmail(): Boolean
コルーチンAsyncTask / ExecutorServicesuspend + 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向けの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はキャッシングにより後続のビルドを高速化します。

groovy
// 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での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とは?

Javaは、Sun Microsystems(1995年)のオブジェクト指向プログラミング言語で、JVM仮想マシン上で動作します。2019年まではAndroid SDKの主要言語でした。モバイル開発では、レガシープロジェクト、サーバーサイド(Spring)、エンタープライズアプリケーションに使用されています。厳格な型付け、自動ガベージコレクション、バイトコードのクロスプラットフォームが特徴です。

なぜJavaはAndroidのレガシー言語と見なされるのですか?

Googleは2019年にKotlinをAndroidの優先言語と宣言しました。新しいAndroidXライブラリ、Jetpack Compose、アーキテクチャの推奨事項、ドキュメントはデフォルトでKotlinで提供されています。Javaは完全にサポートされ続けていますが、APIはKotlinファーストのアプローチで設計されています。Javaプロジェクトはより多くのボイラープレートコードを必要とし、新しい言語機能を最初に受け取ることはありません。

Androidではどのバージョンの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を介してのみ利用可能です。

JavaとKotlinの違いは何ですか?

Kotlinはより少ないコードで済みます:data classはJavaのボイラープレートの数十行を置き換え、null安全性は型に組み込まれ、コルーチンは非同期処理を簡素化します。Javaは初心者にとってよりシンプルな構文、実績のあるライブラリエコシステム、安定したツールチェーンを提供します。ランタイムパフォーマンスは同じです—両方ともAndroid ARTで実行されるJVMバイトコードにコンパイルされます。

Android向けJava開発にはどのIDEが使用されますか?

Android Studioは、JavaとKotlinをサポートするAndroid開発の標準IDEです。エミュレータ、プロファイラ(CPU、メモリ、ネットワーク)、Layout Inspector、APK Analyzerが含まれています。IntelliJ IDEAはサーバーサイドJavaに適しています。Eclipse ADTは非推奨で、Googleはサポートしていません。Android Studioは、組み込みコンバーターを介してJavaコードをKotlinに移行するツールも提供しています。

まとめ

  • Java — オブジェクト指向言語、11年間Android SDKの主要言語
  • JVMバイトコードはd8を介してDEXに変換され、GCを備えたAndroid Runtime(ART)で実行される
  • AndroidはJava 8-17をサポート、下位互換性のためにD8/R8によるデシュガリング対応
  • Java Activity — ライフサイクルを持つ基本コンポーネント:onCreate → onStart → onResume → onPause → onStop → onDestroy
  • Gradle — Java 17、AGP 8.x、ビルドバリアントをサポートするビルドシステム
  • Kotlin — 同じバイトコードを持つJavaの後継、モダンな構文とnull安全性
  • JavaレガシーはAndroidプロジェクトの約35%を占め、Googleは両方の言語をサポート継続

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください