Domanda Come posso chiamare un costruttore da un altro in Java?


È possibile chiamare un costruttore da un altro (all'interno della stessa classe, non da una sottoclasse)? Se sì come? E quale potrebbe essere il modo migliore per chiamare un altro costruttore (se ci sono diversi modi per farlo)?


1823
2017-11-12 20:10


origine


risposte:


Sì, è possibile:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

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

Usare un costruttore di una superclasse piuttosto che uno nella stessa classe super invece di this. Nota che puoi concatenare solo a un costruttore, e deve essere la prima dichiarazione nel tuo corpo del costruttore.

Guarda anche questa domanda correlata, che riguarda C # ma dove si applicano gli stessi principi.


2462
2017-11-12 20:12



utilizzando this(args). Lo schema preferito è lavorare dal più piccolo costruttore al più grande.

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;
 }
}

Puoi anche usare un approccio più recente di valueOf o semplicemente "of":

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;
 }
} 

Per chiamare una super classe, usa super(asdf). La chiamata a super deve essere la prima chiamata nel costruttore o si otterrà un errore del compilatore.


197
2018-03-11 20:33



[Nota: voglio solo aggiungere un aspetto, che non ho visto nelle altre risposte: come superare i limiti del requisito che questo () deve essere sulla prima riga).]

In Java un altro costruttore della stessa classe può essere chiamato da un costruttore tramite this(). Nota comunque this deve essere sulla prima linea.

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;
  }
}

Quella this deve apparire sulla prima riga sembra una grande limitazione, ma è possibile costruire gli argomenti di altri costruttori tramite metodi statici. Per esempio:

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



Quando ho bisogno di chiamare un altro costruttore all'interno del codice (non sulla prima riga), di solito uso un metodo di supporto come questo:

class MyClass {
   int field;


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

Ma più spesso provo a farlo inverso chiamando i costruttori più complessi da quelli più semplici sulla prima riga, nella misura del possibile. Per l'esempio sopra

class MyClass {
   int field;

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

36
2018-05-26 15:09



All'interno di un costruttore, puoi usare il this parola chiave per invocare un altro costruttore nella stessa classe. Fare così è chiamato un invocazione esplicita del costruttore.

Ecco un'altra classe Rectangle, con un'implementazione diversa da quella nella sezione Oggetti.

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;
    }

}

Questa classe contiene un insieme di costruttori. Ogni costruttore inizializza alcune o tutte le variabili membro del rettangolo.


23
2018-05-07 22:52



Come tutti hanno già detto, tu usi this(…), che è chiamato un invocazione esplicita del costruttore.

Tuttavia, tieni presente che all'interno di tale dichiarazione di richiamo del costruttore esplicita non puoi fare riferimento a

  • qualunque variabili di istanza o
  • qualunque metodi di istanza o
  • qualunque classi interne dichiarato in questa classe o in qualsiasi superclasse, o
  • this o
  • super.

Come dichiarato in JLS (§8.8.7.1).


12
2017-11-21 13:14



Ti dirò un modo semplice

Ci sono Due tipi di costruttori:

  1. Costruttore predefinito
  2. Costruttore parametrizzato

Spiegherò in un esempio

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)    
       }
   }                  

Nell'esempio sopra ho mostrato 3 tipi di chiamate

  1. questa () chiamata a questa deve essere la prima istruzione nel costruttore
  2. Questo è Nome meno Oggetto. questo chiama automaticamente il costruttore predefinito. 3.Questo chiama il costruttore Parametrizzato.

Nota: questa deve essere la prima dichiarazione nel costruttore.


7
2017-11-27 19:01