Primitive Datentypen

In diesem Modul lernst du die primitiven Datentypen in Java kennen – also Werte wie Zahlen, Zeichen oder Wahrheitswerte.

Ziele

  • Ich kenne die primitiven Datentypen in Java: boolean, byte, short, int, long, double, float, char.
  • Ich weiss, wie ich primitive Datentypen (formatiert) auf der Konsole ausgeben kann.
⏱️ Geschätzte Lesezeit: 30 Minuten

Primitive Datentypen

Bei primitiven Datentypen wird der Wert direkt in der Variable gespeichert. Wird die Variable gelöscht, verschwindet auch ihr Inhalt. Du erkennst primitive Datentypen daran, dass sie klein geschrieben werden. Ein String ist daher kein primitiver Datentyp.

Die primitiven Datentypen sind:

  • byte (Ganzzahl)
  • short (Ganzzahl)
  • int (Ganzzahl)
  • long (Ganzzahl)
  • float (Kommazahl)
  • double (Kommazahl)
  • boolean (true oder false)
  • char (ein einzelnes Zeichen)

Integrale Datentypen

Integrale Datentypen speichern ganze Zahlen ohne Nachkommastellen. Sie unterscheiden sich im Speicherbedarf:

DatentypSpeicherbedarfBereich
byte8 Bit-128 bis 127
short16 Bit-32_768 bis 32_767
int32 Bit-2_147_483_648 bis 2_147_483_647 (-2³¹ bis 2³¹−1)
long64 Bit-2⁶³ bis 2⁶³−1

Zur besseren Lesbarkeit darfst du Unterstriche (_) innerhalb von Zahlen verwenden (sogenannte Underscores):

1
2
int count = 0;
int million = 1_000_000;

Gleitkomma-Datentypen

Gleitkommazahlen enthalten Nachkommastellen, sind aber nicht exakt – es können Rundungsfehler auftreten.

DatentypSpeicherbedarfBereichDarstellung
float32 Bit±1.4E−45 bis ±3.4E+38Gleitkommazahl (32 Bit)
double64 Bit±4.9E−324 bis ±1.7E+308Gleitkommazahl (64 Bit)

Beispiele:

1
2
3
float radius = 8.5f;
double area = 16.48739d;
double pi = 3.141592653589793;

Beachte: float-Werte benötigen das Suffix f.

it-ninja warning
Für exakte Berechnungen (z. B. Geldbeträge) verwende BigDecimal.

Warum BigDecimal statt double?

Der Typ double speichert Gleitkommazahlen im Binärformat. Viele Dezimalzahlen wie 0.1 oder 0.2 lassen sich im Binärsystem nicht exakt darstellen – ähnlich wie 1/3 in Dezimal als 0.333... unendlich lang ist.

Das führt zu kleinen Rundungsfehlern, die unter anderem in Finanzanwendungen problematisch sind.

Beispiel:

1
2
3
double x = 0.1;
double y = 0.2;
System.out.println(x + y); // gives 0.30000000000000004

Auch wenn das nach wenig aussieht: Bei vielen Transaktionen oder Rundungen summieren sich diese Fehler.

Die Lösung: BigDecimal

BigDecimal speichert Zahlen exakt als Dezimalwerte und bietet:

  • Exakte Rechengenauigkeit
  • Kontrollierte Rundung
  • Präzise Ausgabe
1
2
3
4
5
6
7
import java.math.BigDecimal;

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b);

System.out.println(result); // gives 0.3
it-ninja tip

Übergib Werte mit Nachkommastellen immer als String (new BigDecimal("0.1")), sonst übernimmst du den ungenauen double-Wert.

Ganzzahlen kannst Du direkt übergeben (new BigDecimal(22)).

Zeichen-Datentyp

Ein char steht für genau ein Zeichen: Buchstabe, Zahl oder Symbol.

DatentypSpeicherbedarfBereich
char16 BitUnicode-Zeichen gemäss UTF-16
1
2
3
char letter = 'a';
char point = '.';
letter++; // gives 'b'
it-ninja info

Warum ergibt letter++ im Beispiel oben den Buchstaben 'b'?

Ein Computer kennt keine Zeichen, sondern nur Zahlen. Auch ein char wird intern als 16-Bit-Zahlenwert gespeichert.
Java verwendet für Zeichen die Unicode-Codierung nach UTF-16. In der Unicode-Tabelle ist genau definiert,
welche Zahl welchem Zeichen entspricht. Ein char deckt dabei die Zeichen aus der Basic Multilingual Plane (BMP) ab.

Wenn man nun letter++ schreibt (das ist das gleiche wie letter = letter + 1), wird der Zahlenwert um eins erhöht.
Dadurch ergibt sich automatisch das nächste Zeichen in der Unicode-Tabelle: Aus 'a' wird 'b', aus '9' wird ':', usw.

