Methode um 2D-Punkt zu verschieben

Hallo,

benötige Eure Hilfe. Möchte mit einer Methode die Koordinaten eines Objektes (Klasse Point) verändern. Folgender Code:

import java.awt.Point;

public class Zeiger
{
    void shift( int a, int b )
    {
        this . x = x + a;
        this . y = y + b;
    }

    public static void main( String[] args )
    {
        java.awt.Point p = new java.awt.Point( 2, 2 );
        System.out.println( p );
        p.shift( 2, 2 );
        System.out.println( p );
    }
}

bekomme folgende Fehlermeldungen:

mac-air:Tutorial user$ javac Zeiger.java
Zeiger.java:8: error: cannot find symbol
this . x = x + a;
     ^
  symbol: variable x
Zeiger.java:8: error: cannot find symbol
this . x = x + a;
           ^
  symbol:   variable x
  location: class Zeiger
Zeiger.java:9: error: cannot find symbol
this . y = y + b;
     ^
  symbol: variable y
Zeiger.java:9: error: cannot find symbol
this . y = y + b;
           ^
  symbol:   variable y
  location: class Zeiger
Zeiger.java:19: error: cannot find symbol
p.shift( 2, 2 );
 ^
  symbol:   method shift(int,int)
  location: variable p of type Point
5 errors

Was mache ich falsch ?

Danke und Gruß

“this” bezieht sich auf die Klasse Zeiger, die aber keine Felder x und y kennt.
Entsprechende Felder zu erzeugen würde dir aber auch nicht helfen, denk ich.
Es scheint ja, als wolltest du das Point-Objekt verändern, aber woher soll den die shift-Methode der Klasse Zeiger wissen,
dass du in der Main-Methode ein Point-Objekt erzeugt hast, das du gerne verschoben haben möchtest.
Die Hellseher-Funktion fehlt in den meissten Programmiersprachen.

Nenne das bitte nicht Zeiger sondern Punkt.
Überlege dir, ob du von java.awt.Point ableiten möchtest (also Point erweitern möchtest).
Wenn nicht, deklariere, definiere und initialisiere: private int x = 0; und private int y = 0; in Punkt.
Verwende bitte einfach [ JAVA ] [ … ] [ /JAVA ]-Tags.

[QUOTE=pappawinni]“this” bezieht sich auf die Klasse Zeiger, die aber keine Felder x und y kennt.
Entsprechende Felder zu erzeugen würde dir aber auch nicht helfen, denk ich.
Es scheint ja, als wolltest du das Point-Objekt verändern, aber woher soll den die shift-Methode der Klasse Zeiger wissen,
dass du in der Main-Methode ein Point-Objekt erzeugt hast, das du gerne verschoben haben möchtest.
Die Hellseher-Funktion fehlt in den meissten Programmiersprachen.[/QUOTE]

OK Danke, wie stelle ich denn den Bezug zwischen der Methode shift und dem Objekt p in der main Methode her ?

Ziel ist den Punkt um bestimmte Koordinaten zu verschieben, also nicht per .move oder .setLocation, sondern mit einer selbst geschriebenen Methode.

Danke vorab.

Gruß

Objektvariablen und Attribute heißt hier das Zauberwort.^^ Und mit der Punktnotation (.) rufst du dann Methoden auf dem Punkt-Objekt auf. Nacht.

Hallo,

kannst Du bitte auf meinen Code bezogen schreiben, wie Du die Methode shift gestalten würdest ?

Ich dachte ich erschaffe erst die Signatur der Methode in der Klasse Zeiger, und rufe sie dann auf dem Objekt p ab, wobei die Methode shift dann auf die Attribute x und y von dem Objekt p zugreift und die Parameter a und b dazu addiert, und somit die Koordinaten des Punktes verändert, doch irgendwo habe ich einen Denkfehler.

Bin anscheinend noch nicht ganz durchgestiegen.

Gruß


public class  Zeiger extends java.awt.Point
{ 
	public Zeiger(int a, int b){
		super(a,b);
	}	
	void shift( int a, int b )
	{
		this . x = x + a;
		this . y = y + b;
	}

	public static void main( String[] args )
	{
		Zeiger p = new Zeiger(2,2);
		System.out.println( p );
		p.shift( 2, 2 );
		System.out.println( p );
		p.translate( 1, 3 );
		System.out.println( p );
	}
}```

Eine Möglichkeit wäre, den zu bewegenden Punkt an die Methode zu übergeben:

    void shift(Point p, int a, int b )
    {
        p.x = p.x + a;
        p.y = p.y + b;
    }

Aufruf:
shift(p, 2,2);

@ Marco13: muss in diesem Fall das p Objekt vor der shift Methode deklariert/erstellt werden ?

Danke

Oder geht das so (verkürzte Darstellung):


public class Zeiger
{
   void shift () 
   {}
   public static void main ()
   { p=new Point
      shift (p,2,2)
   }```

