Конструктор, содержащий другой конструктор того же класса / объекта
У меня класс 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;
}
Это будет эквивалентный код выполнению всех наборов полей-членов в одной функции, с незначительным изменением того, как на самом деле конструкция объекта достигает этого конечного продукта. Как всегда, обратите внимание, что объекты, созданные между этими двумя функциями, будут одинаковыми, но НЕ "одним и тем же" объектом: то есть они будут указывать на разные места в памяти, которые содержат одинаковые значения. "то же самое" может быть хитрым словом, используемым при разговоре об объектах.