Warum ist das keine Klassenvariable?

5 Antworten

Nein, sind sie nicht.

Der Unterschied ist, dass Variablen, die du in einer Methode definierst, nur in der Methode sichtbar sind. Solche Variablen heißen "lokale Variablen".

Die Variablen, die du in einer Klasse erstellst, werden "Objekt-Variablen" genannt. Falls du also ein Objekt erstellst, dann kannst du überall in deiner Klasse auf diese beiden Variablen zugreifen. In jeder Methode.

Klassenvariablen kann man auch überall benutzen. Der Unterschied ist nur der, dass die Klassenvariable der Klasse und nicht dem Objekt einer Klasse gehört. Sprich, auf eine Klassenvariable haben alle Objekte zugriff (wenn man sie zugreifbar macht). Auf eine Objekt-Variable hat nur das Objekt Zugriff.

Hast du also zwei Objekte vom Typ deiner Klasse, dann hat jedes Objekt ein eigenes int nr und int nr2.

Zur Ergänzung: Auch deine Fonts, JButtons usw. sind in deinem Fall Objektvariablen.

Vllt für später: Schau zu, dass du die Sichtbarkeit deiner Variablen einschränkst und auch nur da Objekt bzw. Klassenvariablen erstellst, wo sie gebraucht werden. Viele deiner Objekte müsste man gar nicht zur Verfügung stellen. Reicht, wenn man sie später einfach an die jeweilige Methode übergibt.


MeinBesitzer 
Beitragsersteller
 06.02.2019, 20:53

also das heißt, wenn man nicht static davor schreibt, ist es automatisch eine Objektvariable, mit stativ eine Klassenvariable?

0
dass Klassenvariablen static sein müssen, um angesprochen werden zu können

Das ist falsch.

Du verstehst den Scope nicht und hast keine Erfahrungen im Context-Wechsel.

Es kommt immer darauf an, wie du die Variablen nutzen möchtest.

Private Variablen werden direkt in der Klasse deklariert und können ausschließlich innerhalb der Klasse mittels this angesprochen werden. Möchtest du die Variable verändern oder auslesen (auch außerhalb der Klasse), benötigst du sogenannte Getter- und Setter-Methoden.

Beispiel:

public class Test {
    int number = 1;

    // Innerhalb mit this.number, außerhalb mit folgenden Getter/setter:

    public int getNumber() {
      return this.number;
    }

    public void setNumber(int number) {
       this.number = number;
    }
}

Beispiel Call:

Test t = new Test();

t.setNumber(123);

int number = t.getNumber();

Ist die Variable hingegen Statisch, kann sie auch außerhalb verwendet werden, hier wird aber bei jeder Instanziierung der gleiche Wert vermittelt. Dieses Verhalten ist bei Threadsafety beispielsweise wichtig:

class Test {
  public static int number = 1;
}

Beispiel Call:

Test.number = 1;

int number = Test.number;
Woher ich das weiß:Berufserfahrung

Auf die Variable kann problemlos in der gesamten Klasse zugegriffen werden. Lediglich wenn du aus einer anderen Klasse auf diese Variable zugreifen möchtest ohne eine Instanz der Klasse (in der sich diese Variable befindet) zu erzeugen, muss diese Variable static sein.

Beispiele:

Variablen.java


class Variablen{
...
int nummer =2;
...
}

Wie greife ich nun auf diese Variable zu ?

Main.java


Variablen variablenKlasse = new Variablen();
System.out.println(variablenKlasse.nummer);

Ändern wir das Beispiel nun so um:

Variablen.java

class Variablen{
...
public static int nummer =2;
...
// public wird gebraucht, um auf diese  Variable zuzugreifen !
}

Wie greife ich nun auf die Variablen zu ?

Main.java

System.out.println(Variablen.nummer);

Einfach, oder ?

Die Variable kann auch importiert werden :

import Variablen.nummer;

bzw.

import static Variablen.nummer;

Nun :

System.out.println(nummer);

Grüße

alex


regex9  07.02.2019, 00:34
// public wird gebraucht, um auf diese Variable zuzugreifen !

Nö. Ansonsten müsste auch hinterfragt werden, wieso das bei deinem objektgebundenen Attribut weiter oben nicht gelten sollte.

Es ist davon abhängig, ob der äußere Zugriff von wirklich überall kommen können soll oder es aus dem eigenen Package reicht. Weiteres für Interessierte hier.

1

Klassenvariablen sind an die Klasse gebunden und durch das Schlüsselwort static gekennzeichnet.

Beispiel:

public class Foo {
  public static float pi = 3.14F;
}

PI kann nun wie folgt genutzt werden:

System.out.println( Foo.pi );

Wenn das Schlüsselwort static fehlt, ist die Variabel an das Objekt gebunden, beispiel:

public class Foo {
  public float pi = 3.14F;
}

pi kann nun wie folgt genutzt werden:

Foo f = new Foo();
System.out.println( f.pi );

Bitte beachte, dass es unüblich ist im zweiten Fall public zu nutzen. Normalerweise würde man über eine getMethode darauf zugreifen, also:

public class Foo {
  private float pi = 3.14F;

  public float getPi() {
    return pi;
  }
}

also:

Foo f = new Foo();
System.out.println( f.getPi() );

Weil es privat und nur in der Klasse sichtbar ist.

Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.