Klassen Eigene "non static" Klasse in Main verwenden!

BlueSparkle

Mitglied
Guten Tag,

Ich habe eine eigene Klasse für 2D Vektoren angefangen und möchte diese ganz simpel in der main Klasse testen. Hier gibt es allerdings das leidige Problem mit dem "static" Schlüsselwort in der main, dass mich nicht zum ersten mal ärgert, da ich das von C überhaupt nicht gewohnt bin.
Hier mal die Klasse:

[Java] Vector2.class - Pastebin.com

Hier mal das was ich "können" möchte:

Java:
import java.util.*;
import java.lang.*;

/**
 * Test program for Vector2 calculations
 * 
 * @author Marcel 
 * @version 1.0
 */
public class Main
{    
    public static void main(String[] args)
    {
         Vector2 vec1 = new Vector2(3, 5);
         Vector2 vec2 = new Vector2(7, 2);
         
         Vector2 sum = Vector2.add(vec1, vec1);
    }
}

Nun aber natürlich das static Problem...

non-static method add(Vector2,Vector2) cannot be referenced from a static context

Wie kann ich diese Art der Rechnung nun möglich machen, ohne gleich die ganze Klasse static zu machen oder was auch immer? :rtfm:
Danke für eure Zeit!
 

Chisao

Mitglied
Wenn ich das richtig sehe versuchst du hier auf die Klasse Vector 2 direkt zuzugreifen. Problem ist, dass dieser Zugriff dann nicht Objekt- sondern Klassengebunden wäre(=Static). Eine einfache Lösung wäre die hier:
Java:
import java.util.*;
import java.lang.*;
 
/**
 * Test program for Vector2 calculations
 * 
 * @author Marcel 
 * @version 1.0
 */
public class Main
{    
    public static void main(String[] args)
    {
         Vector2 vec1 = new Vector2(3, 5);
         Vector2 vec2 = new Vector2(7, 2);
 
         Vector2 sum = vec2.add(vec1, vec1);
    }
}

Wenn du auf die Funktion über das Object zugreifst, muss diese Funktion nicht static sein. Wenn du auf sie über die Klasse zugreifst, wirst du sie static machen müssen damit sie nicht mehr Objekt- sondern Klassengebunden ist.
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Du solltest deine add methode überdenken.

ich würde das so machen:

Java:
Public class Vector2

    Public Vector2 add(Vector2 vector)
    {
         Vector2 v=new Vector2();
          v.x = this.x + vector.x;
          v.y = this.y + vector.y;
          Return v
      }

Dann kannst du das benutzen mit:

Java:
      Vector2 a = new Vector2();
      Vector2 b = new Vector2();
      Vector2 c = a.add(b)

Du kannst alternativ natürlich auch die add Methode als static in Vector2 deklarieren. Dann kannst du es so benutzen wie du es gemacht hast.

Du solltest dir unbedingt noch einmal die Grundlagen des OOP durchlesen. Du verstehst noch nicht was eine Klasse und was eine Instanz einer Klasse ist und deshalb hast du die Probleme. Das ist etwas das man auch nicht durch Tutorials lernt. Da musst du einfach mal ein wenig Theorie büffeln.

Gruss

Claus
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
@Thallius: Entweder eine Objektmethode, dann sollte es
public void .add(Vector2 v)
sein und die Eigenschaften des aktuelle Objekts ändern.

Und wenn's schon das Ergebnis zurückliefert statt das Objekt zu beeinflussen, ist eine
public static Vector2 add(Vector2 v_a, Vector2 v_b)
deutlicher.
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Sehe ich nicht so. Als Instanzmethode macht es hier Sinn wenn der Zustand des Objekts gerade nicht verändert wird. Was, wenn du das nochmal an anderer Stelle brauchst? Da finde ich das Zurückgeben eines neuen Vectors mit den addierten Werten besser.
Ob man das nun aber als Instanz/ oder Klassenmethode macht ist denke ich eine Designfrage.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Also für mich macht eine add-Instanzmethode, die die entsprechende Instanz NICHT verändert, keinen Sinn. Es gibt zwar Instanzmethoden, die die aktuelle Instanz zurückgeben (z. B. die ganzen append-Methoden von StringBuffer), damit method chaining möglich wird, aber wenn eine neue Instanz erzeugt werden soll, ist das ganze eine Art von Factory-Methode, und die sollte mMn statisch sein.
 

BlueSparkle

Mitglied
Ich habe jetzt erst einmal allen Methoden das static Schlüsselwort gegeben.

Du solltest dir unbedingt noch einmal die Grundlagen des OOP durchlesen
In OOP muss ich mich sowieso noch genauer reinarbeiten, da ich am Anfang meines Studiums stehe und wir Java sowie C Sprachen vertiefen werden.

Birgt das "static" denn jetzt irgendwelche Nachteile?
Was ist denn eurer Meinung nach hier das sinvollste?
Sollte ich ganz anders denken im Bezug auf die Erstellung einer Klasse?
 

