web-dev-qa-db-ger.com

Warum können andere Methoden "statisch" sein, ein Konstruktor jedoch nicht?

Ich verstehe nicht, warum die Hauptmethode statisch sein muss. Ich verstehe statische Variablen, aber statische Methoden sind für mich schwer zu verstehen. Gibt es eine statische Methode, sodass zwei Methoden mit demselben Namen in zwei verschiedenen Klassen erstellt werden können, die nicht miteinander kollidieren?

Ich verstehe auch nicht, warum ich keinen statischen Konstruktor erstellen kann.

Kann jemand helfen, dieses Konzept zu erklären?

43
user983246

Java hat [statische Konstruktoren] statische Initialisierungsblöcke was als "statischer Konstruktor" angesehen werden kann:

class Foo {
  static String Bar;
  static {
     // "static constructor"
     Bar = "Hello world!";
  }
}

In jedem Fall ist die einzige Methode in der Hauptklasse, die statisch sein muss , die Methode main. Dies liegt daran, dass es aufgerufen wird , ohne zuerst eine Instanz der "Hauptklasse" zu erstellen . Eine übliche und von mir bevorzugte Technik besteht darin, den statischen Kontext schnell zu verlassen :

class Main {
   int argCount;

   // constructor
   public Main (String[] args) {
     // and back to boring ol' non-static Java
     argCount = args.length;       
   }

   void runIt () {
      System.out.println("arg count: " + argCount);
   }

   // must be static -- no Main instance created yet
   public static void main (String[] args) {
      Main me = new Main(args);
      me.runIt();
   }
}

Statisch hat auch nichts mit "Namenskonflikten" zu tun. Eine statische Methode (oder Variable) ist einfach eine Methode (oder Variable), die keiner bestimmten Instanz eines Typs zugeordnet ist . Ich würde empfehlen, das Classes and Objects Java Tutorial und den Abschnitt nderstanding Instance and Class Variables durchzulesen.

Fröhliches Codieren.

82
user166390

Ich teile einen der Gründe, warum ein Java-Konstruktor nicht statisch sein sollte.

Einfach gesagt: "Ein Java-Konstruktor ist immer nicht statisch", weil

Der Zweck des Konstruktors besteht nur darin, das Objekt zu initialisieren/zu konstruieren und Vererbung zu ermöglichen. Dazu müssen wir die beiden nützlichen Java-Schlüsselwörter (cum nicht statische Variablen) wie this und super verwenden. Wir werden 'this' verwenden, um das Objekt zu initialisieren. Wir/Java verwenden super (ofcourse super ()), um den Superklassenkonstruktor aufzurufen, sodass zuerst das Superobjekt (oder die Objektklasse) und dann das untergeordnete Objekt (daher die Vererbung) erstellt wird Wenn der Konstruktor statisch ist, können wir nicht zwei Schlüsselwörter (nicht statische Variablen) innerhalb des Konstruktors verwenden. (Wie wir wissen, können nicht statische Elemente nicht aus dem statischen Kontext referenziert werden.)

Java-Konstruktoren sollten also nicht statisch sein.

Konstruktor wird zum Erstellen von Objekten verwendet.

Statisch ist in der Regel für alle Objekte gleich.

Wenn wir also über statische Konstruktoren verfügen, wirkt sich die Erstellung eines Objekts auf alle anderen vorhandenen Objekte aus.

Statische Methoden beziehen sich nur auf statische Variablen. Daher ändern sich alle anfänglichen Parameter, die Sie zum Erstellen eines Objekts angeben, für alle Objekte. Es ist sinnlos, ähnliche Objekte ohne Verwendung zu erstellen. 

Hoffe das hilft.... :)

7
user2626445

Statische Methoden gehören zu einer Klasse und nicht zu einem Objekt. Die Hauptmethode muss statisch sein, da sie zuerst aufgerufen wird, bevor ein anderer Code ausgeführt wurde, um Objekte zu instantiieren. Es bietet einen Einstiegspunkt in das Programm. Statische Methoden werden außerhalb des Containers eines Objekts aufgerufen. Gleiches gilt für statische Klassenvariablen. Für die gesamte Klasse ist nur eine Kopie vorhanden, im Gegensatz zu einer Membervariablen, die einmal für jedes aus einer Klasse erstellte Objekt erstellt wird. Sie werden zum Speichern von Daten für die Klasse verwendet, z. B. die Anzahl der Objektinstanzen, die erstellt und nicht gelöscht wurden. Diese Daten gehören zur Klasse. Ein gutes Beispiel für eine statische Methode ist das Singleton-Muster, bei dem der Konstruktor privat ist und nur über eine statische Member-Funktion aufgerufen werden kann. Eine Funktion außerhalb der Klasse kann diese Funktionalität nicht replizieren. Diese Methode wirkt auf Klassendaten und Objekte ein und gehört daher logisch zu derselben Klasse. Dies alles läuft auf die Verkapselung hinaus. Eine Klasse ist nur für sich selbst verantwortlich und kennt nur sich selbst.

