Mailinglisten-Archive |
Hallo Peter, Am Montag, 16. Januar 2006 15:24 schrieb Lutz Zetzsche: > Am Montag, 16. Januar 2006 14:44 schrieb Peter Bieling: > > Also, mich hatte überrascht, dass sich Methoden verschiedener Objekte > > ihre static-Variablen teilen. > > Selbst wenn man das Objekt zerstört und ein neues bildet, bleibt diese > > static-Variable erhalten, oder genauer gesagt: feiert Auferstehung. > > > > Offenbar hat das auch einige Kommentatoren des Manuals überrascht, denn > > die haben extra darauf hingewiesen. Da es aber das gleiche Verhalten ist > > wie in C++, nehme ich inzwischen an, dass das so sein soll. (Vielleicht > > weiß jemand, wie es z.B. in Java oder anderen objektorientierten > > Sprachen gelöst ist.) > > zunächst ein Link dazu für Java: > > http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_003.htm#Rxx >365java06003040001CB1F038100 > > Ansonsten kann ich das gerne für Dich mal mit Java ausprobieren. :-) Aber: > Mich verwirrt nach wie vor Eure Diskussion. Warum sollte sich in einer > Klasse eine static-Variable innerhalb einer Funktion anders verhalten, als > außerhalb einer Funktion? > > Bei der Objektorientierten Programmierung steht doch das Objekt im > Vordergrund, d.h. eine Klasse hat Attribute und Methoden. Hier ist keine > Rede davon, daß eine Methode Attribute besäße. Klassenattribute gehören zur > Klasse, niemals zu Methoden. Eine Methode kann ein Attribut verändern. Mehr > nicht. > > Aus meiner Sicht müßte eine static-Variable in einer Klasse ohnehin > außerhalb der Funktionen deklariert werden. Ich werde mal prüfen, ob das > nicht der einzige, fehlerfreie Weg in Java ist. > > Ich gehe mal davon aus, daß die vermeintliche Dokumentationslücke, die wir > da gesehen haben, deswegen existiert, weil es da nichts zu erklären gibt. > Es gibt von der Logik her keine statischen Variablen, deren Geltungsbereich > auf eine Methode in einer Klasse beschränkt ist. Diese Idee kann eigentlich > nur zustandekommen, wenn prozedurale Ansätze mit objektorientierten > vermischt werden bzw. prozedurale Programmierung 1:1 in > objektiertorientierte übertragen wird. :-) so. Ich habe mal schnell in NetBeans einen Test gemacht, wie Java sich verhält. :-) 1. Der Test hat voll bestätigt was ich hier oben geschrieben habe. In Java kannst Du Variablen ausschließlich im Rumpf der Klasse deklarieren, also nicht etwa in Methoden. Damit kommt bei Java das Problem gar nicht erst auf, was wir hier für PHP diskutieren. 2. Die static-Variable verhält sich folglich in Java genauso, wie Du es auch in PHP beobachtet hast. Hier kurz die Testprogrammierung: --------------- ANFANG - QUELLTEXT NewClass.java --------------- /* * NewClass.java * * Created on 16. Januar 2006, 17:38 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package javaapplication1; /** * * @author lutz */ public class NewClass { public static int staticTest = 0; /** Creates a new instance of NewClass */ public NewClass() { staticTest += 10; } } --------------- ENDE - QUELLTEXT NewClass.java --------------- --------------- ANFANG - QUELLTEXT Main.java --------------- /* * Main.java * * Created on 16. Januar 2006, 17:37 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package javaapplication1; import javaapplication1.NewClass; /** * * @author lutz */ public class Main { /** Creates a new instance of Main */ public Main() { } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here NewClass staticTestObjekt1 = new NewClass(); System.out.println("staticTestObjekt1.staticTest="+staticTestObjekt1.staticTest); staticTestObjekt1 = null; NewClass staticTestObjekt2 = new NewClass(); System.out.println("staticTestObjekt2.staticTest="+staticTestObjekt2.staticTest); staticTestObjekt2 = null; System.out.println("NewClass.staticTest="+NewClass.staticTest); } } --------------- ENDE - QUELLTEXT Main.java --------------- Wenn Main.class ausgeführt wird, werden nacheinander zwei Objekte der Klasse NewClass.class gebildet und anschließend der Inhalt der statischen Variable ausgegeben. Objekt 1 wird zerstört, bevor Objekt 2 gebildet wird. Nachdem auch das Objekt 2 zerstört ist, wird die Klassenvariable noch einmal ausgegeben. Sie hat dann immer noch ihren Inhalt. Und so sieht die Ausgabe aus, wenn Main.class ausgeführt wird: init: deps-jar: Compiling 1 source file to /home/lutz/JavaApplication1/build/classes compile-single: run-single: staticTestObjekt1.staticTest=10 staticTestObjekt2.staticTest=20 NewClass.staticTest=20 BUILD SUCCESSFUL (total time: 0 seconds) Ich denke, damit sind sämtliche Fragen beantwortet. :-) Viele Grüße Lutz
php::bar PHP Wiki - Listenarchive