so würde das gehen, aber für bessere Lesbarkeit besser die Java Tags um Code

Wenn du den erst in der Methode erstellst würde der Rest des programms den vorher ja nicht kennen.

Hallo,

was bedeuten die Wörter extends und super, und was bewirken sie an dieser Stelle.

Danke

{
    public Zeiger(int a, int b){
        super(a,b);
    }```

wie wäre es, mit einem Lehrbuch alle 300 Begriffe/ sonstigen elementaren Grundlagen Seite für Seite der Reihe nach zu erarbeiten,
statt alles irgendwo einzeln nachzufragen, teils Stunden zu warten?

ansonsten gehen auch immer Suchmaschinen:
‘java class extends’
‘java constructor super’

es muss immer jemanden geben, der kontraproduktive Bemerkungen macht, die einen null weiterbringen. Wäre auch langweilig, wenn alle gleich wären. Ich lerne Java aus dem Buch Java ist eine Insel, und habe vielleicht noch nicht die Stelle wo diese Sachen erklärt werden erreicht. Übrigens warte ich nicht Stundenlang, sondern muss zwischendurch auch noch arbeiten. Jetzt werde ich die Sachen googeln, da ich gerade in der Mittagspause.
Trotzdem Danke :slight_smile:

Da jetzt nix mehr gekommen ist, kann man annehmen dass du das Problem gefunden hast. Für alle Fälle: In Java musst du Variablen deklarieren. Das heisst, du sagst irgendwo ein Objekt der Klasse Punkt hat eine x und eine y Koordinate in der Form eines Integer (Ganzzzahl). Das hast du aber nicht gemacht, drum weis der Computer nicht was mit x bzw. y gemeint ist.

{
    int x,y;

    public Punkt(int x, int y)
   {
      thix.x = x;
      this.y = y;
   }

    public void shift( int a, int b )
    {
        this . x = x + a;
        this . y = y + b;
    }
 
    public static void main( String[] args )
    {
        Punkt p = new Punkt( 2, 2 );
        System.out.println( p );
        p.shift( 2, 2 );
        System.out.println( p );
    }
}```

Und Instanzvariablen, in diesem Fall also x und y vom Typ int, sollten immer private deklariert werden.
Kommt dann sicher noch in deinem Buch unter Sichtbarkeit von Variablen. Spätestens, wenn es um Kapselung geht.

Achso: Vielleicht noch eine Antwort auf deine Fragen.
extends - http://openbook.galileocomputing.de/javainsel/javainsel_05_008.html#dodtpb085bfe8-9ffe-48a2-bfb4-87c3b1b69ee8
super - http://openbook.galileocomputing.de/javainsel9/javainsel_05_008.htm#mj23635ff54d83b3c53bdfc96dbf5f6f83

Aber SlaterB hat trotzdem Recht.

[QUOTE=L-ectron-X]Und Instanzvariablen, in diesem Fall also x und y vom Typ int, sollten immer private deklariert werden.
[/QUOTE]
interessant ist dazu, dass hier im Thread auch schon von Point-Klasse geerbt und dabei auf x/ y direkt zugegriffen wird, Variablen dort public,

wären sie dort private, was auch ginge, dann bei Erben auf Methoden angewiesen, getX(), getY(), setLocation() bzw. move()

Jetzt wurde alles gesagt, aber wichtig ist noch eine Stelle:
this . x = x + a;
wenn a heißt x (wenn a x heißt), dann besser so:
this . x = this.x + a;
oder
this . x = this.x + x;.
this(.) bezieht sich auf das aktuelle Objekt der Klasse… …

Hallo,

super, besten Dank an alle für die Unterstützung!

Edit

muss mich noch mal melden, bekomme folgende Ausgabe:

Punkte@7f31245a
Punkte@7f31245a

hätte eigentlich die Koordinaten erwartet. Hier der Code:

public class Punkte 
{
    int x, y;

    public Punkte(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public void shift( int a, int b )
    {
        this.x = x + a;
        this.y = y + b;
    }

    public static void main( String[] args )
    {
        Punkte p = new Punkte( 2, 2 );
        System.out.println( p );

        p.shift( 2, 2 );
        System.out.println( p );
    }
}

was mache ich falsch ?

Danke

Du müsstest in diesem Fall folgenden Mindest-Code noch einfügen, damit das funktioniert:

    return this.x+" "+this.y;
}

System.out.println() ruft immer die toString()-Methode von Objekten auf, wenn sie deren Referenzen übergeben bekommt.

Bist du wirklich der TO/TE? Wieso schreibst du nicht unter (als) Coffeeboy?
Da
this.x = x + a;
kommt unbedingt ein
this.x = this.x + a;
hin

Falls du wirklich im (als) nächsten Schritt vor hast, a nach x umzubenennen, ist das eine mögliche Fehlerquelle