Andererseits sollen Objektmethoden die Daten bearbeiten, die einer einzelnen Instanz einer Klasse, einem Objekt, zugeordnet sind. Konstruktoren sind der Code, mit dem ein Objekt initialisiert und seine Daten in den Anfangszustand versetzt werden. Sie werden sofort (und automatisch) ausgeführt, nachdem der Speicher zum Speichern eines neuen Objekts zugewiesen wurde. Auch wenn Sie keinen Konstruktor explizit definieren, wird eine Art "Standardkonstruktor" ausgeführt, um die Mitgliedervariablen des Objekts und den Methodencode des Objekts dem neuen Objekt zuzuordnen.

Hoffe das hilft.

7
Sinthia V

Konstruktor ist die Eigenschaft eines Objekts, während static nichts mit Objekt zu tun hat. Deshalb gibt es nichts wie static constructor . Wir haben jedoch einen statischen Block, um ähnliche Aufgaben wie Konstruktoren auszuführen, d. H. Die Initialisierung von Feldern usw. 

1
ashwani46

Die main(String[])-Methode hat einen bestimmten Prototyp, der durch die Funktionsweise der Java-Laufzeitumgebung vorgegeben wird. Wenn Sie Java MyApplication von der Befehlszeile aus aufrufen, sucht Java VM nach einer in dieser Klasse enthaltenen statischen main(String[])-Methode, um die Anwendung auszuführen. Wenn diese Methode nicht gefunden wird, kann Java VM die Klasse nicht als Anwendung ausführen. So wird die Sprache definiert. Dies bedeutet auch, dass Java VM erstellt keine Instanz Ihrer Anwendungsklasse, um sie auszuführen.

Wenn Sie möchten, dass Ihre Klasse entweder als eigenständige Anwendung oder als von einer anderen Instanz erstellte Instanz verwendet werden kann, können Sie Ihre Klasse das Interface Runnable implementieren lassen und außerdem eine main-Methode bereitstellen, die die run-Methode auf einer neuen Klasse ausführt Beispiel.

public class MyRunnableThing implements Runnable
{
    // Define whatever variables your runnable thing needs here as
    // private instance fields.

    /** Fulfills requirements of Runnable interface. */
    public void run()
    {
        System.out.println( "I'm running..." ) ;
    }

    /** Also makes the class runnable from the console. */
    public static void main( String[] args )
    {
        MyRunnableThing runMeNow = new MyRunnableThing() ;
        runMeNow.run() ;
    }
}

Nun könnte any class möglicherweise eine Instanz von MyRunnableThing erstellen und mithilfe der run()-Methode dasselbe Verhalten erzeugen, das bei der Ausführung von Java MyRunnablething aufgetreten wäre.

Siehe auch: Mit Static Constructor in Java arbeiten . Einige Highlights aus diesem Q & A:

  • Ein Konstruktor wird zum Erstellen einer Instanz der Klasse verwendet. Es handelt sich also um eine Instanzmethode, nicht um eine statische Methode.
  • Sie können eine statische Methode erstellen, die mithilfe des Konstruktors eine Instanz der Klasse erstellt. So funktionieren die trendigen neuen "Builder" -Klassen.
  • Sie können eine statische Methode erstellen, die eine permanente, eindeutige singleton -Instanz zurückgibt.
  • Wenn Ihre Klasse statische Member hat, können Sie einen statischen Initialisierer erstellen, um die Werte dieser Member zu initialisieren.
0
zerobandwidth

Der Zweck des Konstruktors besteht darin, ein Objekt zu erstellen, d. H. Die Instanzvariablen der Klasse entweder durch ihre Standardwerte oder durch ihre initialisierten Werte zu initialisieren. Auf nicht statische Instanzvariablen kann nicht mit statischen Methoden zugegriffen werden. Konstruktor ist also nicht statisch.

0
user3428513

