Frage Wie rufe ich einen Konstruktor von einem anderen in Java auf?


Ist es möglich, einen Konstruktor von einem anderen (innerhalb derselben Klasse, nicht von einer Unterklasse) aufzurufen? Wenn ja wie? Und was könnte der beste Weg sein, einen anderen Konstruktor aufzurufen (wenn es mehrere Möglichkeiten gibt)?


1823
2017-11-12 20:10


Ursprung


Antworten:


Ja, es ist möglich:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

    public Foo(int x) {
        this.x = x;
    }
}

Um mit einem bestimmten Superklassenkonstruktor statt mit einem in derselben Klasse zu ketten, verwenden Sie super Anstatt von this. Beachten Sie, dass Sie können nur zu einem Konstruktor verketten, und Es muss die erste Anweisung in Ihrem Konstruktor sein.

Siehe auch diese verwandte Frage, was ungefähr C # ist, wo aber die gleichen Prinzipien gelten.


2464
2017-11-12 20:12



Verwenden this(args). Das bevorzugte Muster besteht darin, vom kleinsten Konstruktor zum größten zu arbeiten.

public class Cons {

 public Cons() {
  // A no arguments constructor that sends default values to the largest
  this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);
 }

 public Cons(int arg1, int arg2) {
  // An example of a partial constructor that uses the passed in arguments
  // and sends a hidden default value to the largest
  this(arg1,arg2, madeUpArg3Value);
 }

 // Largest constructor that does the work
 public Cons(int arg1, int arg2, int arg3) {
  this.arg1 = arg1;
  this.arg2 = arg2;
  this.arg3 = arg3;
 }
}

Sie können auch einen in jüngerer Zeit empfohlenen Ansatz von valueOf oder nur von "of" verwenden:

public class Cons {
 public static Cons newCons(int arg1,...) {
  // This function is commonly called valueOf, like Integer.valueOf(..)
  // More recently called "of", like EnumSet.of(..)
  Cons c = new Cons(...);
  c.setArg1(....);
  return c;
 }
} 

Um eine Superklasse aufzurufen, verwenden Sie super(asdf). Der Aufruf von super muss der erste Aufruf im Konstruktor sein oder Sie erhalten einen Compilerfehler.


198
2018-03-11 20:33



[Hinweis: Ich möchte nur einen Aspekt hinzufügen, den ich in den anderen Antworten nicht gesehen habe: Wie man Einschränkungen der Anforderung, dass diese () in der ersten Zeile sein muss, zu überwinden.]

In Java kann ein anderer Konstruktor derselben Klasse von einem Konstruktor aus aufgerufen werden this(). Beachten Sie jedoch das this muss in der ersten Zeile sein.

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, 0.0);
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }
}

Das this in der ersten Zeile erscheinen muss, sieht wie eine große Einschränkung aus, aber Sie können die Argumente anderer Konstruktoren über statische Methoden konstruieren. Beispielsweise:

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, getDefaultArg3(argument1, argument2));
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }

  private static double getDefaultArg3(double argument1, double argument2) {
    double argument3 = 0;

    // Calculate argument3 here if you like.

    return argument3;

  }

}

177
2018-04-23 23:12



Wenn ich einen anderen Konstruktor innerhalb des Codes (nicht in der ersten Zeile) aufrufen muss, verwende ich normalerweise eine Hilfsmethode wie diese:

class MyClass {
   int field;


   MyClass() {
      init(0);
   } 
   MyClass(int value) {
      if (value<0) {
          init(0);
      } 
      else { 
          init(value);
      }
   }
   void init(int x) {
      field = x;
   }
}

Meistens versuche ich es anders herum zu tun, indem ich die komplexeren Konstruktoren aus den einfacheren in der ersten Zeile so weit wie möglich aufrufe. Für das obige Beispiel

class MyClass {
   int field;

   MyClass(int value) {
      if (value<0)
         field = 0;
      else
         field = value;
   }
   MyClass() {
      this(0);
   }
}

36
2018-05-26 15:09



Innerhalb eines Konstruktors können Sie den this Schlüsselwort, um einen anderen Konstruktor in derselben Klasse aufzurufen. Tun heißt so ein expliziter Konstruktoraufruf.

Hier ist eine weitere Rectangle-Klasse mit einer anderen Implementierung als im Abschnitt Objects.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(1, 1);
    }
    public Rectangle(int width, int height) {
        this( 0,0,width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}

Diese Klasse enthält eine Reihe von Konstruktoren. Jeder Konstruktor initialisiert einige oder alle Elementvariablen des Rechtecks.


23
2018-05-07 22:52



Wie jeder schon gesagt hat, benutzt du this(…), die angerufen wird expliziter Konstruktoraufruf.

Beachten Sie jedoch, dass innerhalb einer solchen expliziten Konstruktoraufrufanweisung Sie dürfen sich nicht darauf beziehen

  • irgendein Instanzvariablen oder
  • irgendein Instanzmethoden oder
  • irgendein innere Klassen deklariert in dieser Klasse oder irgendeiner Oberklasse, oder
  • this oder
  • super.

Wie in JLS (§8.8.7.1) angegeben.


12
2017-11-21 13:14



Ich werde dir einen einfachen Weg sagen

Es gibt zwei Arten von Konstruktoren:

  1. Standardkonstruktor
  2. Parametrisierter Konstruktor

Ich werde das in einem Beispiel erklären

class ConstructorDemo 
{
      ConstructorDemo()//Default Constructor
      {
         System.out.println("D.constructor ");
      }

      ConstructorDemo(int k)//Parameterized constructor
      {
         this();//-------------(1)
         System.out.println("P.Constructor ="+k);       
      }

      public static void main(String[] args) 
      {
         //this(); error because "must be first statement in constructor
         new ConstructorDemo();//-------(2)
         ConstructorDemo g=new ConstructorDemo(3);---(3)    
       }
   }                  

Im obigen Beispiel habe ich 3 Anrufarten gezeigt

  1. Dieser Aufruf von this () muss die erste Anweisung im Konstruktor sein
  2. Dies ist Name ohne Objekt. Dies ruft automatisch den Standardkonstruktor auf. 3.Dies ruft den parametrisierten Konstruktor auf.

Hinweis: Dies muss die erste Anweisung im Konstruktor sein.


7
2017-11-27 19:01



Sie können einen Konstruktor aus einem anderen Konstruktor der gleichen Klasse verwenden, indem Sie das Schlüsselwort "this" verwenden. Beispiel -

class This1
{
    This1()
    {
        this("Hello");
        System.out.println("Default constructor..");
    }
    This1(int a)
    {
        this();
        System.out.println("int as arg constructor.."); 
    }
    This1(String s)
    {
        System.out.println("string as arg constructor..");  
    }

    public static void main(String args[])
    {
        new This1(100);
    }
}

Ausgabe - String als Arg-Konstruktor Standardkonstruktor int als arg Konstruktor ..


5
2018-03-03 09:27