Kann mir bitte mal jemand diese Codes erklären?

JL51

Aktives Mitglied
Hallo zusammen,

zwei zusammenhängende Codes sollen einen Kreis bewegen. Diese Codes stammen aus einem Java-Kurs, wo zwar auch erklärt wird, wie das aufgebaut ist, aber ich kappiere das trotzdem nicht. Letztlich wird der Kreis nur dadurch bewegt, indem der Methode bewege() konkrete Werte zugewiesen werden, ja wozu denn dann erst dieser Umstand mit deltaX und deltaY? Inwiefern dann überhaupt die Variablen x und y verändert werden, nichtmal das kappiere ich. Bitte nicht lustig machen, ich habe schon viel mit PureBasic programmiert und meine Programme haben auch Anklang bei anderen gefunden. Mich würde auch echt mal interessieren, wozu überhaupt so ein Korsett mit Klassen, Konstruktoren und Objekten gut sein soll. Ich habe sowas bisher noch nie gebraucht. Danke für Erklärungen.

Java:
public class Kreis extends Object
{
	int x;//Mittelpunt-x
	int y;//Mittelpunkt-y
	int radius;
	double flaeche;
	double umfang;
	final double PI = 3.14159;
	
	public Kreis(int xParam, int yParam, int radiusParam)//Konstruktormethode
	{
		x = xParam;
		y = yParam;
		radius = radiusParam;
		flaeche = radius * radius * PI;
		umfang = 2 * radius * PI;
	}
	public void bewege(int deltaX, int deltaY)
	{
		x += deltaX;
		y += deltaY;
	}		
}

Java:
public class KreisTest extends Object
{
	public static void main (String[] args)
	{
		Kreis kreis = new Kreis(100,100,50);
		System.out.println("vor Bewege-Aufruf: x = " + kreis.x + ", y = " + kreis.y);
		kreis.bewege(30, -30);
		System.out.println("nach Bewege-Aufruf: x = " + kreis.x + ", y = " + kreis.y);
	}
}
 
Du erstellst Klassen und damit Konstruktoren, damit du Objekte von dieser Klasse erstellen kannst. Das bringt dir vor allem Übersichtlichkeit. Außerdem ist die Programmiersprache Java objektorientiert aufgebaut. Dadurch ist es ziemlich angebracht und einfach mit Objekten zu arbeiten.
 
x und y stellen die Position deines Kreises dar.
Die bewege Methode macht nichts anderes, als die x-Position um deltaX und die y-Position um deltaY zu ändern.
Diese beide Differenzen deltaX und deltaY werden der bewege Methode übergeben.
 
@JL51

Eines der Grundprinzipien der Objektorientierung ist Kapselung, d.h. unter anderem, dass man ähnliche Verhaltensweise und Eigenschaften zu einer Einheit/Modul zusammenfasst. Das sind die Klassen.

Nehmen wir mal deine Kreis-Klasse als Beispiel. Wenn du in irgendeiner anderen Klasse auf diese Werte zugreifen möchtest, überreichst du einfach ein Kreisobjekt und hast damit alle Werte beisammen und kannst direkt darauf zugreifen
Java:
class AndereKlasse{

	public void machWas(Kreis kreis){
		int a = kreis.radius;
	}
	
	public void machWas(int radius, double volumen, int x, int ){
		...
	}
	
	public void machWas(string[]params){
		...
	}
}

Ohne das Objekt Kreis müsste ich die Werte entweder einzeln übergeben und bekomme damit wenns doof läuft ziemlich lange Parameter-Liste, oder ich benutze Arrays. Aber damit habe ich noch viel weniger Sicherheit, ob der Wert an einem bestimmten Index auch wirklich der ist, den ich haben möchte.

Außerdem kannst du dir 100% sicher sein, dass sich jedes Kreis-Objekt immer gleich Verhalten wird, da alle eine gemeinsame Implementierung ihrer Verhaltensweisen teilen.

Ein weiterer Vorteil ist die Vererbung. Ich kann gemeinsame/ähnliche Verhaltensweisen in einer Oberklasse zusammenfassen und für Spezialisierungen davon erbende Kindklassen erstellen. Die Kindklasse verfügt über alle Eigenschaften der Oberklasse, plus noch die innerhalb der Kindklasse definierten Dinge.



P.S.: Die Klassen von Object erben zu lassen ist überflüssig, solange du keine zusätzlichen Verhaltensweisen implementierst.
Jede Instanz einer Klasse ist automatisch ein Objekt.
 
Danke lord239123! Jetzt habe ich das verstanden. Im zweiten Code werden also die Werte an deltaX und deltaY zugewiesen. Aber wozu sind dann die Param-Werte? Danke für weitere Info.
 
Die Param-Werte legen die Startposition des Kreises fest.

EDIT:
Bei deinem Beispiel ist die Startposition des Kreises 100,100 .
Danach wird der Kreis auf die Position 130, 70 bewegt (deltaX = 30, deltaY = -30).
 
