Instanzvariablen vom Typ einer Klasse definieren

Guten Tag,
ich habe mich extra für diese Frage hier angemeldet, da ich momentan einfach nicht mehr weiter weiß.
Ich habe folgende Aufgabenstellung:
Erstellen Sie die Klasse Strecke, die zwei Instanzvariablen p und q vom Typ der Klasse Point (siehe unten) definiert.
Im Konstruktor der Klasse Strecke werden Referenzen auf Objekte der Klasse Point übergeben. Definieren Sie die Zugriffsmethoden setP(...), setQ(...), getP() und getQ() für die Instanzvariablen der Klasse.
Definieren Sie zur Berechnung der Distanz zwischen den beiden Punkten p und q die Methode distanz().
Beachten Sie: Der Abstand zwischen den Koordinaten (x1,y1) und (x2,y2) ergibt sich mittels der Formel:
Quadratwurzel aus (x1-x2)2 + (y1-y2)2

Benutzen Sie die Methodenaufrufe Math.sqrt(x) und Math.pow(x,2) zur Berechnung der Quadratwurzel und zur Quadrierung.
Die Klasse Point ist wie folgt in Point.java zu codieren:
public class Point {
public double x;
public double y;
}
Definieren Sie zum Testen der Klasse Strecke eine weitere Klasse StreckeTest, die in ihrer main-Methode eine Instanz der Klasse Strecke erzeugt und für diese Instanz die Methode distanz der Klasse aufruft sowie das Ergebnis ausgibt.

Alles soweit verständlich, bis auf den Anfang.
Wie soll ich aus der Klasse Point Instanzvariablen für die Klasse Strecke erstellen, wenn in der Klasse Point gar kein Konstruktor definiert ist.
Hätte ich bspw. in der Klasse Point
Java:
public Point (double x, double y) {
    this.x = x;
    this.y = y;
}
stehen, könnte ich der Variable p und q, diese Punkte zuordnen. Aber das ist ja leider nicht der Fall.

Bisher sieht es bei mir folgendermaßen aus.

Java:
public class Strecke {
    Point p = Point.x;
    Point q = Point.y;
   

    public Strecke(double x1, double x2, double y1, double y2) {
        Point.x = x1;
        Point.x = x2;
        Point.y = y1;
        Point.y = y2;
    }

    public void setP(Point p) {
        this.p = p;
    }

    public void setQ(Point q) {
        this.q = q;
    }

    public Point getP() {
        return p;
    }

    public Point getQ() {
        return q;
    }

    public double distanz() {
        double distanz = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
        return distanz;
    }
}
Ich weiß aber nicht wie ich nun mit dem Punkt p oder q "arbeiten" kann. Ich muss p ja eigentlich x und y zuweisen können und nicht nur x.
Das ist unsere erste Aufgabe im Bereich OOP.
Hatte vorher schon ein wenig Erfahrung in dem Bereich gesammelt, aber mehr auch nicht.
Hoffe jemand hat einen Ratschlag.
 
Lese dir bitte nochmal ganz genau die Aufgabenstellung durch. Da steht zum Beispiel dieser sehr wichtige Satz:
Im Konstruktor der Klasse Strecke werden Referenzen auf Objekte der Klasse Point übergeben.
Du bekommst also nicht die individuellen double-Koordinaten, und musst dann auch nicht im Konstruktur von Strecke Point-Objekte erzeugen, sondern du bekommst schon zwei Point-Objekte, die du einfach nur noch an die Instanzfelder setzen musst.
Und das hier ist Quatsch:
Java:
    Point p = Point.x;
    Point q = Point.y;
 
Danke für die sehr schnelle Antwort.
Leider versteh ich diesen Satz auch nach mehrmaligem googeln nicht. Soweit ich das richtig verstanden habe, verweisen die Referenzen also nur auf etwas und speichern dies nicht ab.
Ist das denn schon mal richtig um die Instanzvariablen zu definieren?
Java:
    Point p;
    Point q;
Tut mir Leid, wenn ich gerade selbst keinen Lösungsvorschlag habe. Ich schein die Aufgabe nicht richtig zu verstehen.
 
Der Punkt ist, dass du im Konstruktor nicht vier double-Parameter bekommst, sondern zwei Point-Parameter.
Und ja, die Instanzvariablendefinition ist so korrekt.
 
Ok, also müsste das so korrekt sein
Java:
public Strecke(Point p, Point q) {
        this.p = p;
        this.q = q;
    }
Wie soll ich diesem Punkt p und q aber nun jeweils ein x und ein y Wert zuordnen?
Wenn ich in der Klasse StreckeTest eine Instanz der Klasse Strecke erzeuge, muss ich ja Point p und q angeben, aber wie? Ein Punkt besteht ja aus x und y.
 
