Was ermöglichen Operatoren?
Das Rechnen und Verändern von in Variablen und Attributen gespeicherten Werten.
Welche Operatorgruppen unterstützt Java primär?
Arithmetische und logische Operatoren (sowie Vergleichsoperatoren).
Wie wird bei einer arithmetischen Operation mit zwei unterschiedlichen Zahlentypen der Ergebnistyp bestimmt?
Durch den Operanden mit dem größten Wertebereich (z. B. int + long = long).
int + long = long
++
Erhöht eine Variable um 1. int a = 3; a++; → a = 4.
int a = 3; a++;
+ bei Zahlen
Addition. int c=3, d=5; e = c+d; → e = 8.
int c=3, d=5; e = c+d;
(minus)
Subtraktion. e=3; f=4; g=e-f; → g = -1.
e=3; f=4; g=e-f;
*
Multiplikation. c=3; d=c*4; → d = 12.
c=3; d=c*4;
/ bei zwei ganzen Zahlen?
Ergebnis wird abgeschnitten (nicht gerundet). h=4; i=3; j=h/i; → j = 1.
h=4; i=3; j=h/i;
/, wenn mind. ein Operand eine Fließkommazahl ist?
/
Ergebnis wird Fließkommazahl, keine Rundung. o=4; p=3.0; q=o/p; → q ≈ 1,333.
o=4; p=3.0; q=o/p;
%
Restwert der Division. k=11; l=5; m=k%l; → m = 1.
k=11; l=5; m=k%l;
Wodurch unterscheiden sich logische von arithmetischen Operatoren?
Arithmetische Operatoren berechnen Zahlen. Logische Operatoren vergleichen oder verknüpfen Wahrheitswerte. boolean (true/false).
Wofür werden logische Operatoren häufig eingesetzt?
Zur Steuerung von Kontrollstrukturen (4.4). weil sie verküpfen boolean
(7 == 7) || (2 > 5)
if ((5 < 10) && (3 > 1)) { System.out.println("Beide Bedingungen stimmen"); }
!
Negiert den Wahrheitswert. b2=false; b1=!b2; → b1 = true.
b2=false; b1=!b2;
&&
True, wenn beide Operanden true sind. b4=true; b5=true; b3=b4&&b5; → b3 = true.
b4=true; b5=true; b3=b4&&b5;
l l
True, wenn mind. ein Operand true ist. b7=false; b8=true; b6=b7||b8; → b6 = true.
b7=false; b8=true; b6=b7||b8;
^ (XOR)
True, wenn genau ein Operand true ist. b10=false; b11=true; b9=b10^b11; → b9 = true.
b10=false; b11=true; b9=b10^b11;
Was liefern Vergleichsoperatoren immer als Ergebnistyp?
boolean weil sie boolean erzeugen
boolean
7 == 3 // false
if (5 < 10) { System.out.println("Wird ausgeführt"); }
== bei primitiven Datentypen, Beispiel?
==
True, wenn die Werte gleich sind. z1=3; z2=3; e1=z1==z2; → e1 = true.
z1=3; z2=3; e1=z1==z2;
== bei Referenzdatentypen?
True, wenn beide Operanden dieselbe Referenz (dasselbe Objekt) enthalten – nicht der Objektinhalt wird verglichen.
! = bei primitiven Datentypen,
! =
True, wenn Werte ungleich sind. z3=4; z4=3; e3=z3!=z4; → e3 = true.
z3=4; z4=3; e3=z3!=z4;
! = bei Referenzdatentypen?
True, wenn beide Operanden unterschiedliche Referenzen enthalten.
<, <=, >, >= – worauf anwendbar?
<
<=
>
>=
Ganze Zahlen und Fließkommazahlen; vergleichen, ob linker Operand kleiner/kleiner-gleich/größer/größer-gleich dem rechten ist.
instanceof
True, wenn der Datentyp des linken Operanden dem rechts angegebenen Typ entspricht. k1=new Kunde(); e7=k1 instanceof Kunde; → e7 = true.
k1=new Kunde(); e7=k1 instanceof Kunde;
Was bestimmt bei ==/!=, wie verglichen wird?
!=
Der Datentyp der Operanden (primitiv vs. Referenz) – der Vergleich funktioniert grundsätzlich unterschiedlich.
Wie wird bei primitiven Datentypen verglichen?
Direkt die Werte der Operanden.
Wird bei Referenzdatentypen mit == der Objektinhalt verglichen?
Nein, nur ob beide Operanden auf dasselbe Objekt zeigen.
k3=new Kunde(); k4=new Kunde(); k3==k4 Ergebnis und Grund
false – zwei separate new-Aufrufe erzeugen zwei unterschiedliche Objekte, auch bei gleichen Attributwerten.
false
new
k3=new Kunde(); k4=k3; k3==k4 → Ergebnis und Grund?
k3=new Kunde(); k4=k3; k3==k4
true – k4 erhält dieselbe Referenz wie k3, beide zeigen auf dasselbe Objekt.
true
Was ist String-Konkatenation, welcher Operator?
Verketten mehrerer Zeichenketten zu einer neuen, mit dem +-Operator (anwendbar auf String).
+
String
s1="Hallo"; s2=" "; s3="Welt!"; s4=s1+s2+s3; → Ergebnis?
s1="Hallo"; s2=" "; s3="Welt!"; s4=s1+s2+s3;
"Hallo Welt!"
Warum liefert == bei zwei inhaltlich identischen, aber separat erzeugten Objekten false?
Weil == bei Referenzdatentypen nur die Speicherreferenz vergleicht, nicht den Objektinhalt. Zwei unabhängig mit newerzeugte Objekte sind immer unterschiedliche Objekte im Speicher, selbst bei identischen Attributwerten.
Warum kann das Abschneiden statt Runden bei / mit ganzen Zahlen zu Fehlern führen?
Ein Ergebnis wie 4/3 wird in Java als 1 (nicht 1,33 oder gerundet 1) berechnet. Erwartet ein Entwickler eine automatische Rundung, entstehen dadurch leicht unbemerkte Rechenfehler – Abhilfe schafft z. B. die Verwendung eines Fließkomma-Operanden.
4/3
1
1,33
Warum sind logische und Vergleichsoperatoren die Grundlage für Kontrollstrukturen (4.4)?
Kontrollstrukturen wie if oder while benötigen eine Bedingung, die zu true/false ausgewertet wird, um zu entscheiden, ob ein Codeblock ausgeführt wird – genau das liefern logische und Vergleichsoperatoren.
if
while
kunde1 und kunde2 sind beide mit new Kunde() erzeugt und haben identische Attributwerte (z. B. beide Name = "Meier"). Was liefert kunde1 == kunde2, und wie könnte man stattdessen auf inhaltliche Gleichheit prüfen?
kunde1
kunde2
new Kunde()
kunde1 == kunde2
kunde1 == kunde2 liefert false, da es sich um zwei unterschiedliche Objekte im Speicher handelt. Um die Attributwerte inhaltlich zu vergleichen, müsste man explizit die einzelnen Attribute vergleichen (z. B. kunde1.getName().equals(kunde2.getName())) oder eine passende equals()-Methode nutzen (Details dazu folgen in späteren Lernzyklen).
kunde1.getName().equals(kunde2.getName())
equals()
Erklären Sie den Unterschied zwischen dem Vergleich primitiver Datentypen und Referenzdatentypen mit ==, und veranschaulichen Sie dies an einem Beispiel.
Bei primitiven Datentypen vergleicht == direkt die Werte der Operanden – z. B. liefert int z1=3; int z2=3; z1==z2true, da beide denselben Wert haben. Bei Referenzdatentypen (Objekten) vergleicht == dagegen nicht den Inhalt, sondern nur, ob beide Operanden dieselbe Speicherreferenz enthalten, also auf dasselbe Objekt zeigen. Werden z. B. zwei Kunde-Objekte separat mit new Kunde() erzeugt (k3 und k4), liefert k3==k4 false, obwohl beide Objekte identische Attributwerte haben könnten – es sind zwei unterschiedliche Objekte im Speicher. Wird dagegen k4 = k3 zugewiesen, erhält k4 dieselbe Referenz wie k3, und k3==k4 liefert true.
int z1=3; int z2=3; z1==z2true
k3
k4
k3==k4
k4 = k3
Zuletzt geändertvor einem Tag