Zuletzt bearbeitet:
Alles klar, auch hier dann also wieder Werte-Zuweisung im zweiten Code. Dann hätte doch aber der Code auch ohne Param-Werte auskommen können, indem gleich x, y und radius in den Konstruktor geschrieben worden wäre, aber so kann dann in weiteren Objekten mehr Flexibilität geschaffen werden, was weitere Variablen angeht, die die Param-Werte übernehmen können. Sehe ich das richtig? Danke nochmals, auch an Saheeda!

P.S.: Ich muß erstmal zur Arbeit, bis später.
 
Zuletzt bearbeitet:
Nochmals hallo zusammen

nachdem ich vorhin gedacht hatte, den Methoden-Aufruf verstanden zu haben, ist es jetzt wiederum nicht der Fall, denn wozu ist in der Zeile, wo das new drin ist, das Element kreis? In Java ist es ja zweierlei, ob man etwas klein oder groß schreibt.

Java kann von mir aus Vorteile haben, die andere Programmiersprachen nicht haben, aber wenn man dafür dann erstmal total verquertes Denken lernen muß, um diese Vorteile haben zu können, ist Java für mich einfach nur wie eine Wand. Aber ganz aufgeben will ich noch nicht.
 
Die Syntax sieht so aus:
$Typ $Name = $Wert

Das erste Kreis ist die Typbezeichnung, also ein Objekt der Klasse Kreis. Das zweite kreis ist der Variablenname. Du kannst dort auch "schnitzel" schreiben, wenn dir das besser gefällt ;-)
 
Zuletzt bearbeitet:
Danke. Der obige Code ist ja noch überschaubar, aber auch da geht es ja schon los, sich merken oder aufschreiben zu müssen, daß zur Methode bewege() deltaX und deltaY gehören. Nicht auszudenken, wie das wird, wenn viele Objekte im Code sind. Und dann immer die Hin- und Herschalterei zwischen den zwei Codes. Wie konnte sich so ein Verfahren bloß durchsetzen?
 
Alle objektorientierten/modernen Sprachen sind ähnlich aufgebaut wie Java.
Aus diesem Grund hast du keine großen Alternativen, wenn du Objektorientierung nicht verstehst. Am besten liest du dir mal ein Buch oder Tutorial durch.
 
Tutorials habe ich mir schon angesehen im Internet, aber ich kann da machen, was ich will, da schaltet sich bei mir alles innerlich auf Durchzug, begleitet von echter Übelkeit. Ich sehe keinerlei Sinn in OOP, welche den Code saukompliziert macht und in 1000 Stücke reißt, nur um eine Hand voll Vorteile haben zu können. Aber diese Sichtweise muß ja wohl nun nicht gleich das Aus für mich bedeuten, was Java angeht. Man kann ja damit sicherlich auch lange Codes in herkömmlicher Art und Weise schreiben. Wenn ich programmieren einfach mal mit malen vergleiche, dann möchte ich eben einfach malen anstatt höchsteffizient meinen Malkasten einzurichten.
 
Das macht allerdings wenig Sinn und ist nur begrenzt möglich.
Schon bei einer simplen Konsolenausgabe arbeitest du unbewusst mit dem statischen Objekt out in der Klasse System.
Wenn man sich nicht irgendwann ein Buch durchließt, wird man den Sinn der Objektorientierung vermutlich nicht verstehen.

Hier mal ein Beispiel:
Du möchtest eine Methode schreiben, die geometrische Objekte zeichnen kann. Diese Methode brauchst du für ein Spiel, in dem du vermutlich mehrere Tausend geometrische Objekte zeichnen musst. Da macht es natürlich wenig Sinn, alle Werte parrallel in einer Klasse ohne Objekte zu speichern.
Alle Geometrys haben eine Position point, eine Größe dimension und eine Farbe color, mit der sie gezeichnet werden.
Außerdem möchtest du für jeden dieser Werte Getter und Setter(Methoden zum Erhalten oder Ändern der Werte) erstellen, damit nicht irgendwelche beliebigen Werte genommen werden können. Z.B. darf die Position nicht außerhalb eines 1000 * 1000 Pixel großen Spielfeldes sein.
Im Konstruktor weist du deinen Objektvariablen Startwerte zu.

Außerdem soll sich ein Geometry animiert bewegen können.

Java:
class Geometry{
    private Point point;
	private Dimension dimension;
	private Color color;
	
	//Konstruktor
	public Geometry(Point p, Dimension d, Color c) {
		this.p = p;
		this.d = d;
		this.c = c;
	}
	
	
	//Getter und Setter
	public Color getC() {
		return c;
	}

	public Point getP() {
		return p;
	}

	public Dimension getD() {
		return d;
	}

	public void setP(Point p) {
		if(p.x<=1000 && p.x>=0 && p.y<=1000 && p.y>= 0)
			this.p = p;
	}

	public void setD(Dimension d) {
		this.d = d;
	}

	public void setC(Color c) {
		this.c = c;
	}