→ Zur !Unicode-Tabelle

Darum wird aus '3' + 7 nicht 10 sondern 58 -> ':' (Java zeigt auch keinen Fehler, da char auch als Zahl gespeichert wird).

Initialisierungsmöglichkeiten:

BeschreibungBeispiel
Zeichen in einfachen Anführungszeichenchar a = 'A';
Unicode-Zahl (Dezimal, Oktal, Hexadezimal)char a = 65;
Unicode-Schreibweise \uXXXX (vierstellige Hex-Zahl)char a = '\u0041';

Zeichen vs. Zahlen vs. Strings

  • 123 ist eine Zahl (int), "123" ein String
  • 'A' ist ein Zeichen (char), "A" ein String
  • '1' ist ein Zeichen (char), 1 eine Zahl

Logischer Datentyp

Ein boolean kann nur zwei Zustände annehmen:

  • true (wahr)
  • false (falsch)

Beispiel:

1
2
3
4
5
6
boolean done = false;
boolean isBigger = true;

if (done) {
  System.out.println("You're done");
}

Der if-Block mit System.out.println("You're done"); wird nur ausgeführt, wenn done den Wert true hat. Du wirst in kürze mehr dazu erfahren, was es mit dem if auf sich hat.


Ausgabe von Datentypen

Um Werte auf der Konsole auszugeben, hast du bisher System.out.println(...) verwendet. Das funktioniert auch mit allen primitiven Datentypen:

1
2
3
4
5
6
7
int number = 42;
double temperature = 36.6;
boolean isDone = true;

System.out.println(number);       // Output: 42
System.out.println(temperature);  // Output: 36.6
System.out.println(isDone);       // Output: true

Formatierte Ausgabe mit printf

Wenn du mehr Kontrolle über die Ausgabe haben möchtest – z. B. nur 2 Nachkommastellen bei einem double –, verwendest du System.out.printf(...).

1
2
3
double value = 3.14159265;

System.out.printf("Wert auf 2 Stellen: %.2f%n", value); // Gibt: Wert auf 2 Stellen: 3.14

Als ersten Parameter übergibst du einen String mit dem Text und Platzhaltern, welche dann durch die nachfolgenden Parameter ersetzt werden sollen.

Wichtige Platzhalter bei printf
PlatzhalterBedeutungBeispielausgabe
%dGanzzahl (int, long, …)42
%fGleitkommazahl (float, double)3.14
%.2fGleitkommazahl mit 2 Nachkommastellen3.14
%cZeichen (char)A
%bWahrheitswert (boolean)true
%sStringHallo
%nNeue Zeile (plattformunabhängig)
Weitere Optionen bei den Platzhaltern
FormatBedeutungBeispiel
%5dZahl mit mindestens 5 Stellen (rechtsbündig)42
%-5dZahl mit mindestens 5 Stellen (linksbündig)42
%05dMit Nullen auffüllen00042
%,dTausender-Trennzeichen (je nach Locale)1,000,000
%10.2fGleitkommazahl: mind. 10 Stellen, 2 Nachkommastellen123.45
%010.2fGleitkommazahl, mind. 10 Stellen mit führenden Nullen0000123.45

Beispiel: Alle Typen formatiert ausgeben

1
2
3
4
5
6
7
8
9
int count = 12;
double price = 5.6789;
char symbol = 'Z';
boolean isActive = true;

System.out.printf("Zahl: %d%n", count);
System.out.printf("Preis: %.2f CHF%n", price);
System.out.printf("Zeichen: %c%n", symbol);
System.out.printf("Status: %b%n", isActive);

Ausgabe:

1
2
3
4
Zahl: 12
Preis: 5.68 CHF
Zeichen: Z
Status: true

Es können beliebig viele Platzhalter definiert werden.

1
2
3
4
int count = 12;
double price = 5.6789;

System.out.printf("%d Artikel kosten %.2f CHF%n", count, price);

Ausgabe:

1
12 Artikel kosten 5.68 CHF
it-ninja tip
Wenn du printf verwendest, wird nichts automatisch umgebrochen. Du musst \n oder %n selbst angeben, damit der Text in einer neuen Zeile weitergeht.
it-ninja warning

Java zeigt nur eine Warnung, aber keinen Fehler, wenn:

  • mehr Platzhalter als Variablen angegeben sind,
  • eine Variable nicht in das gewünschte Format umgewandelt werden kann.

Solche Warnungen sollten nicht ignoriert werden – sie können zur Laufzeit zu unerwartetem Verhalten oder Fehlern führen.


it-ninja video
Lernvideo

Wenn du dir die Erklärung noch mit einem Video anschauen möchtest, empfehlen wir dir dieses Video.


task Jetzt bist du dran. Löse bitte die folgende !*Aufgabe in den Labs.