|
193 | 193 |
|
194 | 194 | ### Klassenmethode mit Objekt aufgerufen |
195 | 195 |
|
196 | | - Klassenmethoden und Klassenattribute werden mit dem Schlüsselwort "static" gekennzeichnet. Klassenmethoden können weder auf Objektattribute zugreifen, noch Objektmethoden aufrufen. Da Klassenmethoden also nicht auf Objekte ihrer Klasse zugreifen dürfen, müssen sie auch nicht mit einem Objekt aufgerufen werden. |
197 | | - Klassenmethoden sollten immer mit dem Klassenamen aufgerufen werden. Hier ein Beispiel: |
| 196 | + Klassenmethoden und Klassenattribute werden mit dem Schlüsselwort "static" gekennzeichnet. Klassenmethoden können weder auf Objektattribute zugreifen, noch Objektmethoden aufrufen. Da Klassenmethoden also nicht auf Objekte ihrer Klasse zugreifen dürfen, müssen sie auch nicht mit einem Objekt aufgerufen werden. |
| 197 | + Klassenmethoden sollten immer mit dem Klassenamen aufgerufen werden. Hier ein Beispiel: |
198 | 198 |
|
199 | 199 | ```` java linenums="1" |
200 | 200 | public class Car { |
|
224 | 224 |
|
225 | 225 | Bei Zeile 4 in Main wird einem Folgendes angezeigt: |
226 | 226 | ```` |
227 | | - Static member 'Car.getNumberOfWheels()' accessed via instance reference |
| 227 | + Static member 'Car.getNumberOfWheels()' accessed via instance reference |
228 | 228 | ```` |
229 | 229 | Es ist zwar möglich, eine Klassenmethode mit einem Objekt der Klasse aufzurufen, aber eher unschöne Programmierpraxis. Normalerweise ruft man sie einfach mit dem Namen der Klasse auf. |
230 | 230 |
|
231 | 231 | Beim Kompilieren des oben stehenden Codes bekommt erhält man außerdem diese Fehlermeldung: |
232 | 232 | ```` |
233 | 233 | non-static method getColor() cannot be referenced from a static context |
234 | 234 | ```` |
235 | | - Die Objektmethode getColor() gibt normalerweise den Wert des Objektattributs color zurück. Wird sie nun nicht mit einem Objekt, sondern mit dem Klassennamen aufgerufen, kann sie nicht auf color zugreifen: es existiert kein Objekt, dessen color-Wert sie auslesen kann. |
| 235 | + Die Objektmethode getColor() gibt normalerweise den Wert des Objektattributs color zurück. Wird sie nun nicht mit einem Objekt, sondern mit dem Klassennamen aufgerufen, kann sie nicht auf color zugreifen: es existiert kein Objekt, dessen color-Wert sie auslesen kann. |
236 | 236 | Objektmethoden können nur mit Objekten aufgerufen werden. |
237 | 237 |
|
238 | 238 | Mehr zu Klassenmethoden kann im Foliensatz 4c) auf den Seiten 34-50 gefunden werden. |
239 | | - |
| 239 | + |
240 | 240 |
|
241 | 241 | ### isBooleanExpression == false |
242 | 242 |
|
243 | 243 | In der Bedingung einer if-Verzweigung, der Fortsetzungsbedingung einer while-Schleife und an anderen Stellen verwendet man boolesche Ausdrücke. Diese können zu true oder zu false auswerten. Außer man verwendet keinen booleschen Ausdruck, denn dann kompiliert der Code nicht. |
244 | 244 |
|
245 | | - Was sind also alles boolesche Ausdrücke und was nicht? |
246 | | - Die booleschen Werte true und false sind die einfachsten booleschen Ausdrücke. Diese können z.B. mit dem logischen Oder (||) bzw. dem logischen Und (&&) oder der Negation (!) zu komplizierteren Ausdrücken kombiniert werden. Vergleiche von Zahlen mit ==, <, >=, != etc. funktionieren auch. |
| 245 | + Was sind also alles boolesche Ausdrücke und was nicht? |
| 246 | + Die booleschen Werte true und false sind die einfachsten booleschen Ausdrücke. Diese können z.B. mit dem logischen Oder (||) bzw. dem logischen Und (&&) oder der Negation (!) zu komplizierteren Ausdrücken kombiniert werden. Vergleiche von Zahlen mit ==, <, >=, != etc. funktionieren auch. |
247 | 247 |
|
248 | | - Was sind häufig verwendete, aber inkorrekte Ausdrücke? |
249 | | - Oft wird beim Vergleich von z.B. zwei Zahlen nur ein = verwendet, gemeint ist meist der Vergleich mit ==. |
250 | | - Methoden, die keinen boolean zurückgeben eignen sich nicht direkt, außer man nutzt die Rückgabe und z.B. die equals-Methode, um einen booleschen Ausdruck zu erzeugen. |
| 248 | + Was sind häufig verwendete, aber inkorrekte Ausdrücke? |
| 249 | + Oft wird beim Vergleich von z.B. zwei Zahlen nur ein = verwendet, gemeint ist meist der Vergleich mit ==. |
| 250 | + Methoden, die keinen boolean zurückgeben eignen sich nicht direkt, außer man nutzt die Rückgabe und z.B. die equals-Methode, um einen booleschen Ausdruck zu erzeugen. |
251 | 251 | Nicht ganz falsch, aber etwas unnötig, ist es, einen boolean mit true oder false zu vergleichen: isOdd(5)==true ist semantisch äquivalent zu isOdd(5). Auch isEven(4) == false kann einfach zu !isEven(4) vereinfacht werden. |
252 | 252 |
|
253 | 253 | Auch hier nochmal ein paar Beispiele: |
|
262 | 262 |
|
263 | 263 | boolean b = false; |
264 | 264 | if (b = true){ |
265 | | - System.out.println("b is true"); |
| 265 | + System.out.println("b is true"); |
266 | 266 | } |
267 | 267 | //"b is true" wird ausgegeben, da der Zuweisungsoperator den zugewiesenen Wert zurückgibt |
268 | 268 |
|
269 | 269 | boolean c = false; |
270 | 270 | if (c == true){ |
271 | | - System.out.println("c is true"); |
| 271 | + System.out.println("c is true"); |
272 | 272 | } |
273 | 273 | //"c is true" wird nicht ausgegeben, da false==true zu false auswertet |
274 | 274 |
|
275 | | - boolean b = myCar.getColor(); |
| 275 | + boolean b = myCar.getColor(); |
276 | 276 | //falsch, da getColor eine Farbe und keinen boolean zurückgibt |
277 | 277 |
|
278 | | - boolean c = myCar.getColor().equals(Color.green); |
| 278 | + boolean c = myCar.getColor().equals(Color.green); |
279 | 279 | //korrekt, die equals Methode vergleicht die beiden Farben und gibt einen boolean zurück |
280 | 280 | ```` |
281 | 281 |
|
|
284 | 284 | Bei der Verwendung von generischen Klassen und Interfaces muss man die Typparameter instanziieren. |
285 | 285 | Das geschieht bei der Einrichtung von Objekten: hier müssen die Typparameter festgelegt werden. |
286 | 286 |
|
287 | | - Hier ein Beispiel anhand des generischen Interfaces java.util.List<E\>: |
| 287 | + Hier ein Beispiel anhand des generischen Interfaces java.util.List<E\>: |
288 | 288 | List ist mit dem Typparameter E parameterisiert (s. Doku von [List]), welcher den Typen der Elemente angibt. Zuerst die inkorrekte Verwendung von List, mit den Warnungen von Intellij als Kommentar. In Zeilen vier bis sechs sieht man die korrekte Verwendung. |
289 | 289 |
|
290 | 290 | ```` java linenums="1" |
291 | | - List list = new ArrayList<>(); //Raw use of parameterized class 'List' |
| 291 | + List list = new ArrayList<>(); //Raw use of parameterized class 'List' |
292 | 292 | list.add(myCar); //Unchecked call to 'add(E)' as a member of raw type 'java.util.List' |
293 | | - |
294 | | - List<Car> cars = new ArrayList<>(); |
| 293 | + |
| 294 | + List<Car> cars = new ArrayList<>(); |
295 | 295 | // bei der Einrichtung der Liste wurde ihr Typparameter mit Car instanziiert |
296 | 296 | cars.add(myCar); |
297 | 297 | ```` |
298 | | - Auf der rechten Seite der Zuweisung kann man, wie im Beispiel, die abkürzende Schreibweise des "Diamond-Operators" verwenden. Hierbei werden die spitzen Klammern hingeschrieben, aber der Typparameter nicht erneut (s. Foliensatz 06 Generics S.66f). |
| 298 | + Auf der rechten Seite der Zuweisung kann man, wie im Beispiel, die abkürzende Schreibweise des "Diamond-Operators" verwenden. Hierbei werden die spitzen Klammern hingeschrieben, aber der Typparameter nicht erneut (s. Foliensatz 06 Generics S.66f). |
299 | 299 | Auf der linken Seite muss der Typparameter aber explizit angegeben werden! |
300 | 300 |
|
301 | 301 | Falls Sie also die Warnung "Raw use of parameterized class" bekommen, sollten Sie den Typparameter der generischen Klasse instanziieren, indem Sie nach dem Klassen-/ Interfacenamen in spitzen Klammern die zu verwendende Klasse schreiben. |
|
380 | 380 |
|
381 | 381 | === "Technische Fehler" |
382 | 382 |
|
383 | | - * Stellen Sie zunächst sicher, dass Sie den richtigen Ordner importiert haben. Der oberste Ordner sollte nach der Hausübung benannt sein (z. B. **"FOP-2223-HXX-Student-master"** bzw. **"PX-Student-master"**) und direkt die build.gradle.kts Datei enthalten sein. Wählen Sie beim Importieren **nicht** einen identisch benannten Oberordner aus. |
| 383 | + * Stellen Sie zunächst sicher, dass Sie den richtigen Ordner importiert haben. Der oberste Ordner sollte nach der Hausübung benannt sein (z. B. **"FOP-2223-HXX-Student-master"**) und direkt die build.gradle.kts Datei enthalten sein. Wählen Sie beim Importieren **nicht** einen identisch benannten Oberordner aus. |
384 | 384 | * Beachten Sie, dass es mit Gradle zu Problemen kommen kann, wenn das Projekt auf einer externen Festplatte gespeichert wurde. |
385 | 385 | * Anbei finden Sie ein paar mögliche Fehler, welche Ihnen in der Konsole, die sich beim Ausführen der des Programmes oder einer Gradle Task automatisch öffnet, angezeigt werden. Damit Ihnen die vollständigen Fehlermeldungen angezeigt werden, wählen Sie links von der Konsole die zweite Option von oben aus. |
386 | 386 |
|
|
397 | 397 |
|
398 | 398 | 2. !!! error "" |
399 | 399 | ``` |
400 | | - A problem occurred configuring root project ... |
| 400 | + A problem occurred configuring root project 'FOP-2223-H00-Student'. |
401 | 401 | Could not resolve all files for configuration ':classpath'. |
402 | 402 | Could not resolve org.tudalgo:algomate:0.1.0-SNAPSHOT. |
403 | 403 | ``` |
|
520 | 520 | [Typische Programmierfehler]: /exercises/fix-errors/#typische-programmierfehler |
521 | 521 | [Bevor Sie eine Sprechstunde besuchen]: /support/good-bad-questions |
522 | 522 | [Debugging]: /exercises/fix-errors/#debugging |
523 | | -[List]: https://docs.oracle.com/javase/8/docs/api/java/util/List.html |
| 523 | +[List]: https://docs.oracle.com/javase/8/docs/api/java/util/List.html |
0 commit comments