Вопрос: Как я могу назвать один конструктор из другого в Java?


Можно ли вызвать конструктор из другого (в том же классе, а не из подкласса)? Если да, то как? И что может быть лучшим способом вызвать другой конструктор (если есть несколько способов сделать это)?


1796


источник


Ответы:


Да, это возможно:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

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

Чтобы привязать к определенному конструктору суперкласса вместо одного в том же классе, используйте superвместо this, Обратите внимание, что вы можете только привязать к одному конструктору , а также это должно быть первое утверждение в вашем теле конструктора ,

Смотрите также этот связанный вопрос , который относится к C #, но там, где применяются те же принципы.


2412



С помощью this(args), Предпочтительный шаблон - работать от самого маленького конструктора до самого большого.

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

Вы также можете использовать недавно защищенный подход valueOf или просто «из»:

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

Чтобы вызвать суперкласс, используйте super(asdf), Вызов супер должен быть первым вызовом в конструкторе или вы получите ошибку компилятора.


192



[ Примечание. Я просто хочу добавить один аспект, который я не видел в других ответах: как преодолеть ограничения требования, что это () должно быть в первой строке). ]

В Java другой конструктор того же класса можно вызвать из конструктора через this(), Обратите внимание, однако, что thisдолжен быть на первой линии.

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

Что thisдолжен появиться в первой строке, выглядит как большое ограничение, но вы можете построить аргументы других конструкторов с помощью статических методов. Например:

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;

  }

}

174



Когда мне нужно вызвать другой конструктор изнутри кода (не в первой строке), я обычно использую вспомогательный метод, подобный этому:

class MyClass {
   int field;


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

Но чаще всего я пытаюсь сделать это наоборот, назвав, насколько это возможно, более сложные конструкторы из простых в первой строке. Для приведенного выше примера

class MyClass {
   int field;

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

36



Внутри конструктора вы можете использовать thisключевое слово для вызова другого конструктора в том же классе. Это называется явный вызов конструктора ,

Вот еще один класс Rectangle, с другой реализацией от той, что находится в разделе «Объекты».

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

}

Этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.


23



Как все уже сказали, вы используете this(…), который называется явный вызов конструктора ,

Однако имейте в виду, что в таком явном заявлении о вызове конструктора вы не можете ссылаться на

  • Любые переменные экземпляра или
  • Любые методы экземпляра или
  • Любые внутренние классы объявленные в этом классе или любом суперклассе, или
  • thisили
  • super,

Как указано в JLS (§8.8.7.1).


12



I will tell you an easy way

There are two types of constructors:

  1. Default constructor
  2. Parameterized constructor

I will explain in one Example

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

In the above example I showed 3 types of calling

  1. this() call to this must be first statement in constructor
  2. This is Name less Object. this automatically calls the default constructor. 3.This calls the Parameterized constructor.

Note: this must be the first statement in the constructor.


7



You can a constructor from another constructor of same class by using "this" keyword. Example -

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

Output - string as arg constructor.. Default constructor.. int as arg constructor..


5



Calling constructor from another constructor

class MyConstructorDemo extends ConstructorDemo
{
    MyConstructorDemo()
    {
        this("calling another constructor");
    }
    MyConstructorDemo(String arg)
    {
        System.out.print("This is passed String by another constructor :"+arg);
    }
}

Also you can call parent constructor by using super() call


5



Yes it is possible to call one constructor from another with use of this()

class Example{
   private int a = 1;
   Example(){
        this(5); //here another constructor called based on constructor argument
        System.out.println("number a is "+a);   
   }
   Example(int b){
        System.out.println("number b is "+b);
   }

5