zur vorherigen Seite zum Inhaltsverzeichnis   zur nächsten Seite

Antwort:

Wir prüfen das Folgende. Kompiliert der Code? Achtet vor allem auf N.

public class UnitTestBad
{
  int N = 10;

  public static long factorial()
  {
    long fct = 1;
    for (int j=1; j<=N; j++)
      fct *= j;
    return fct;
  }

  public static void main(String[] arg)
  {
     System.out.println(
       "factorial of " + N + ": " + factorial(N));
  }
}

Nein, dieser Code wird nicht kompilieren.


Klassenvariablen versus Instanzvariablen (Objektvariablen)

Der Code deklariert eine Instanzvariable N. Eine Instanzvariable ist Teil eines Objekts des durch die Klasse beschriebenen Typs. Hätten wir also ein Objekt vom Typ BadUnitTest, dann hätte dieses Objekt eine Instanzvariable (Objektvariable) N.

Aber dieser Code konstruiert kein ein solches Objekt. Es gibt also kein N, das factorial() sehen kann, und der Compiler erzeugt eine Fehlermeldung (kann je Entwicklungsumgebung unterschiedlich aussehen):

UnitTestBad.java:15: error: non-static variable N cannot
 be referenced from a static context
 System.out.println(
 "factorial of " + N + ": " + factorial(N));
                                           ^

Eine Klassenvariable ist eine Variable, die Teil der Klasse ist, aber nicht Teil eines Objekts. Klassenmethoden können static Variablen in ihrer Klasse verwenden.

Um eine Klassenvariable zu deklarieren, verwenden wir das Wort static in der Deklaration. Jetzt ist die Variable Teil der Klasse und in der gesamten Klasse sichtbar, es sei denn, eine lokale Deklaration verdeckt (shadowing) sie (siehe Kapitel 34A).

Aber die Verwendung von Klassenvariablen auf diese Weise verstößt gegen das Konzept der Modularität und sollte vermieden werden.


Frage 12:

Behebt der folgende Code das Problem?

public class UnitTestBad
{
  static int N = 10;

  public static long factorial()
  {
    long fct = 1;
    for (int j=1; j<=N; j++)
      fct *= j;
    return fct;
  }

  public static void main(String[] args)
  {
     System.out.println(
       "factorial of " + N + ": " + factorial());
  }
}

zur vorherigen Seite zum Inhaltsverzeichnis   zur nächsten Seite