webentwicklung-frage-antwort-db.com.de

Kann ich Methoden einer Klasse verwenden, ohne diese Klasse zu instanziieren?

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

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

Zum Beispiel kann ich so etwas machen:

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

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

NameOfClass.nameOfVariable
23
Roman

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

27
Yoni

Wenn die Methoden statisch sind, ja.

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

12
µBio

Wie viele darauf hingewiesen haben: 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 es also, eine Methode ohne eine Instanz einer Klasse aufzurufen? In einer perfekten OO Welt sollte es keinen Grund geben, dies zu tun. In vielen Anwendungsfällen, die sich auf statische Methoden beziehen, geht es darum, Ihrer Klasse eine Art von Identität zuzuweisen. Während dies in einer Programmierwelt durchaus sinnvoll ist, ist es beim objektorientierten Design wenig überzeugend.

Da wir in einer unvollkommenen Welt programmieren, gibt es häufig einen Anwendungsfall für eine "freie Funktion" (z. B. die Implementierung von sort () durch Java oder C++). Da Java keine freien Funktionen direkt unterstützt, werden Klassen mit nur statischen "Methoden" verwendet, um diese Semantik auszudrücken, mit dem zusätzlichen Vorteil, dass der Klassenwrapper einen "Namensraum" bereitstellt. Was Sie von diesem Workaround halten und wenn Sie es als Fehler in der Sprachgestaltung ansehen, ist IMO eine Ansichtssache.

6
pmr

1)JA, Sie können die Methoden einer Klasse verwenden, ohne dass eine Instanz oder ein Objekt dieser Klasse mithilfe des Schlüsselworts "Static" erstellt.

2) Wenn Sie die Methode als "Static" deklarieren, können Sie diese Methode folgendermaßen aufrufen:

                *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

5
Aviral Kumar

In den meisten Sprachen ist dies nur möglich, wenn method statisch ist. Und statische Methoden können nur statische Variablen ändern.

2
user272879

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

Wenn Sie keinen Konstruktor explizit definieren, erhalten Sie einen vom Compiler bereitgestellten Standardkonstruktor. Wenn diese Methoden nicht statisch sind, versuchen Sie Folgendes:

NameOfClass x = new NameOfClass();
x.doMethod(x1,x2,...,xn);
2
Mark Byers

Eine Methode für eine Klasse bearbeitet im Kontext eine Instanz. Es hat Zugriff auf die Member-Variablen 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 daher nicht funktioniert.

Der Unterschied zu einer statischen Funktion und statischen Membervariablen 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 in Betracht ziehen müssen, was Sie tatsächlich tun möchten.

2
janm

Ich habe eine Klasse mit mehreren Methoden und es gibt keinen Konstruktor unter diese Methoden.

Meinen Sie, Sie haben so etwas wie:

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

oder meinst du, du hast so etwas wie:

public class X
{
    private X()
    {
    }

    public void foo()
    {
    }
}

Wenn es der erste Weg ist, dann gibt es einen Konstruktor, und es sieht so aus:

public X()
{
    super();
}

wenn es der zweite Weg ist, gibt es wahrscheinlich eine Methode wie:

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

Wenn Sie wirklich meinen, dass Klassen über Methoden verfügen können, ohne dass eine Instanz erstellt wird, können Sie alle Methoden und Variablen statisch machen (normalerweise ist dies keine gute Idee, aber für einige Dinge ist es perfekt).

1
TofuBeer

Das wären statische Methoden. 

1
Tony The Lion

Da qre eine statische Methode ist und keinen Zugriff auf Instanzen der umgebenden Klasse hat, müssen Sie zuerst 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));
   }
}
0
Boris Pavlović

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

Wenn Sie die Funktionalität dieser Methode ohne den Klassen-Overhead verwenden möchten, empfiehlt es sich, diese Methode in Ihre vorhandene "client" -Klasse aufzunehmen (natürlich handelt es sich dabei nur um eine "copy and paste" -Codierung, die als Anti-Pattern gilt von Software-Design. 

0