Конструктор, содержащий другой конструктор того же класса / объекта

У меня класс SomeClass со следующими полями-членами и конструкторами

private int someInt;
private String someStr;
private String strTwo;

//the contructors
public SomeClass() {}

// second constructor
public SomeClass(int someInt, String someStr) {
    this.someInt = someInt;
    this.someStr = someStr;
}

// my emphasis here
public SomeClass(int someInt, String someStr, String strTwo) {
    // can i do this
    new SomeClass(someInt, someStr); // that is, calling the former constructor
    this.strTwo = strTwo;
}

Будет ли третий конструктор создавать тот же объект, что и:

public SomeClass(int someInt, String someStr, String strTwo) {
    this.someInt = someInt;
    this.someStr = someStr;
    this.strTwo = strTwo;
}

3 ответа

Решение

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

public SomeClass(int someInt, String someStr, String strTwo) {
    // Yes you can do this
    this(someInt, someStr); // calling the former constructor
    this.strTwo = strTwo;
}

Вместо этого вам нужно использовать ключевое слово "this" в третьем конструкторе:

public SomeClass(int someInt, String someStr, String strTwo) {
// can i do this
this(someInt, someStr); // that is, calling the former constructor
this.strTwo = strTwo;

}

Тогда это должно иметь тот же результат, да.

Нет, по крайней мере, не так, как вы написали.

Ваш третий конструктор создает new объект, а затем устанавливает переменную-член strTwo из этого this объект. По сути, вы имеете дело с двумя отдельными объектами здесь. Объект вы new в третьем конструкторе будет сборка мусора, потому что после выхода из конструктора нет ссылки на него.

//This function is called when creating a new object with three params
public SomeClass(int someInt, String someStr, String strTwo) {
    new SomeClass(someInt, someStr); //Here you create a second new object
    //Note that the second object is not set to a variable name, so it is
    //immediately available for garbage collection
    this.strTwo = strTwo; //sets strTwo on the first object
}

Если ваша цель состоит в том, чтобы создать один объект, который функционально совпадает с объектом, созданным конструктором с двумя параметрами, вы должны сделать это:

public SomeClass(int someInt, String someStr, String strTwo) {
    this.SomeClass(someInt, someStr);
    this.strTwo = strTwo;
}

Это будет эквивалентный код выполнению всех наборов полей-членов в одной функции, с незначительным изменением того, как на самом деле конструкция объекта достигает этого конечного продукта. Как всегда, обратите внимание, что объекты, созданные между этими двумя функциями, будут одинаковыми, но НЕ "одним и тем же" объектом: то есть они будут указывать на разные места в памяти, которые содержат одинаковые значения. "то же самое" может быть хитрым словом, используемым при разговоре об объектах.

Другие вопросы по тегам