Referenz
Ein Nachschlagewerk für alles, was du in diesem Lernpfad brauchst.
Aufbau eines Programms
void main() {
IO.println("Hier beginnt das Programm.");
}
int verdopple(int pZahl) {
return pZahl * 2;
}
Das Hauptprogramm heißt main, steht in Main.java und braucht keine Klasse. Hilfsmethoden stehen daneben – ebenfalls ohne static.
In Büchern und im Netz findest du meist die ältere, ausführlichere Schreibweise:
public class HalloWelt {
public static void main(String[] args) {
System.out.println("Hallo Welt!");
}
}
Sie bedeutet dasselbe und funktioniert auch hier. In diesem Lernpfad benutzen wir durchgängig die kurze Form.
Ein- und Ausgabe
| Anweisung | Wirkung |
|---|---|
IO.println(x) |
gibt x aus und macht einen Zeilenumbruch |
IO.print(x) |
gibt x aus, ohne Zeilenumbruch |
IO.println() |
nur ein Zeilenumbruch |
IO.readln("Frage") |
zeigt die Frage an, liefert die Eingabe als String |
Integer.parseInt(text) |
wandelt einen String in einen int um |
Double.parseDouble(text) |
wandelt einen String in einen double um |
Einen Scanner gibt es in dieser Umgebung nicht. Alle Eingaben laufen über IO.readln.
Datentypen
| Typ | speichert | Beispiel |
|---|---|---|
int |
ganze Zahlen | 42, -7 |
double |
Kommazahlen | 3.5, -0.75 |
boolean |
Wahrheitswerte | true, false |
char |
ein Zeichen | 'A' |
String |
Zeichenketten (Objekttyp) | "Hallo" |
Typumwandlung: (double) zahl in die eine, (int) kommazahl in die andere Richtung. Der Cast nach int schneidet ab, er rundet nicht.
Operatoren
| Operator | Bedeutung |
|---|---|
+ - * / |
Grundrechenarten. Bei zwei int-Werten ist / eine Ganzzahldivision |
% |
Rest der Ganzzahldivision |
== != < > <= >= |
Vergleiche |
&& || ! |
und, oder, nicht |
+= -= *= /= |
Kurzformen für Zuweisungen |
++ -- |
um eins erhöhen bzw. verringern |
Rangfolge bei der Logik: erst !, dann &&, dann ||. Bei && und || gilt die Kurzschlussauswertung: Der rechte Teil wird nur ausgewertet, wenn er noch etwas ändern kann.
Kontrollstrukturen
if (bedingung) { ... } else if (andere) { ... } else { ... }
switch (wert) {
case 1: ...; break;
default: ...;
}
while (bedingung) { ... }
do { ... } while (bedingung);
for (int i = 0; i < n; i++) { ... }
for (String s : feld) { ... }
Zeichenketten
| Methode | liefert |
|---|---|
wort.length() |
Anzahl der Zeichen |
wort.charAt(i) |
Zeichen an Position i |
wort.substring(a, b) |
Teil von a bis vor b |
wort.substring(a) |
alles ab a |
wort.indexOf(teil) |
Position des ersten Vorkommens, sonst -1 |
wort.equals(anderes) |
true bei gleichem Inhalt |
wort.toUpperCase() / toLowerCase() |
in Groß- bzw. Kleinbuchstaben |
Zeichenketten vergleicht man immer mit equals. Das Zeichen == prüft bei Objekten, ob es sich um dasselbe Objekt handelt – die einzige sinnvolle Verwendung ist if (x == null).
Felder
int[] werte = new int[5]; // fünf Plätze, alle 0
int[] werte = {5, 2, 4, 1, 8}; // Kurzform
werte[0] = 7; // schreiben
int x = werte[0]; // lesen
int n = werte.length; // Anzahl, ohne Klammern
Der erste Index ist 0, der letzte length - 1.
Die drei Grundmuster:
// Summieren
int summe = 0;
for (int i = 0; i < werte.length; i++) {
summe = summe + werte[i];
}
// Extremwert
int groesstes = werte[0];
for (int i = 1; i < werte.length; i++) {
if (werte[i] > groesstes) { groesstes = werte[i]; }
}
// Zählen
int anzahl = 0;
for (int i = 0; i < werte.length; i++) {
if (werte[i] >= 10) { anzahl++; }
}
Mathematik
| Aufruf | liefert |
|---|---|
Math.abs(x) |
Betrag |
Math.sqrt(x) |
Quadratwurzel |
Math.pow(a, b) |
a hoch b |
Math.max(a, b) / Math.min(a, b) |
größerer bzw. kleinerer Wert |
Math.round(x) |
kaufmännisch gerundet, liefert einen int |
Math.floor(x) / Math.ceil(x) |
ab- bzw. aufgerundet |
Math.sin(x) / Math.cos(x) |
Winkelfunktionen, Winkel im Bogenmaß |
Math.PI |
Kreiszahl |
Math.random() |
Zufallszahl zwischen 0 und 1 |
Random.randint(von, bis) |
ganzzahlige Zufallszahl, beide Grenzen einschließlich |
Random.randint steht nicht zur Verfügung, wenn die Scratch-Bibliothek geladen ist. Dort nimmt man this.pickRandom(von, bis) auf einem Sprite oder auf der Bühne.
Klassen
public class Auto {
private String marke; // Attribut
private int kilometerstand;
/**
* Erzeugt ein neues Auto.
* @param pMarke die Marke
* @param pKm der Kilometerstand
*/
public Auto(String pMarke, int pKm) { // Konstruktor
marke = pMarke;
kilometerstand = pKm;
}
/** Liefert den Kilometerstand. */
public int getKilometerstand() { // Getter
return kilometerstand;
}
/** Erhöht den Kilometerstand. */
public void fahre(int pKm) { // Methode
if (pKm > 0) {
kilometerstand = kilometerstand + pKm;
}
}
}
Verwendung: Auto a = new Auto("VW", 84000); a.fahre(35);
| Sichtbarkeit | Zeichen im Diagramm | sichtbar in |
|---|---|---|
private |
- |
nur der eigenen Klasse |
protected |
# |
eigener Klasse und Unterklassen |
public |
+ |
überall |
Vererbung
public class Lehrer extends Person {
private String fach;
public Lehrer(String pName, String pFach) {
super(pName); // muss die erste Anweisung sein
fach = pFach;
}
public String beschreibung() {
return super.beschreibung() + ", unterrichtet " + fach;
}
}
Satztest: Passt „ist ein“, nimm Vererbung. Passt „hat ein“, nimm eine Assoziation – also ein Attribut vom Typ der anderen Klasse.
Tests schreiben
@Test
class RechnerTest {
@Test
void testMaximum() {
Rechner r = new Rechner();
assertEquals(9, r.maximum(3, 9), "maximum(3, 9) muss 9 sein.");
assertTrue(r.istGerade(4), "4 ist gerade.");
assertFalse(r.istGerade(5), "5 ist ungerade.");
}
}
Testmethoden sind parameterlos und void. Die Klasse bekommt ebenfalls ein @Test, damit sich alle Tests gemeinsam starten lassen. Gestartet wird über den Reiter Testrunner unter dem Editor.
Scratch for Java
Die Bibliothek wird über libraries="scratch" geladen. Es gibt keine import-Zeilen.
Aufbau
void main() {
new Buehne();
}
public class Buehne extends Stage {
public Buehne() {
this.add(new Hase());
}
}
public class Hase extends Sprite {
public Hase() {
this.addCostume("bunny1_stand");
this.setPosition(0, 0);
}
public void run() { // wird etwa 60-mal pro Sekunde aufgerufen
if (this.isKeyPressed(KeyCode.RIGHT)) {
this.changeX(3);
}
}
}
Bühne
Die Bühne ist 480 × 360 Pixel groß. Der Punkt (0, 0) liegt in der Mitte, die x-Achse zeigt nach rechts, die y-Achse nach oben. Sichtbar ist also x von −240 bis 240 und y von −180 bis 180.
Methode auf Stage |
Wirkung |
|---|---|
add(sprite) / add(pen) / add(text) |
fügt etwas zur Bühne hinzu |
pickRandom(von, bis) |
ganzzahlige Zufallszahl |
find(Klasse.class) |
Liste aller Objekte dieser Art |
count(Klasse.class) |
Anzahl der Objekte dieser Art |
run() |
wird in jedem Bild aufgerufen |
Sprite
| Gruppe | Methoden |
|---|---|
| Bewegung | setPosition(x, y), changeX(d), changeY(d), move(schritte), turnRight(grad), turnLeft(grad), pointInDirection(grad), ifOnEdgeBounce(), glide(sek, x, y) |
| Aussehen | addCostume(name), switchCostume(name), nextCostume(), say(text), think(text), show(), hide(), setSize(prozent), setTint(r, g, b) |
| Fühlen | isTouchingSprite(Klasse.class), getTouchingSprite(Klasse.class), isTouchingEdge(), isKeyPressed(KeyCode.RIGHT), getMouseX(), distanceToSprite(anderes) |
| Ereignisse | run(), whenClicked(), whenKeyPressed(taste), whenAddedToStage(), whenIReceive(nachricht), broadcast(nachricht) |
| Sonstiges | getStage(), remove(), pickRandom(von, bis), getX(), getY() |
getTouchingSprite liefert null, wenn nichts berührt wird – das muss man prüfen.
Pen
Pen stift = new Pen();
this.add(stift);
stift.setColor(0, 200, 0);
stift.setSize(4);
stift.setPosition(-100, -100);
stift.down();
stift.setPosition(100, -100); // zeichnet eine Linie
stift.up();
Der Stift ist keine Turtle: Er kennt kein „vorwärts“ und kein „drehe dich“. Du gibst ihm immer die Zielkoordinaten. Weiter gibt es eraseAll(), stamp() und setTransparency(...).
Text
Text t = new Text("Punkte: 0", -220, 150, 400);
this.add(t);
t.showText("Punkte: 10");
Die vier Parameter sind Text, x, y und Breite. new Text("Hallo") mit nur einem Parameter gibt es nicht.
Achtung: x ist die Mitte des Textes, nicht sein linker Rand. Eine lange Statuszeile am linken Rand verliert deshalb ihre linke Hälfte. Für eine Zeile über die ganze Breite nimmst du new Text("...", 0, 155, 460).
Kostüme
Die Bibliothek bringt über 1700 Kostüme mit. Sie sind verschieden groß – bunny1_stand ist 120 × 201 Pixel, coin_gold nur 61 × 61. Da setSize(prozent) sich auf die Originalgröße bezieht, ergibt dieselbe Prozentzahl je nach Kostüm eine andere Pixelgröße. Die aktuelle Größe liefern getWidth() und getHeight().
Häufig gebraucht:
bunny1_stand, bunny1_jump, bunny2_stand · coin_gold, coin_silver, coin_bronze · gemBlue, gemGreen, gemRed, gemYellow · keyBlue, keyGreen, keyRed · alienBeige_stand, alienBlue_stand, alienGreen_stand · boxCrate, boxCoin, boxItem · star, cloud, carrot, flame · planeBlue1, planeRed1 · enemyBlack1 bis enemyBlack5 · fishBlue, frog, mouse, bee, slimeBlue
Die vollständige Sammlung findest du in der Dokumentation von Scratch for Java.
Tasten
KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.SPACE, KeyCode.ENTER, KeyCode.A bis KeyCode.Z, KeyCode.DIGIT_0 bis KeyCode.DIGIT_9
Was hier anders ist als im „großen“ Java
Die Online-IDE ist eine Java-ähnliche Sprache. Die wichtigsten Abweichungen:
| Schul-Java | hier |
|---|---|
Scanner |
gibt es nicht – IO.readln(...) |
Arrays.sort, Arrays.equals, Arrays.toString |
gibt es nicht – selbst schreiben |
Integer.toBinaryString |
Integer.toBinary |
Math.round liefert long |
liefert int |
import ... |
nicht nötig und nicht möglich |
public static void main(String[] args) |
funktioniert, wir nehmen aber void main() |
Wenn du später in einer richtigen Java-Entwicklungsumgebung arbeitest, fällt dir der Umstieg leicht – die Sprache ist dieselbe, nur die Bibliothek ist eine andere.