Harry Kane

Top Contributor
Ich habe jetzt erst einmal allen Methoden das static Schlüsselwort gegeben.
:bahnhof: Mal agesehen davon, dass du dir offenbar über mögliche Konsequenzen nicht im Klaren biost: Den Methoden in welcher Klasse? Der Klasse Vector2, von der du bisher keinen Quellcode, sondern nur die Verwendung gezeigt hast?
Werde dir im Klaren darüber, was du willst:
Brauchst du eine Methode, um zu einem existierenden Vector2 einen weiteren hinzuzuaddieren und den ersten Vector2 damit zu verändern? Wenn ja, wüde ich sehr eine Instanzmethode empfehlen (s. post von Thallius oben).
Brauchst du eine Methode, die aus zwei vorhandenen Vektoren einen neuen macht? Dann nimm eine statische Methode so ähnlich wie die, die du schon in deinem Eingangspost verwenden wolltest, aber offenbar in der Klasse nicht als statisch deklariert hattest.
Beide Varianten müssen sich übrigens nicht ausschließen!
 

BlueSparkle

Mitglied
Mal agesehen davon, dass du dir offenbar über mögliche Konsequenzen nicht im Klaren biost
Genau, deshalb habe ich im selben Post genau diese Frage gestellt...
Birgt das "static" denn jetzt irgendwelche Nachteile?

Der Quellcode zur Klasse "Vector2" findest du in der Fragestellung, ich habe dort einen Pastebin Link angegeben, da der Umfang meiner Ansicht nach den Rahmen des Posts sprengen würde.

Der Rest deines Posts hat mir ungemein geholfen und ich weiß jetzt auch was ich will, danke.
Meine Frage bleibt allerdings.
Hat es irgendwelche Konsequenzen oder Einschränkungen die Methoden als static zu deklarieren, wenn du es schon so in deinem Post andeutest?

Hier nochmal die Klasse Vector2 in aktueller Form, da mancher sie offenbar nicht findet.

Vector2.class - Pastebin.com
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Statische Methoden können grundsätzlich nur dann eine Instanz verändern oder die Daten einer Instanz liefern, wenn diese an die statische Methode übergeben wird. Bei der Methode
Java:
    public static double length(Vector2 vec)
    {
        double length = Math.sqrt(Math.pow(vec.x, 2) + Math.pow(vec.y, 2));
       
        return length;
    }
sehe ich überhaupt keinen Grund sie statisch zu machen. Ich würde sie einfach so schreiben:
Java:
    public double length(Vector2 vec)
    {
        double length = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
       
        return length;
    }
Deine Variante bedeutet mindestens überflüssige Tipparbeit.

Bei der Methode
Java:
    public static Vector2 add(Vector2 vec1, Vector2 vec2)
    {
        Vector2 sum = new Vector2(vec1.x + vec2.x, vec1.y + vec2.y);
       
        return sum;
    }
musst du wissen, ob du die beiden Ausgangsvektoren noch brauchst oder nur an der Summe interessiert bist. Falls letzteres der Fall ist, würde ich das ganze als Instanzmethode aufsetzen:
Java:
    public void add(Vector2 other)
    {
        this.x += other.x;
        this.y += other.y;
    }
Was ich vermeiden würde, ist sowas:
Java:
    public Vector2 add(Vector2 vec1, Vector2 vec2)
    {
        Vector2 sum = new Vector2(vec1.x + vec2.x, vec1.y + vec2.y);
       
        return sum;
    }
also eine Instanzmethode, die eigentlich eine Factory-methode ist und eine neue Instanz zurückliefert. Grund: beim entsprechenden Methodenaufruf
Java:
Vector2 ergebnis = vector1.add(vector2, vector3);
ist nicht ersichtlich, daß eine neue Instanz angelegt wird. Die zurückgegebene Instanz ergebnis könnte auch genausogut vector1, vector2 oder vector3 sein. Es sollte zwar in der Doku der Klasse stehen, was da passiert, aber ich fände sowas nur verwirrrend. Bei der statischen Methode würde ich eher vermuten, daß eine neue Instanz angelegt wird, wobei das natürlich auch dokumentiert sein sollte. Den Namen würde ich dann auch eher auf Vector2.createSum(Vector2 v1, Vector2 v2) ändern, um anzuzeigen, daß tatsächlich ein neues Objekt erzeugt wird.
Rein theoretisch könnte die add Methode auch so aussehen:
Java:
    public static Vector2 add(Vector2 vec1, Vector2 vec2)
    {
        vec1.x += vec2.x;
        vec1.y += vec2.y;
        return vec1;
    }
aber das wäre ein Musterbeispiel für schlechtes Design und Irreführung des Nutzers deiner Klasse. Für so ein Konstrukt sehe ich überhaupt keinen Grund.
So das waren mal ein paar Gedanken. Ich hoffe es war nicht zu verwirrend.
 

