statische variablen in java

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • statische variablen in java

    hallo.
    ich versuche grade, ein neues java-projekt auf die beine zu stellen. dafuer brauche ich einen schwung variablen die von mehreren methoden benutzt werden muessen. deshalb hab ich die deklarationen ausserhalb der methoden untergebracht, und xcode hat sich beschwert dass man statische variablen nicht in einem nichtstatischen kontext benutzen kann. uebergabe der variablen als parameter ist keine option.

    wenn ich die variablen innerhalb einer methode deklariere, kann doch nur diese eine methode darauf zugreifen, oder sehe ich das falsch? und wenn ich die variablen ausserhalb der methoden deklariere, muss ich alle methoden, die die variablen benutzen, als statisch erklaeren, sonst beschwert sich xcode...

    wie wuerdet ihr profis das machen?
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • ich schätze mal, dass Du Objekt-Variablen definieren möchtest, auf welche Du dann in einer Objekt-Methode einer Instanz Deiner Klasse zugreifen möchtest, oder?

    Es sieht jedoch so aus, als ob Du die Variablen als Klassen-Variablen definiert hast.

    Eine Klassen-Variable definierst Du z.B. wir folgt:

    Quellcode

    1. static private int a;
    und eine Objekt-Variable z.B. so:

    Quellcode

    1. private int a;
  • Hallo!

    Ich schließe mich meinem Vorredner an, nur um den Unterschied zwischen Klassen- und Objektvariablen nochmals hervorzuheben:

    Auf Objektvariablen hast du dann Zugriff, wenn ein Objekt einer Klasse vorhanden ist (normalerweise mit "new" kreiert und von dir mit einem Namen versehen)

    Bsp.:
    die Klasse mit der Variablen (Konstruktor und Methoden denk dir einfach dazu):

    public class foo {
    public int i = 0;
    }


    nun der Zugriff auf i von einer Methode einer anderen Klasse aus:

    ...
    foo nameDerInstanz = new foo();
    int j = nameDerInstanz.i;
    ...



    Klassenvariablen sind verfügbar ohne dass dazu ein eigenes Objekt der Klasse vorhanden sein muss, du greifst darauf einfach per Klassenname.Variablenname zu.

    Bsp:
    int i ist nun "static"
    public class foo {
    public static int i = 0;
    }


    der Zugriff erfolt nun ohne separate Instanz von foo:

    ...
    int j = foo.i;
    ...



    Probierst du hingegen den Zugriff über eine Instanz, so wie bei einer Objektvariablen, bekommst du die von dir genannten Fehlermeldungen.

    Meist wirst du also Objektvariablen verwenden, statische Klassenvariablen hingegen nur in Spezialfällen (übrigens die statischen Variablen aller Instanzen einer Klasse denselben Wert, da es diese Variable praktisch nur einmal gibt, und sie für alle Instanzen gilt!)

    servus
    booster
  • Original von MCDan
    ich schätze mal, dass Du Objekt-Variablen definieren möchtest, auf welche Du dann in einer Objekt-Methode einer Instanz Deiner Klasse zugreifen möchtest, oder?


    nicht ganz. wie gesagt, ich brauche diese variablen in mehreren methoden.

    so, mal sehen ob ich das jetzt richtig verstanden habe...

    - wenn ich variablen ausserhalb einer methode deklariere, sind das klassenvariablen

    - wenn ich meine variablen innerhalb einer methode deklariere, kann ich nur innerhalb dieser methode darauf zugreifen, ausser ich deklariere sie als public.
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • noch mal zum mitschreiben:

    - wenn ich variablen ausserhalb einer methode deklariere, sind das klassenvariablen

    wenn diese static definiert werden und Objekt- oder Instanz-Variablen, wenn sie nicht static definiert werden! Auf Objekt-Variablen kannst Du in jeder Objekt-Methode Deiner Klasse zugreifen.

    Ist eine Klassen-Variable public, dann kannst Du aus jeder anderen Klasse in der Form Klassenname.variablenname darauf zugreifen.

    Auf Objekt-Variablen, welche public definiert sind, kann Du auch aus jeder anderen Klasse oder Instanz zugreifen, wenn Du eine Referenz auf die Instanz der Klasse, also das spezielle Objekt hast. Objekt-Variablen sollten jedoch in Bezug auf Kapselung nicht public definiert werden. Also lieber getter- und setter-Methoden definieren, wenn Du Objekt-Variablen nicht nur in der eigenen Instanz verwenden möchtest.


    - wenn ich meine variablen innerhalb einer methode deklariere, kann ich nur innerhalb dieser methode darauf zugreifen

    Korrekt, da dies dann Laufzeit-Variablen sind welche nur in dem Block existieren in welchem sie definiert sind!

    , ausser ich deklariere sie als public.

    Was jedoch nicht funktionieren dürfte!
  • ist ja ziemlich komplizwickt, also static bedeutet immer klassenvariable bzw -methode, und wenn das kennwort fehlt, ist es eine objektvariable bzw -methode.
    ich glaub ich habs gerafft.

    zu meinem projekt: das problem war dass ich in main() auf die variablen zugreifen wollte, und die muss ja statisch sein. jetzt hab ich diese berechnungen in den konstruktor gepackt, und schluss mit fehlermeldungen.

    problem geloest. aber das naechste kommt bestimmt :(
    Mac Mini, 1.83 GHz Core 2 Duo, 2 GB, OSX 10.6.3, Xcode 3.2.2
    iPhone 3GS, 16 GB, OS 3.1.3
  • Alles halb so wild. Static ist hier so aehnlich, wie in C globale Variablen. D.h. auf die kannst Du mit Angabe des Klassennamens, in dem sie definiert sind einfach zugreifen ohne eine Instanz der Klasse zu haben.
    In C kannst Du ja mit globalen Variablen etwas aehnliches machen, darauf von jeder Funktion aus zugreifen, weil es keine lokale Variable ist.

    In der Main-Methode brauchst du deshalb eine static deklarierte Variable, weil Du aus einem statischen kontext nicht auf einen nicht-statischen kontext zugreifen kannst.
    Main ist static und hier existiert noch kein Objekt irgendeiner Klasse.

    Gruesse,
    Manfred