Du erstellst die zwei Point Instanzen genauso wie du jede andere Instanz einer Klasse erzeugst: Mit dem `new` Schlüsselwort und Konstruktorargumenten:
Java:
Point p = new Point(1.0, 2.0); // <- Konstruktoraufruf mit zwei double Argumenten
Point q = new Point(3.0, 4.0); // <- Konstruktoraufruf mit zwei double Argumenten
Strecke s = new Strecke(p, q); // <- Konstruktoraufruf mit zwei Point Argumenten
 
Ich komm mir gerade echt blöd vor. Genau das habe ich vorher ja schon probiert.
Und Eclipse gibt mir dabei die Fehlermeldung aus, dass kein Konstruktor Point(double, double) existiert. Ich soll diesen erstellen. Doch das soll laut Aufgabenstellung ja nicht sein.
Genau das ist ja mein Problem, was ich nicht zu lösen bekomme. Wie soll ich die Variablen der Klasse Point bekommen ohne Konstruktor.

edit: @mihe7 genau das. Ich weiß nicht wie ich das anders lösen könnte.
 
Java:
Point p = new Point();
p.x = 4;
p.y = 5;
Das funktioniert, weil die Instanzvariablen in Point public sind.
 
Danke für eure Hilfe. Ich wusste nicht, dass dies möglich ist. Also gibt es quasi immer einen leeren Standardkonstruktor?
Ich habe dabei nun aber weiterhin folgendes Problem.
Bei der Variablen Deklaration und Initialisierung von p.x usw., gibt er mir einen Fehler aus.

Java:
public class Strecke {
    Point p = new Point();
    p.x = 1.5;
    p.y = 3.5;
    Point q = new Point();
    q.x = 2.0;
    q.y = 5.0;

Jetzt habe ich herausgefunden, dass das ganze in einer Methode stehen muss, deswegen auch der Fehler.

Der Code sieht nun folgendermaßen aus
Java:
public class Strecke {
    public Point p = new Point();
    public Point q = new Point();

    public Strecke(Point p, Point q) {
        this.p = p;
        this.q = q;
        this.p.x = 3.0;
        this.p.y = 1.5;
        this.q.x = 2.5;
        this.q.y = 5.0;
    }

    public void setP(Point p) {
        this.p = p;
    }

    public void setQ(Point q) {
        this.q = q;
    }

    public Point getP() {
        return p;
    }

    public Point getQ() {
        return q;
    }

    public double distanz() {
        double distanz = Math.sqrt(Math.pow(p.x - q.x, 2) + Math.pow(p.y - q.y, 2));
        return distanz;
    }
}
Das Problem ist nun, wenn ich in der Klasse StreckeTest ein neues Objekt von Strecke erzeugen möchte, gibt er aus: p cannot be resolved to a variable
Java:
public class StreckeTest {
    public static void main(String[] args) {

        Strecke s1 = new Strecke(p, q);
        double ergebnisDistanz = s1.distanz();
        System.out.println(ergebnisDistanz);
    }
}
Hab es auch schon mit Strecke.p und Strecke.q probiert, dann erkennt er das Objekt, sagt allerdings, dass dieses statisch sein muss.
 
Also gibt es quasi immer einen leeren Standardkonstruktor?
Nein. Es muss immer einen Konstruktor geben. Nur wenn Du in der Klasse keinen Konstruktor angegeben hast, wird der Standardkonstruktor (=ohne Parameter) angenommen.

Java:
class A {
    A(int a) { ... }
}
hat keinen Standardkonstruktor, Du kannst also nicht einfach new A() schreiben, sondern musst in dem Fall einen int-Wert angeben.

Jetzt habe ich herausgefunden, dass das ganze in einer Methode stehen muss
Das war als Code-Schnipsel gedacht, wie man allgemein ein solches Point-Objekt erzeugt und Werte für x und y setzen kann.

Der Code sieht nun folgendermaßen aus
Die Zuweisungen an p.x und p.y (analog für q) im Konstruktor müssen raus. Du bekommst ja de Punkte als Parameter übergeben - und die stellen ja bereits die x- und y-Koordinaten dar.

Das Problem ist nun, wenn ich in der Klasse StreckeTest ein neues Objekt von Strecke erzeugen möchte, gibt er aus: p cannot be resolved to a variable
Richtig, denn dort musst Du die Punkte p und q erzeugen (Du kannst hier den Variablen natürlich auch ganz andere Namen geben) und die Koordinaten entsprechend setzen.
 
Danke, ich habe es jetzt hinbekommen. Ich bin die ganze Zeit davon ausgegangen ich muss die Punkte nur in Strecke erzeugen.
Vielen Dank an alle Beteiligten!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben