Static / non-static (Java)

Aus Byte-Welt Wiki
Version vom 14. August 2013, 16:56 Uhr von Theuserbl (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Der Unterschied zwischen statischen und nicht-statischen Methoden und Variablen == Das kleine Wort ''static'' macht einen großen Unterschied. == Statische…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

Der Unterschied zwischen statischen und nicht-statischen Methoden und Variablen

Das kleine Wort static macht einen großen Unterschied.


Statische Methoden

Wer nicht-objektorientierte Sprachen wie C kennt, dem dürften statische Methoden vertraut sein. In nicht-objektorientiersten Sprachen heißen Methoden "Funktionen". Und im Grunde genommen sind statische Methoden genau das: Funktionen wie in C.

Wenn man von einer anderen Klasse auf statische Methoden oder Variablen zugreifen möchte, dann ruft man sie zusammen mit dem Klassennamen auf:

<code=java>public class ExternalClass {
 public static int number=5;
 private static String text="Anfangstext";
 public static void myStaticMethod() {
   System.out.println("statische Methode aufgerufen");
 }
 public static double add(double a, double b) {
   return a + b;
 }
 public static void printText() {
   System.out.println(text);
 }
 public static void changeText() {
   text = "geaenderter Text";
 }

}</code=java>

<code=java>public class MyProgram {
 public static void main(String[] args) {
   ExternalClass.myStaticMethod();
   System.out.println( ExternalClass.add(17.65, 9.23) );
   System.out.println( ExternalClass.number );
   ExternalClass.number = 13;
   System.out.println( ExternalClass.number );
   ExternalClass.printText();
   ExternalClass.changeText();
   ExternalClass.printText();
 }

}                                                                 </code=java>

Befinden sich die Methoden und Variablen in der eigenen Klasse, dann sieht es genauso aus:

<code=java>public class MyProgram {
 public static int number=5;
 private static String text="Anfangstext";
 public static void myStaticMethod() {
   System.out.println("statische Methode aufgerufen");
 }
 public static double add(double a, double b) {
   return a + b;
 }
 public static void printText() {
   System.out.println(text);
 }
 public static void changeText() {
   text = "geaenderter Text";
 }
 public static void main(String[] args) {
   MyProgram.myStaticMethod();
   System.out.println( MyProgram.add(17.65, 9.23) );
   System.out.println( MyProgram.number );
   MyProgram.number = 13;
   System.out.println( MyProgram.number );
   MyProgram.printText();
   MyProgram.changeText();
   MyProgram.printText();
 }

} </code=java>

Der Einsatzzweck für statische Methoden ist somit ähnlich wie bei Funktionen von nicht-objketorientierten Sprachen. Statische Variablen sind ein zentraler Ort an dem etwas gespeichert wird.

Beispiele für die Verwendung von statische Methoden im JRE:

<code=java>public class MyProgram {
 public static void main(String[] args) {
   System.out.println( Math.PI );       // PI ist eine statische Variable in der Klasse Math
   System.out.println( Math.E );        // E ist eine statische Variable in der Klasse Math
   System.out.println( Math.sin(2) );   // sin() ist eine statische Methode in der Klasse Math
   System.out.println( Math.log(7) );   // log() ist eine statische Methode in der Klasse Math
 }

} </code=java>

PI ist halt überall immer 3.141..., sin(2) ist überall 0.909..., etc.


Nicht-Statische Methoden

Nicht-Statische Methoden und Variablen kommen vor allem in objektorientierten Sprachen vor. Um diese aufrufen zu können, muß erst mit new eine Instanz von der Klasse erstellt werden. Und an dieser kann man dann die Methoden aufrufen. Die Methoden gehören dann zur Instanz:

<code=java>public class ExternalClass {
 public int number=5;
 private String text="Anfangstext";
 public ExternalClass() {
 }
 public void myNonStaticMethod() {
   System.out.println("nicht-statische Methode aufgerufen");
 }
 public double add(double a, double b) {
   return a + b;
 }
 public void printText() {
   System.out.println(text);
 }
 public void changeText() {
   text = "geaenderter Text";
 }

}</code=java>

<code=java>public class MyProgram {
 public static void main(String[] args) {
   ExternalClass ec1 = new ExternalClass();
   ec1.myNonStaticMethod();
   System.out.println( ec1.add(17.65, 9.23) );
   System.out.println( ec1.number );
   ec1.number = 13;
   System.out.println( ec1.number );
   ec1.printText();
   ec1.changeText();
   ec1.printText();
   ExternalClass ec2 = new ExternalClass();
   ec2.printText();
   ec1.printText();
   ec2.number = 29;
   System.out.println( ec1.number );
   System.out.println( ec2.number );
 }

}                 </code=java>

Zwar existieren nun genau die gleichen Methoden und Variablen wie bei dem Beispiel mit den statischen Methoden, jedoch existieren sie für jede Instanz unabhängig voneinander.

Befinden sich die Methoden und Variablen in der eigenen Klasse, dann sieht es ähnlich aus. In der eigenen Klasse wird jedoch statt einem Instanznamen das Schlüsselwort this verwendet:

<code=java>public class MyProgram {
 public int number=5;
 private String text="Anfangstext";
 public MyProgram() {
   this.myNonStaticMethod();
   System.out.println( this.add(17.65, 9.23) );
   System.out.println( this.number );
   this.number = 13;
   System.out.println( this.number );
   this.printText();
   this.changeText();
   this.printText();
 }
 public void myNonStaticMethod() {
   System.out.println("nicht-statische Methode aufgerufen");
 }
 public double add(double a, double b) {
   return a + b;
 }
 public void printText() {
   System.out.println(text);
 }
 public void changeText() {
   text = "geaenderter Text";
 }
 public static void main(String[] args) {
   MyProgram p = new MyProgram();
 }

} </code=java>

Für mehr Informationen zur vorgenommenen Umformung bitte auf Vererbung_(Java) nachlesen.

Beispiele für die Verwendung von nicht-statische Methoden im JRE:

(diese Beschreibung wird später noch fortgesetzt...)