        //animierte Bewegung
	public void bewege(Point deltaPoint){
		//Code zum Bewegen des Geometrys
	}
}

So könnte jetzt deine Klasse Geometry aussehen.
Jetzt möchtest du in deinem Spiel aber nicht irgendein Geometry haben, sondern du möchtest einen Kreis, ein Rechteck und ein Dreieck benutzen.

Java:
class Kreis extends Geometry
{
	@Override
	public void bewege(Point deltaPoint){
		//Code zum Bewegen des Kreises
	}
}
Java:
class Dreieck extends Geometry
{

}
Java:
class Rechteck extends Geometry
{

}

Jede dieser Klassen besitzt alle Objekte und Methoden der Klasse Geometry.
In einem echten Spiel würden diese Objekte vermutlich noch eine Methode paint erhalten, damit sie unterschiedlich gezeichnet werden können.
Dreieck und Rechteck bewegen sich gleich, aber der Kreis hat die bewege-Methode überschrieben.

Von diesen Klassen, die du auch in anderen Programmen wiederverwenden kannst, kannst du jetzt ganz einfach Objekte erzeugen, die alle gleich aufgebaut sind und doch unterschiedliche Eigenschaften besitzen.
 
Zuletzt bearbeitet:
Ich sehe keinerlei Sinn in OOP, welche den Code saukompliziert macht und in 1000 Stücke reißt, nur um eine Hand voll Vorteile haben zu können.

Ein großer Vorteil von OOP ist eben, dass dein Code wiederverwendbar geschrieben wird. Heißt du schreibst einmal den Code und kannst ihn in deinen anderen Projekten ebenfalls nutzen, ohne ihn anzufassen (zumindest, wenn du OOP richtig verwendest). Weiterhin ist es sehr leicht, Code der OOP geschrieben worden ist weiter zu entwickeln und zu warten. Diese beiden, in der heutigen Zeit sehr wichtigen Vorteile bieten Programmiersprachen wie z.B. Basic oder C wo Prozedual entwickelt wird nicht (zumindest nicht so gut wie in OOP).
Unser Lehrer sagte immer, dass ohne die OOP beispielsweise die größeren Videospiele von heute gar nicht möglich wären bzw. es ewig dauern würde bis ein neues Videospiel fertiggestellt wird.
 
Zuletzt bearbeitet:
Danke, das leuchtet mir ein. Gibt es denn evtl. eine Sammlung von Code-Beispielen für Anfänger, aus denen man lernen kann? Total bei null stehe ich jetzt nicht mehr und wäre als nächstes wie gesagt an einer Beispielsammlung von einfachen Java-Codes interssiert, die ich testen, ausdrucken und in aller Ruhe studieren kann. Für Tipps wäre ich wirklich sehr dankbar.
 
Zuletzt bearbeitet:
Danke, das leuchtet mir ein. Gibt es denn evtl. eine Sammlung von Code-Beispielen für Anfänger, aus denen man lernen kann? Bestimmt hätte ich meinen Java-Lehrkurs nicht so schnell geschmissen und alles wieder zurück geschickt, wenn da mal erklärt worden wäre, daß die beiden Codes, die ich oben vorgestellt hatte, nicht jeweils nur einmal durchlaufen werden, sondern zwangsläufig jeweils zweimal und erst dann wird das ganze nämlich entzaubert. Total bei null stehe ich jetzt nicht mehr und wäre als nächstes wie gesagt an einer Beispielsammlung von einfachen Java-Codes interssiert, die ich testen, ausdrucken und in aller Ruhe studieren kann. Für Tipps wäre ich wirklich sehr dankbar.

Also ich habe Java mit folgendem Buch gelernt. Es ist sehr einfach und gut zu verstehen.

Java von Kopf bis Fuß: Amazon.de: Kathy Sierra, Bert Bates: Bücher
 
Auf das Buch war ich auch schon gestoßen, Danke, aber ich habe eben auch noch kein einziges Buch zu dem Thema gefunden, wo nicht auch sehr schlechte Meinungen dazu auftauchen. Bevor ich Geld ausgebe, suche ich erstmal weiter im Internet.
 
Zuletzt bearbeitet:
Auf das Buch war ich auch schon gestoßen, Danke, aber ich habe eben auch noch kein einziges Buch zu dem Thema gefunden, wo nicht auch sehr schlechte Meinungen dazu auftauchen. Bevor ich Geld ausgebe, suche ich erstmal weiter im Internet.

Dann wäre das vielleicht eine Alternative für dich:
Rheinwerk Computing :: Java ist auch eine Insel - index
Allerdings finde ich persönlich, dass es nicht so gut verständlich ist wie das Buch. :noe:
Aber kannst es dir ja mal angucken.
 
Danke tfasse und Saheeda. @Saheeda: Genau auf das Buch bin ich eben auch gerade im Internet gestoßen. Das ist das erste Java-Lern-Buch, zu dem ich ausschließlich sehr lobende Bewertungen gelesen habe und nun fahre ich erstmal zur Buchhandlung.
 

Zurück
Oben