2016-07-25 6 views
1

ich auf diese Art von Beispiel kam und hatte Schwierigkeiten, es ist actuall Zweck zu verstehen:Zu welchem ​​Zweck möchte man eine Klasseninstanz innerhalb derselben Klasse erstellen?

class YieldDemo extends Thread 
{ 
    static boolean finished = false; 
    static int sum = 0; 
    public static void main (String [] args) 
    { 
     new YieldDemo().start(); 
     for (int i = 1; i <= 50000; i++) 
     { 
      sum++; 
      if (args.length == 0) 
       Thread.yield(); 
     } 
     finished = true; 
    } 
    public void run() 
    { 
     while (!finished) 
     System.out.println ("sum = " + sum); 
    } 
} 

ich nie diese Art der Implementierung gesehen habe - warum eine die neue Klasse innerhalb des gleichen Klassenobjekts zu initiieren und nicht außerhalb der Klasse? Gibt es einen besonderen Grund?

+0

Denken Sie nicht, dass es einen bestimmten Grund gibt, nur weniger Code für ein Beispiel. – Divers

+0

Ich habe so viele Probleme mit diesem Code ... (eigentlich, nur 3 wichtigsten: unsynchronisierten Zugriff auf veränderbare Shared-Variablen; Erweiterung 'Thread' anstelle der Implementierung' Runnable'; eine wirklich ausgelastete Schleife). –

+0

@AndyTurner - es ist nicht meins :) – Nimrod

Antwort

1

Tatsächlich sind Sie outside des Klassenobjekts selbst. Die main method ist eine statische Methode, also keine Abhängigkeit von einer Objektinstanz.

Sie könnten auch die main method auf eine andere java file verschieben. Im Allgemeinen wird es auch funktionieren. Sie müssen jedoch static Methoden in eine Datei einfügen. Da jede java file eine Klasse sein muss, können Sie die Methode in die Klasse einfügen, für die sie arbeitet. Zum Beispiel ist die Klasse Math in Java eine reine Dienstklasse, sie hat keine non-static Methode.

Wenn Sie jedoch schaffen so etwas wie dieses:

public final class Value { 
    private final int mValue; 

    public Value(int value) { 
     mValue = value; 
    } 

    public int getValue() { 
     return mValue; 
    } 

    public Value increase() { 
     return new Value(mValue + 1); 
    } 
} 

Es kann tatsächlich Sinn machen, wenn Sie Value wollen unveränderlich sein (nicht seinen internen Wert ändern). Wenn Sie also increase() aufrufen, wird der Wert nicht erhöht, sondern eine neue Instanz dieses Objekts mit einem höheren Wert erstellt.