Как мне вызвать один конструктор из другого в Java? - PullRequest
2055 голосов
/ 12 ноября 2008

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

Ответы [ 19 ]

7 голосов
/ 03 марта 2017

Вызов конструктора из другого конструктора

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

Также вы можете вызвать родительский конструктор, используя super() call

7 голосов
/ 27 ноября 2015

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

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

Выход - Строка как конструктор arg .. Конструктор по умолчанию .. int as arg constructor ..

6 голосов
/ 13 сентября 2016

Да, можно вызывать один конструктор из другого с использованием 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 голосов
/ 14 ноября 2017

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

С последней версией Java и добавлением лямбд, легко создать конструктор, который может принимать любой код инициализации, который вы пожелаете.

class LambdaInitedClass {

   public LamdaInitedClass(Consumer<LambdaInitedClass> init) {
       init.accept(this);
   }
}

Позвони с помощью ...

 new LambdaInitedClass(l -> { // init l any way you want });
5 голосов
/ 15 марта 2017

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

Ниже приведена ссылка, в которой я объясняю другую тему о конструкторе и getters () и setters (), и я использовал класс с двумя конструкторами. Я надеюсь, что объяснения и примеры помогут вам.

Методы или конструкторы-установщики

4 голосов
/ 29 июля 2018

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

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

4 голосов
/ 06 июня 2018

Это называется анти-паттерном телескопического конструктора или цепочкой конструктора. Да, вы можете определенно сделать. Я вижу много примеров выше, и я хочу добавить, говоря, что если вы знаете, что вам нужно только два или три конструктора, это может быть хорошо. Но если вам нужно больше, попробуйте использовать другой шаблон проектирования, например шаблон Builder. Как например:

 public Omar(){};
 public Omar(a){};
 public Omar(a,b){};
 public Omar(a,b,c){};
 public Omar(a,b,c,d){};
 ...

Вам может понадобиться больше. Шаблон Builder будет отличным решением в этом случае. Вот статья, это может быть полезно https://medium.com/@modestofiguereo/design-patterns-2-the-builder-pattern-and-the-telescoping-constructor-anti-pattern-60a33de7522e

4 голосов
/ 24 января 2018

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

    import java.util.*;
    import java.lang.*;

    class Test
    {  
        public static void main(String args[])
        {
            Dog d = new Dog(); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.
            Dog cs = new Dog("Bite"); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.

            // You need to Explicitly tell the java compiler to use Argument constructor so you need to use "super" key word
            System.out.println("------------------------------");
            Cat c = new Cat();
            Cat caty = new Cat("10");

            System.out.println("------------------------------");
            // Self s = new Self();
            Self ss = new Self("self");
        }
    }

    class Animal
    {
        String i;

        public Animal()
        {
            i = "10";
            System.out.println("Animal Constructor :" +i);
        }
        public Animal(String h)
        {
            i = "20";
            System.out.println("Animal Constructor Habit :"+ i);
        }
    }

    class Dog extends Animal
    {
        public Dog()
        {
            System.out.println("Dog Constructor");
        }
        public Dog(String h)
        {
            System.out.println("Dog Constructor with habit");
        }
    }

    class Cat extends Animal
    {
        public Cat()
        {
            System.out.println("Cat Constructor");
        }
        public Cat(String i)
        {
            super(i); // Calling Super Class Paremetrize Constructor.
            System.out.println("Cat Constructor with habit");
        }
    }

    class Self
    {
        public Self()
        {
            System.out.println("Self Constructor");
        }
        public Self(String h)
        {
            this(); // Explicitly calling 0 args constructor. 
            System.out.println("Slef Constructor with value");
        }
    }
1 голос
/ 09 апреля 2019

Первоначально от anser Мирко Клемм, слегка измененный для решения вопроса:

Просто для полноты: существует также блок инициализации Instance , который выполняется всегда и до вызова любого другого конструктора. Он состоит просто из блока операторов "{...}" где-то в теле определения вашего класса. Вы можете даже иметь более одного. Вы не можете вызывать их, но они похожи на код «общего конструктора», если вы хотите повторно использовать некоторый код в конструкторах, подобно вызову методов.

Так в вашем случае

{ 
  System.out.println("this is shared constructor code executed before the constructor");
  field1 = 3;
}

Существует также «статическая» версия этого для инициализации статических членов: «static {...}»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...