Thallius

Top Contributor
sehe ich überhaupt keinen Grund sie statisch zu machen. Ich würde sie einfach so schreiben:
Java:
    public double length(Vector2 vec)
    {
        double length = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
       
        return length;
    }

Die Methode must du mir genauer erklären? Wozu genau wird da der Übergabeparameter vec benutzt?

Gruß

Claus
 
Zuletzt bearbeitet:

CSHW89

Bekanntes Mitglied
Da hat er vermutlich vergessen, den Parameter zu löschen. Der wird tatsächlich nun nicht mehr gebraucht. Deshalb hat er ja das static entfernt.
Zu allem anderen kann ich Harry Kane nur zustimmen.

Man kann übrigens grob sagen, eine static methode, die als ersten Parameter eine Instanz dieser Klasse verlangt, sollte nicht static sein (dieser Parameter wird dann quasi von this ersetzt).
Das ist jetzt nicht unbedingt ein Gesetz, kann aber erstmal grob als Ansatz dienen.

lg Kevin
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
G eigene Bibliothek einbinden Java Basics - Anfänger-Themen 1
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
A Eigene Methoden entwicken Java Basics - Anfänger-Themen 3
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
H GSON-Bibliothek für eigene Programme benutzen Java Basics - Anfänger-Themen 2
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
R eigene Graphikbedienelemente Java Basics - Anfänger-Themen 8
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
P Java 8 & Eigene Applets Java Basics - Anfänger-Themen 3
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
G eigene Bibliothek in Java importieren Java Basics - Anfänger-Themen 5
D Klassen Eigene Klasse für ArrayList Java Basics - Anfänger-Themen 6
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
J Eigene Klasse für die Variablen? Java Basics - Anfänger-Themen 3
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
O Denkanstöße für eigene Konfigurations-Datei Java Basics - Anfänger-Themen 12
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C eigene Exception Java Basics - Anfänger-Themen 4
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
S Eigene Exception Klasse - fehlender Konstruktor mit String Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
A Objekte in eigene Klasse auslagern Java Basics - Anfänger-Themen 2
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
E Eigene Stackklasse Java Basics - Anfänger-Themen 7
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
S Eigene Exception Schreiben und Welche Auslösen wie ? Java Basics - Anfänger-Themen 7
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
N Eigene Methoden-> Werte übergeben Java Basics - Anfänger-Themen 5
U Klassen Eigene Klassen importieren Java Basics - Anfänger-Themen 13
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E Object in eigene Klasse umwandeln? Java Basics - Anfänger-Themen 7
S Eigene Klassen addieren Java Basics - Anfänger-Themen 3
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
E Eigene class datum Java Basics - Anfänger-Themen 2
G Eigene MessageBox kreieren Java Basics - Anfänger-Themen 9
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
F Klassen Eigene Klasse definieren Java Basics - Anfänger-Themen 4
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
X Eigene Libary Java Basics - Anfänger-Themen 2
Crashbreaker Eigene Java-Programm ohne hilfe des CMD starten Java Basics - Anfänger-Themen 11
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
T eigene Exception Klasse Java Basics - Anfänger-Themen 12
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
P Vererbung Basisklasse soll eigene Methode benutzen Java Basics - Anfänger-Themen 38
F Eigene Klasse für die Keys von HashMap Java Basics - Anfänger-Themen 5
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
G Eigene Klasse als Array, zugriff? Java Basics - Anfänger-Themen 2
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
dataframe OOP Eigene typisierte Liste Java Basics - Anfänger-Themen 3
W GUI als eigene Klasse oder in die Startklasse? Java Basics - Anfänger-Themen 21
T Konstruktor für eigene Klasse erstellen Java Basics - Anfänger-Themen 6
H Buttonbefehle in eigene Klasse schreiben Java Basics - Anfänger-Themen 8
M Datentypen Eigene iterierbare Liste Java Basics - Anfänger-Themen 4
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
S Klassendiagramm - nur eigene Klassen? Java Basics - Anfänger-Themen 3
nrg Eigene simple List-Klasse programmieren Java Basics - Anfänger-Themen 3
C Eigene Interpreter-Programmiersprache mit Java Java Basics - Anfänger-Themen 17
B eigene Exception.... Java Basics - Anfänger-Themen 5
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
F Eigene Exception StackTrace und Message ist leer warum??? Java Basics - Anfänger-Themen 3
M Eigene Pakete in Eclipse erstellen Java Basics - Anfänger-Themen 5
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
H eigene Schriftarten registrieren Java Basics - Anfänger-Themen 5
Kasoki Eigene Funktionen / Commands Java Basics - Anfänger-Themen 14
M Eigene LinkedList und Nodes Java Basics - Anfänger-Themen 20
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13
K eigene Hash-Datenstruktur Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben