Inhaltsverzeichnis
LernJ vs. Java: Unterschiede
Die Programmiersprache auf dieser Website ist eine Teilmenge von Java, die in folgenden kleinen Bereichen etwas vereinfacht wurde:
1. System.out.print -> print
Statt System.out.print
und System.out.println
kann auch einfach print
bzw. println
geschrieben werden. Es ist zudem möglich, als zweiten Parameter eine Textfarbe anzugeben, z.B. println(„Roter Text“, Color.red)
.
2. Hauptprogramm
In Java befindet sich das „Hauptprogramm“ einer Anwendung (also die Anweisungen, die zu Beginn gestartet werden) in einer statischen main-Methode mit der Signatur public static void main(String[] args)
. Das kürzeste Hello-World-Programm sieht in Java also so aus:
class Beispiel { public static void main(String[] args){ // Hier beginnen die Anweisungen des Hauptprogramms: System.out.println("Hallo Welt!"); } }
In LearnJ ist dies ebenso möglich. Darüber hinaus fasst LearnJ auch alle Anweisungen, die außerhalb einer Klassendefinition stehen, als Hauptprogramm auf. Dadurch lassen sich auf sehr einfache Weise kurze Programmbeispiele schreiben. Das obige Hello-World-Programm sieht in LearnJ also so aus:
3. Vergleich zweier String-Werte
In Java bewirkt der Vergleichsoperator ==
bei Zeichenketten (Strings) den Vergleich der Objekte, nicht den Vergleich der Zeichenketten. Das folgende Programm etwa gibt „Die Strings sind ungleich!“ aus, da s1
und s2
nicht auf das selbe Objekt zeigen:
String s1 = "Test"; String s2 = "Tes"; s2 = s2 + "t"; if(s1 == s2){ System.out.println("Die Strings sind gleich!"); } else { System.out.println("Die Strings sind ungleich!"); }
Will man in Java zwei Zeichenketten vergleichen, so muss man die equals
-Methode verwenden, also if(s1.equals(s2)){…
.
Die Programmiersprache dieser Website unterscheidet sich von Java dahingehend, dass der Vergleichsoperator ==
bei Strings nicht die Gleichheit der Objekte prüft, sondern einen Zeichenkettenvergleich durchführt. Das obige Programm gibt also „Die Strings sind gleich!“ aus. Natürlich gibt es in der Programmiersprache dieser Seite auch die Methode equals
. Sie liefert exakt das selbe Resultat wie der Vergleichsoperator ==
.
4. Keine Pflicht zur Erstellung eines Konstruktors
Erbt eine Klasse von einer anderen Klasse, die keinen parameterlosen Konstruktor besitzt, so muss sie gemäß Java Specification einen eigenen Konstruktor haben. In der Online-IDE gibt es diese Pflicht nicht, so dass folgendes geht:
new MyRectangle(10, 10, 100, 100); // direkter Zugriff auf den Konstruktor der Oberklasse Rectangle möglich class MyRectangle extends Rectangle { }
5. Standard Library
Derzeit sind Nachbildungen folgender Klassen aus der Java Standard Library vorhanden:
- die Klasse
Math
, - die Klasse
String
, - eine vereinfachte Version der Klasse
Timer
und des InterfacesRunnable
, - eine vereinfachte Version der Klasse
System
, - die Klasse
LocalDateTime
, - ein großer Teil des Collection-Frameworks von Java, insbesondere die Klassen und Interfaces
Iterable
Collection
Map
,HashMap
List
,ArrayList
,LinkedList
Set
,HashSet
Stack
- die Klassen
Boolean
,Integer
,Character
,Float
undDouble
LearnJ besitzt über die Java Standard Library-Klassen hinaus aber viele weitere Klassen, z.B.
- die Klasse
Input
zum Einlesen von Tastatur-Benutzereingaben, - die Klasse
Sound
zur Ausgabe von Tönen und Sound-Stücken, - die Klasse
PApplet
, die die einen Großteil der Processing-Library enthält, - die Klasse
Vector2
mit Methoden zur 2D-Vektorrechnung, - die Klassen
WebSocket
undWebSocketClient
zur Programmierung von Chat-Programmen, Netzwerkspielen u.ä. - sowie eine eingebaute umfangreiche Grafikbibliothek, die die Programmierung einfacher Spiele möglich macht (Klassen
World
,Circle
,Ellipse
,Rectangle
,Polygon
,Triangle
,Sprite
,Turtle
,Text
,Bitmap
,Group
,Gamepad
usw.)
Links:
Hier ein einfaches Beispiel zur Verwendung der Grafikklassen
LearnJ: Sprachumfang/Features
Hier eine grobe Übersicht über den vorhandenen Sprachumfang von LearnJ und die Features der Online-Entwicklungsumgebung:
Klassen
class
,enum
,interface
extends
,implements
- abstrakte Klassen
static
Attribute und Methodenprivate
,public
,protected
Attribute und Methoden- Überladen von Methoden, Überschreiben von Attributen und Methoden
- Konstruktoren (auch
private
Konstruktoren beienums
) final
Attribute- casten (implizit und explizit)
Strukturanweisungen
for(…;…;…)
,while()
,do
…while()
,break
,continue
- Vereinfachte
for
-Schleife bei Iterables und Arrays (for(var a: list){…}
) if
…then
…else
switch
…case
…default
…break
mitchar
,String
,int
undenum
-Konstanten
Datentypen
- primitive Datentypen
int
,double
,char
,boolean
,float
- Sonderrolle von
String
als primitiver Datentyp und Klasse array
(auch mehrdimensional und als Array-Konstanten)- implicit casting und explicit casting (mit cast-operator)
- lokale Variablen und Parameter können als
final
deklariert werden. - Generics, z.B.
class Liste<K> { … }
- Das Schlüsselwort
var
aus Java 11 (local variable type inference) zur Deklarationen von initialisierten Variablen ohne explizite Typangabe,
z.B.:var i = 10;
odervar liste = new ArrayList<Integer>();
- Instanzierung von Generics ohne Angabe der Typen in '<>', z.B.
ArrayList<Integer> liste = new ArrayList<>();
Operatoren
+
,-
,*
,/
,&&
,||
,!
,%
Editor
- Verwendet wird der Monaco-Editor von Visual Studio Code. Viele der darin möglichen Editor-Kommandos und Shortcuts sind auch in den Editor-Bereichen dieser Webseite möglich.
- Syntax-Highlighting
- markiert alle Positionen, an denen die Variable/die Methode/der Typ vorkommt, auf der der Cursor steht
- springt zur Definition eines Symbols (Strg + click)
- Auto-Format während der Eingabe (immer nach Enter oder mit Alt + Shift + f)
- Codeverfollständigung
- Refactor-Rename (F2)
- Laufendes Compilieren während der Eingabe mit Anzeige der Fehler
- Parameter hints (Strg + Shift + Leertaste)
- Show References (Shift + F12)
Debugger
- Zeigt alle Variablen im aktuellen Scope
- Auswertung von Termen (watch)
- Zeigt den Variableninhalt beim Mouseover im Editor
- Auswertung von Termen durch Markieren mit der Maus im Editor
- Step into, Step over, Step out
- Breakpoints
Console
- Code completion (mit Strg + Leertaste)
- Parameter hints (mit Strg + Shift + Leertaste)
- Auswertung beliebiger Terme
- Ausführen von Statements
- Während des Debuggings: Zugriff auf die Variablen im aktuellen Scope des gerade ausgeführten Programms
- Edit History (mit Pfeil nach oben/unten)