Java ist eine objektorientierte Programmiersprache, die über ein Jahrzehnt lang die Hauptsprache des Android SDK war. Trotz der offiziellen Umstellung von Google auf Kotlin bleibt Java ein wichtiger Teil des Ökosystems: Legacy-Projekte, Unternehmensanwendungen und Millionen von Codezeilen im Google Play laufen weiterhin auf Java. Laut dem JetBrains Developer Ecosystem Report (2025) verwenden etwa 35% der Android-Projekte immer noch Java. Lesen Sie mehr über aktuelle Trends im offiziellen JetBrains-Bericht.
Wichtige Erkenntnisse
Java ist eine allgemeine Programmiersprache, die von Sun Microsystems im Jahr 1995 entwickelt wurde. Das Hauptprinzip lautet "Write Once, Run Anywhere": kompilierter Java-Bytecode läuft auf jeder Plattform, auf der die virtuelle Maschine JVM installiert ist. Im Kontext der mobilen Entwicklung wurde Java die erste offizielle Sprache des Android SDK, das von Google im Jahr 2008 veröffentlicht wurde.
Die Java-Architektur basiert auf drei Komponenten: JDK (Java Development Kit) — eine Reihe von Entwicklerwerkzeugen, JRE (Java Runtime Environment) — die Laufzeitumgebung und JVM (Java Virtual Machine) — die virtuelle Maschine. Android verwendet seine eigene JVM-Implementierung — Android Runtime (ART), die Dalvik in Version 5.0 (Lollipop) ersetzte. ART führt DEX-Bytecode aus, der über das Dienstprogramm dx/d8 aus Java-Bytecode kompiliert wird.
Ein Hauptmerkmal von Java ist die automatische Speicherverwaltung durch den Garbage Collector (GC). Der Entwickler muss Speicher nicht explizit freigeben — der GC verfolgt ungenutzte Objekte und entfernt sie. In Android ART werden Concurrent Mark Sweep (CMS) und Generational GC verwendet, optimiert für die begrenzten Ressourcen mobiler Geräte. Dies entlastet den Entwickler, kann aber während der Garbage Collection im UI-Thread zu "Lags" führen.
Android unterstützt eine Teilmenge der Java API, die mit jeder neuen OS-Version erweitert wird. Android 12 (API 31) fügte Unterstützung für Java 11 hinzu, einschließlich Lambda-Variablen-Capture, JPMS-Modulsystem und HTTP-Client java.net.http. Android 14 (API 34) führte experimentelle Unterstützung für Java 17 durch D8/R8-Desugaring ein — einige Funktionen (Records, Sealed Classes) werden in kompatiblen Code für ältere Versionen übersetzt.
| Java-Version | Android API (min) | Android-Version | Wichtige Funktionen |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | Lambdas, Stream API, Optional |
| Java 11 | API 31 | 12 | HTTP Client, Local-Variable Syntax |
| Java 17 | API 34 | 14 | Records, Sealed Classes (D8) |
Das Android SDK enthält den Java-Compiler, das dex-Dienstprogramm (d8), aapt (Asset Packaging Tool), Emulator und Bibliotheken android.* und java.*. Der Entwickler schreibt Code in Java, kompiliert ihn in .class-Dateien (JVM-Bytecode), dann konvertiert d8 sie in .dex-Dateien (Dalvik Executable), die zusammen mit Ressourcen und AndroidManifest.xml in APK verpackt werden.
Gradle ist das Build-System für Android-Projekte. Die Datei build.gradle (Groovy) oder build.gradle.kts (Kotlin DSL) beschreibt Abhängigkeiten, SDK-Versionen, Flavors und Signaturen. Android Gradle Plugin (AGP) Version 8.x automatisiert Desugar — die Übersetzung moderner Java-Funktionen in abwärtskompatiblen Code. Beispielsweise wird java.time.LocalDate ohne Änderungen im Quellcode des Entwicklers in API 21+ kompatiblen Code umgewandelt.
// Einfache Android Activity in 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!");
}
// Methode zur Behandlung von Button-Klicks
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("Button clicked");
}
}Die Klasse MainActivity erweitert AppCompatActivity — eine Basisklasse aus AndroidX für Abwärtskompatibilität. Die Methode onCreate wird beim Erstellen der Activity aufgerufen; darin wird das Layout über setContentView festgelegt. findViewById verbindet eine Java-Variable mit einem Element aus dem XML-Layout. Die Methode onButtonClick ist über das Attribut android:onClick in XML an den Button gebunden.
Der Activity-Lebenszyklus in Java ist eine Abfolge von Callbacks: onCreate → onStart → onResume (aktiv), onPause → onStop → onDestroy (Beendigung). Der Entwickler überschreibt diese Methoden zur Ressourcenverwaltung. onCreate — Initialisierung, onPause — Daten speichern, onDestroy — Ressourcen freigeben. Android ruft diese Methoden bei Bildschirmdrehung, Wechsel in den Hintergrund und bei Telefonanrufen auf.
// Activity-Lebenszyklus mit Zustandsverwaltung
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) {
// Daten nach Identifikator laden
}
}Die Methode onSaveInstanceState speichert den Zustand der Activity bei Bildschirmdrehung oder Aufgabenwechsel. Bundle enthält Schlüssel-Wert-Paare — einfache Typen, Parcelable- oder Serializable-Objekte. onRestoreInstanceState stellt den gespeicherten Zustand wieder her. Dieses Muster ist kritisch für Android, da das System die Activity bei Speichermangel zerstören und bei Rückkehr des Benutzers wiederherstellen kann.
Die Java-Syntax ist C-ähnlich, stark typisiert, objektorientiert. Jede .java-Datei enthält eine öffentliche Klasse, deren Name mit dem Dateinamen übereinstimmt. Java unterstützt keine Funktionen außerhalb von Klassen — alles ist eine Methode. Der Einstiegspunkt ist die statische Methode public static void main(String[] args) für Konsolenanwendungen oder die Android Activity-Lebenszyklusmethoden für Mobilgeräte.
Java unterteilt Typen in primitive (int, double, boolean, char, byte, short, long, float) und Referenztypen (Klassen, Interfaces, Arrays, enum). Primitive werden auf dem Stack gespeichert und als Wert übergeben. Objekte befinden sich im Heap und werden als Referenz übergeben. Autoboxing konvertiert automatisch einen primitiven Typ in ein Wrapper-Objekt (Integer, Double, Boolean), erzeugt aber zusätzliche Objekte — in Android ist dies kritisch für die UI-Leistung.
// Beispiele für Java-Datentypen und -Strukturen
public class DataTypes {
// Primitive
int count = 42;
double price = 19.99;
boolean isActive = true;
char grade = 'A';
// Referenztypen
String name = "Android";
Integer boxed = 100; // autoboxing
List<String> items = new ArrayList<>();
// Methode mit Generics
public <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}
// Enum für festen Wertesatz
public enum Status {
PENDING, LOADING, SUCCESS, ERROR
}
}Generics List<T> bieten Typsicherheit für Sammlungen. Die Methode getFirst gibt ein Element beliebigen Typs zurück — der spezifische Typ wird an der Aufrufstelle bestimmt. Enum Status wird in eine Klasse mit einem festen Satz von Konstanten kompiliert, jede Instanz ist ein Singleton. In Android wird Enum aufgrund des Speicherverbrauchs seltener verwendet: ProGuard/R8 optimiert Enum wo möglich in int-Konstanten.
Der Vergleich von Java und Kotlin für die Android-Entwicklung ist seit 2019 eines der Hauptthemen, als Google Kotlin zur Prioritätssprache erklärte. Kotlin ist vollständig mit Java kompatibel — beide kompilieren zu JVM-Bytecode, können sich gegenseitig aufrufen und dieselben Bibliotheken verwenden. Die Ansätze zum Schreiben von Code unterscheiden sich jedoch drastisch.
Kotlin beseitigt die Ausführlichkeit von Java: data class ersetzt 50+ Zeilen einer Java-Klasse mit Gettern, Settern, equals, hashCode, toString und copy. Null-Sicherheit ist in Kotlins Typsystem eingebaut — NullPointerException ist praktisch unmöglich. Erweiterungsfunktionen ermöglichen das Hinzufügen von Methoden zu bestehenden Klassen ohne Vererbung. Smart Casts konvertieren Typen automatisch nach einer Prüfung.
| Aspekt | Java | Kotlin |
|---|---|---|
| Null-Sicherheit | @Nullable / @NonNull Annotationen | String? / String — eingebaut |
| Data class | 50+ Zeilen mit Lombok | data class User(val name: String) |
| Erweiterung | Statische Dienstprogrammklassen | fun String.isEmail(): Boolean |
| Coroutinen | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| Lambdas | FunctionalInterface + ::method | Lambdas standardmäßig |
| DI-Annotationen | @Inject, @Module, @Provides | Ähnlich, aber weniger Code |
In Bezug auf die Leistung sind Java und Kotlin identisch — beide kompilieren zu JVM-Bytecode, den Android ART gleichermaßen ausführt. Der Unterschied liegt in der APK-Größe: Kotlin fügt ~200-400 KB für die kotlin-stdlib-Bibliothek hinzu. Java-Projekte haben aufgrund des fehlenden zusätzlichen Runtimes eine kleinere APK-Größe, aber bei Verwendung von Java Stream API und Optional kann die APK-Größe durch Desugaring zunehmen.
Die Java-Entwicklerwerkzeuge für Android umfassen Android Studio, Gradle, Profiler und Emulator. Android Studio ist die offizielle IDE, basierend auf IntelliJ IDEA Community, mit einem Java-Autovervollständigungs-Editor, Code-Analyzer (lint), Refactoring und einem visuellen Layout-Editor (Layout Editor).
Android Gradle Plugin (AGP) Version 8.x verwaltet den Build: Java-Kompilierung in Klassen, Desugaring, ProGuard/R8-Minifizierung, Verpackung in APK/AAB. R8 ist ein aktualisierter Desugarer und Obfuscator, der ProGuard ersetzt. Build-Varianten (debug/release + product flavors) werden über build.gradle konfiguriert. Gradle Daemon beschleunigt nachfolgende Builds durch Caching.
// build.gradle (app) — Konfiguration des Java-Moduls
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'
}Der compileOptions-Block gibt die Java-Version für die Kompilierung an — Java 17 ist mit AGP 8.x verfügbar. Die minimale SDK (minSdk) bestimmt die minimale Android-Version, auf der die Anwendung läuft. Target SDK ist die Version, für die die Anwendung getestet wurde. Der Unterschied zwischen compileSdk und targetSdk: compileSdk ist die API für die Kompilierung, targetSdk ist das Laufzeitverhalten.
Die Einschränkungen von Java in Android führten zur Umstellung von Google auf Kotlin. NullPointerException ist die häufigste Ausnahme in Java-Android-Anwendungen, da das Typsystem nicht zwischen nullable und non-null Referenzen unterscheidet. Google empfiehlt die Annotationen @Nullable und @NonNull aus dem Paket androidx.annotation, aber der Compiler prüft sie nicht — nur lint tut dies.
Das Fehlen von Coroutinen ist eine weitere Einschränkung: Asynchrone Operationen in Java erfordern Callbacks, AsyncTask (veraltet seit API 30), ExecutorService oder RxJava. Dies führt zu Callback-Hell und Speicherlecks bei Bildschirmdrehung. Kotlin-Coroutinen mit Structured Concurrency lösen dieses Problem auf Sprachebene: Eine Coroutine wird bei Zerstörung der Activity ohne manuelle Verwaltung abgebrochen.
Boilerplate-Code in Java ist eine Fehlerquelle beim manuellen Schreiben von equals/hashCode, Parcelable-Implementierungen und ViewHolder für RecyclerView. Die Android KTX-Bibliotheken und Jetpack Compose sind auf Kotlin ausgerichtet. Neue Android-APIs (Room, Navigation, Compose) veröffentlichen Beispiele standardmäßig in Kotlin, obwohl Java-Versionen existieren.
Häufig gestellte Fragen
Java ist eine objektorientierte Programmiersprache von Sun Microsystems (1995), die auf der virtuellen Maschine JVM läuft. Sie war bis 2019 die Hauptsprache des Android SDK. Sie wird in der mobilen Entwicklung für Legacy-Projekte, serverseitige (Spring) und Unternehmensanwendungen verwendet. Sie zeichnet sich durch starke Typisierung, automatische Speicherbereinigung und Plattformunabhängigkeit des Bytecodes aus.
Google erklärte Kotlin 2019 zur Prioritätssprache für Android. Neue AndroidX-Bibliotheken, Jetpack Compose, Architekturempfehlungen und Dokumentation werden standardmäßig in Kotlin bereitgestellt. Java bleibt vollständig unterstützt, aber APIs werden mit einem Kotlin-First-Ansatz entwickelt. Java-Projekte benötigen mehr Boilerplate-Code und erhalten neue Sprachfunktionen nicht zuerst.
Android unterstützt Java 8 vollständig, Java 11 teilweise seit Android 12+, und Java 17 experimentell durch D8-Desugaring. Android Gradle Plugin (AGP) 8.x übersetzt modernen Bytecode über Desugar in kompatiblen Code für ältere APIs. Der Entwickler kann in Java 11+ schreiben, Lambdas, Optional und DateTime API verwenden, aber Records und Sealed Classes sind nur über D8 verfügbar.
Kotlin benötigt weniger Code: data class ersetzt Dutzende Zeilen Java-Boilerplate, Null-Sicherheit ist in Typen eingebaut, Coroutinen vereinfachen Asynchronität. Java bietet eine einfachere Syntax für Anfänger, ein bewährtes Bibliotheks-Ökosystem und stabile Werkzeuge. Die Laufzeitleistung ist identisch — beide kompilieren zu JVM-Bytecode, der von Android ART ausgeführt wird.
Android Studio ist die Standard-IDE für die Android-Entwicklung mit Unterstützung für Java und Kotlin. Es enthält Emulator, Profiler (CPU, Speicher, Netzwerk), Layout Inspector, APK Analyzer. IntelliJ IDEA eignet sich für serverseitiges Java. Eclipse ADT ist veraltet und wird von Google nicht unterstützt. Android Studio bietet auch Werkzeuge zur Migration von Java-Code zu Kotlin über den integrierten Konverter.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch