[Java] Static

08/04/2013 16:25 wasgehtso#1
Nunja, mein Problem ist, dass ich, wenn ich eine Methode aus einer anderen Klasse in der Main-Klasse ausgeben oder benutzen will er immer meckert, dass die Klasse dafür dann static sein muss, danach muss ich die Variablen auch noch static machen. Gerade gegoogelt wieso static überhaupt da ist und das hat mich dann doch schon etwas verwirrt. Wenn ich auf eine static variable von jeder Klasse aus zugreifen kann, wofür gibt es dann noch die getMethoden? Gibt es eine Möglichkeit wie ich das ganze static umgehen kann und normal mit get und setMethoden in der Main-Klasse arbeiten kann? Irgendwie raffe ich das ganze nicht... Wenn man die Ergebnisse in der Mainmethode aufrufen will kann es dann nämlich schonmal passieren das fast alle Methoden und Variablen static sind und das ist ja nciht der Sinn der Sache...
08/04/2013 16:27 Marley.#2
Also mein Arbeitskollege ist ein "Freak" in diesem Bereich, wenn du bis Heute Abend warten kannst und mir ne PN schreibst als Erinnerung, sag ich ihm er soll dich kontaktieren und dir da weiterhelfen. (Er macht alles natürlich kostenlos und hilft gerne)


MFG :)
08/04/2013 17:18 Master674b#3
Quote:
Originally Posted by wasgehtso View Post
Nunja, mein Problem ist, dass ich, wenn ich eine Methode aus einer anderen Klasse in der Main-Klasse ausgeben oder benutzen will er immer meckert, dass die Klasse dafür dann static sein muss, danach muss ich die Variablen auch noch static machen. Gerade gegoogelt wieso static überhaupt da ist und das hat mich dann doch schon etwas verwirrt. Wenn ich auf eine static variable von jeder Klasse aus zugreifen kann, wofür gibt es dann noch die getMethoden? Gibt es eine Möglichkeit wie ich das ganze static umgehen kann und normal mit get und setMethoden in der Main-Klasse arbeiten kann? Irgendwie raffe ich das ganze nicht... Wenn man die Ergebnisse in der Mainmethode aufrufen will kann es dann nämlich schonmal passieren das fast alle Methoden und Variablen static sind und das ist ja nciht der Sinn der Sache...
static bedeutet du kannst auf die Funktion oder Variable ohne ein Objekt zugreifen (entspricht einer globalen Variable). Das heißt du musst deine Klasse nicht instanziieren und es gibt diese Variable nur ein mal und nicht pro Objekt. Das Singleton Konzept ist dafür aber oft passender, falls du planst eine Klasse zu erzeugen, die nur aus statischen Methoden / Variablen besteht.
08/04/2013 17:21 South-Park#4
Static Variablen und Methoden beziehen sich auf die ganze Klasse und können so direkt mit dem Klassennamen benutzt werden. Wenn du z.B. eine Klasse so hast:
Code:
public class Auto {
private int geschwindigkeit;

public int getGeschwindigkeit() {
return geschwindigkeit;
}
}
Wenn du dann getGeschwindigkeit in einer anderen Klasse aufrufen willst, ohne sie static zu machen (d.h. ohne sie Klassenabhängig zu machen) muss die andere Klasse so aussehen:
Code:
public class AutoDemo {
public static void main(String[] args) {
Auto auto = new Auto();
int aktuelleGeschwindigkeit = auto.getGeschwindigkeit;

System.out.println("Das auto fährt gerade " + aktuelleGeschwindigkeit);


}
}
Bei weiteren Fragen, frag ruhig :P Wenn eine Methode benutzt werden soll, die nicht static ist, muss mithilfe der Konstruktoren erst ein neues Objekt der Klasse erstellt werden ;)
08/05/2013 20:16 MrSm!th#5
^
auto.getGeschwindigkeit();
;O
Quote:
Originally Posted by Master674b View Post
static bedeutet du kannst auf die Funktion oder Variable ohne ein Objekt zugreifen (entspricht einer globalen Variable). Das heißt du musst deine Klasse nicht instanziieren und es gibt diese Variable nur ein mal und nicht pro Objekt. Das Singleton Konzept ist dafür aber oft passender, falls du planst eine Klasse zu erzeugen, die nur aus statischen Methoden / Variablen besteht.
Nein, für zustandslose Methodensammlungen (was ja eine Klasse, die nur aus statischen Methoden oftmals ist), ist eine Singleton eher unpassend.

Wie schon gesagt wurde, static bedeutet nur, dass man auf die Methode / das Datenfeld ohne Objekt zugreifen kann. Da es in diesen Methoden keinen Objekt-Kontext gibt, kann man logischerweise aber nicht auf instanzgebundene Methoden oder Felder derselben Klasse zugreifen, weshalb alles static sein muss, womit du von so einer Methode aus interagieren willst.
Die Lösung ist, deine Variablen einfach nicht zu Membervariablen der Main-Klasse zu machen. Die Main-Klasse soll sowieso so wenig wie möglich mit der Programmlogik zu tun haben. Lokale Variablen reichen.
Im Optimalfall würde das Ganze so ablaufen:
Code:
public class Programm
{
    public static int Main(String[] argv)
    {
        SomeLogicClass obj(42);
        return someLogicClass.doYourJob();
    }
}
Mit Settern und Gettern hat das Ganze wenig im am Hut.