2010-03-06 15 views
23

Ich habe eine Klasse mit mehreren Methoden und es gibt keinen Konstruktor unter diesen Methoden.Kann ich Methoden einer Klasse verwenden, ohne diese Klasse zu instanziieren?

Also frage ich mich, ob es möglich ist, eine Methode einer Klasse aufzurufen, ohne eine Instanz der Klasse zu erstellen.

Zum Beispiel kann ich so etwas tun:

NameOfClass.doMethod(x1,x2,...,xn) 

Generell sehe ich nicht, warum es nicht möglich sein sollte. Ich rufe nur eine Funktion auf, die etwas tut (oder einige Werte zurückgibt). Wenn es möglich ist, was passiert, wenn die Methode einen Wert für eine private Variable der Klasse setzt. Wie kann ich diesen Wert erreichen? Auf die gleiche Weise?

NameOfClass.nameOfVariable 

Antwort

12

Wenn die Methoden statisch sind, ja.

Sie können jedoch nicht auf nicht statische Mitglieder zugreifen.

1

Das wäre statische Methoden.

26

Es heißt statische Variablen und statische methods. Probieren Sie es einfach und sehen Sie, dass es kompiliert.

2

In den meisten Sprachen können Sie es nur tun, wenn die Methode statisch ist. Und statische Methoden können nur statische Variablen ändern.

0

Da qre eine statische Methode ist und keinen Zugriff auf Instanzen der einschließenden Klasse hat, müssen Sie zunächst eine Instanz erstellen und dann darauf zugreifen. Zum Beispiel:

public class Foo { 
    private int bar; 

    public static void qre() { 
     Foo foo = new Foo(); 
     foo.bar = 5; 
     System.out.println("next bar: " + (++5)); 
    } 
} 
2

Ich habe eine Klasse mit mehreren Methoden, und es gibt keinen Konstruktor unter diesen Verfahren.

Wenn Sie keinen Konstruktor explizit definieren, erhalten Sie einen Standardkonstruktor, der vom Compiler bereitgestellt wird. Also, wenn diese Methoden nicht statisch sind, versuchen Sie Folgendes:

NameOfClass x = new NameOfClass(); 
x.doMethod(x1,x2,...,xn); 
5

Wie viele haben darauf hingewiesen: Dies ist nur möglich, wenn die Methode statisch ist. Vielleicht ist ein OOP-Hintergrund in Ordnung: Eine Methode sollte immer zu einer Klasse gehören. Was nützt also das Aufrufen einer Methode ohne eine Instanz einer Klasse? In einer perfekten OO-Welt sollte es dafür keinen Grund geben. Viele Anwendungsfälle, die mit statischen Methoden zu tun haben, sprechen davon, einer Klasse eine Art von Identität zuzuweisen. Während dies in einer Programmierwelt vollkommen vernünftig ist, ist es nicht sehr überzeugend, wenn es um objektorientiertes Design geht.

Wie wir in einer unvollkommenen Welt programmieren, gibt es oft einen Anwendungsfall für eine "freie Funktion" (Die Art, wie Java oder C++ zum Beispiel sort() implementieren). Da Java keine direkte Unterstützung für freie Funktionsklassen bietet, werden nur statische "Methoden" verwendet, um diese Semantik mit dem zusätzlichen Vorteil des Klassenwrappers auszudrücken, der einen "Namespace" bereitstellt. Was Sie von dieser Problemumgehung halten und wenn Sie es als einen Fehler im Sprachdesign betrachten, ist IMO eine Frage der Meinung.

0

In der richtigen Verkapselung sollten Sie nicht "sehen", was nach der Instanziierung geschieht. Sich auf das Fehlen eines Konstruktors einer Klasse zu verlassen, bricht dieses Formular. Die von der Klasse entworfenen haben die Absicht, zu einem späteren Zeitpunkt eine formale Zustandsinitialisierung im Konstruktor hinzuzufügen. Ihr "Vertrag" mit der Klasse besteht nur darin, dass Sie die Methoden verwenden können, wie sie derzeit entworfen sind.

Wenn Sie die Funktionalität dieser Methode ohne den Klassen-Overhead verwenden möchten, ist es vielleicht am besten, wenn Sie diese Methode in Ihre vorhandene "Client" -Klasse aufnehmen (natürlich wird das nur "Kopieren und Einfügen" -Codieren und berücksichtigt) .. ein Anti-Muster von Software-Design

1

ich habe eine Klasse mit mehreren Methoden und es gibt keinen Konstruktor unter dieser Methoden

meinen Sie Sie haben so etwas wie:

public class X 
{ 
    public void foo() 
    { 
    } 
} 

oder Sie meinen Sie haben so etwas wie:

public class X 
{ 
    private X() 
    { 
    } 

    public void foo() 
    { 
    } 
} 

Wenn es die Faust ist Art und Weise dann, ja, es ein Konstruktor ist, und es wird wie folgt aussehen:

public X() 
{ 
    super(); 
} 

wenn es ist die zweite Möglichkeit, dann gibt es wahrscheinlich eine Methode wie:

public static X createInstance() 
{ 
    return (new X()); 
} 

Wenn Sie wirklich bedeuten kann Klassen haben Methoden, die Dinge tun, ohne jemals eine Instanz zu erstellen, dann können Sie ja alle Methoden und Variablen statisch machen (normalerweise ist das keine gute Idee, aber für manche Dinge ist es perfekt).

2

Eine Methode für eine Klasse arbeitet im Kontext einer Instanz; Es hat Zugriff auf die Mitgliedsvariablen der Instanz. Sie verstehen das, weil Sie fragen, was passiert, wenn die Methode auf eine dieser Variablen zugreift.

Sie können verstehen, warum es nicht funktioniert, indem Sie sich die Frage stellen: "Wo sind die Daten?" Wenn Sie keine Instanz haben, wo ist die Instanzvariable? Wo sind die Daten? Und die Antwort ist, dass es keinen Platz hat und deshalb nicht funktioniert.

Der Unterschied zu einer statischen Funktion und statischen Elementvariablen besteht darin, dass Sie die Frage nach dem Speicherort der Daten beantworten können. Die verfügbaren statischen Variablen, unabhängig davon, ob eine bestimmte Instanz vorhanden ist oder nicht. Die instanzspezifische vs. klassenspezifische Entscheidung ist eine Entscheidung, die Sie treffen müssen, wenn Sie berücksichtigen, was Sie eigentlich tun möchten.

3

1) JA, um die Methoden einer Klasse ohne verwenden kann, um eine Instanz oder ein Objekt dieser Klasse durch die Verwendung des Schlüsselworts „Static“ erzeugen.

2) Wenn Sie die Methode als "Static" erklären dann können Sie diese Methode aufrufen durch:

   *ClassName.MethodName()* 

3) Z. B.

class Hello { 

    public static void print() 
    { 

    System.out.println("HelloStatic"); 
    } 

} 


class MainMethod { 
    public static void main(String args[]) 
    { 
     // calling static method 
     Hello.print(); 
    } 
} 

4) Die Ausgabe des obigen Programms wäre: HelloStatic

Verwandte Themen