Werfen Sie einfach einen Blick auf diesen Link, der Ihnen auf jeden Fall helfen wird, zu verstehen: Warum kann ein Konstruktor nicht statisch gemacht werden?

UND

Der Konstruktor wird zur Laufzeit aufgerufen, wenn wir Objekte erstellen. Die Statik ist für alle Objekte gleich, aber alle Objekte haben ihren eigenen Status und ihre eigenen Eigenschaften. Wenn also statische Konstruktoren vorhanden wären, würde die Erstellung eines Objekts alle Objekte beeinflussen andere vorhandene Objekte ..__ Hinweis: statisch ist Klassenebene, während Konstruktoren sich auf die Objekte beziehen.

z.B.

  public class Foo
    {
       String name;
       int id;
        // define constructors
           Foo (String name, int id)
        {
            this.name = name;
            this.id = id;
        }

          p s v m(String[] arg)
      {
          Foo f1 = new Foo("Amit",001);
          Foo f2 = new Foo("Rahul",002);
      }
    }

Wenn wir einen statischen Konstruktor erstellen, enthalten beide Objekte (auch f1) den letzten aktualisierten Wert in Bezug auf Name und ID als Rahul und 002.

0
Maddy

Die als statisch deklarierte Methode erfordert keine Objekterstellung. Da wir kein Objekt für die Hauptmethode erstellen, wird sie als statisch deklariert.

der Konstruktor wird implizit aufgerufen, um ein Objekt zu initialisieren. Es hat also keinen Zweck, einen statischen Konstruktor zu verwenden.

0
Smruti

Ich habe gestern ein einfaches Beispiel als Antwort auf eine verwandte Frage geschrieben, die dazu beitragen kann, die Dinge verständlicher zu machen: Was macht der Java-Konstruktor aus?

Der Sinn von statischen Methoden ist, dass sie aufgerufen werden können, ohne eine Instanz einer Klasse zu erstellen, während "normale" Instanzmethoden mit einer Instanz zusammenhängen und nicht ohne eine Instanz aufgerufen werden können. 

Da die Main-Methode der Main-Klasse der Einstiegspunkt des Programms ist, kann möglicherweise noch keine Instanz erstellt worden sein. Daher können Sie natürlich nicht über eine Instanz auf sie zugreifen. Daher ist es statisch und kann daher als Start des Programms ausgeführt werden.

0
Kjartan

Ein Konstruktor kann nicht statisch sein, da in einer Sprache OO ein Objekt zum Erstellen eines Objekts wie folgt erstellt wird:

  • ordnen Sie das Objekt zu
  • rufen Sie den Konstruktor auf, um das neu zugewiesene Objekt zu initialisieren

Konstruktoren werden an keiner anderen Stelle verwendet (und eine typsichere Sprache sollte dies erzwingen). Daraus folgt, dass ein Konstruktor immer in einem nicht statischen Kontext aufgerufen wird. 

Wenn ein Konstruktor statisch wäre, würde er keinen Verweis auf das neu zugewiesene Objekt erhalten und könnte es daher nicht initialisieren.

Ein Konstruktor kann daher immer nicht statisch sein (da er immer aus einem nicht statischen Kontext aufgerufen wird) und muss immer nicht statisch sein (sonst könnte er seine Aufgabe nicht ausführen).

0
user3810486

Java erlaubt nicht, einen Konstruktor als statisch zu deklarieren. Nachfolgend die Gründe.

  1. Statisches Mittel für dieselbe Klasse. statische Methoden können nicht vererbt werden.

  2. Bei statisch kann "diese" Referenz (Schlüsselwort) nicht verwendet werden. "this" ist immer mit einem Objekt verknüpft. Ein Konstruktor gehört immer zu einem Objekt.

  3. Wenn ein Konstruktor statisch ist, kann ein Objekt der Unterklasse nicht zugreifen. Wenn statisch mit Konstruktor zulässig ist, kann auf diese Klasse innerhalb der Klasse zugegriffen werden, jedoch nicht auf Unterklassen.

0
Suraj

Statisch gehört zur Klasse, Konstruktor zum Objekt

Wir wissen, dass statische Methoden, Blöcke oder Variablen zur Klasse gehören. Während ein Konstruktor zum Objekt gehört und aufgerufen wird, wenn wir den neuen Operator zum Erstellen einer Instanz verwenden. Da ein Konstruktor keine Klasseneigenschaft ist, ist es sinnvoll, dass er nicht statisch sein darf.

0
abin peter