Может ли "новый" использоваться внутри конструктора класса для вызова другого конструктора в Java?

Я знаю, что this(...) используется для вызова одного конструктора класса из другого конструктора. Но можем ли мы использовать new для того же?

Чтобы быть более понятным в вопросе, является ли строка-2 действительной? Если это (поскольку компилятор не подал жалобы), почему вывод null not Hello?

class Test0 {
    String name;

    public Test0(String str) {
        this.name= str;
    }

    public Test0() {
        //this("Hello");    // Line-1
        new Test0("Hello"){}; // Line-2
    }

    String getName(){
        return name;
    }
}

public class Test{
    public static void main(String ags[]){
        Test0 t = new Test0();
        System.out.println(t.getName());
    }
}

Ответ 1

Он действителен, но он создает полностью отдельный экземпляр Test0 (более конкретно, экземпляр анонимного подкласса Test0) внутри этого конструктора и не используется нигде. У текущего экземпляра все еще есть поле name, установленное на null.

public Test0() {
    // this creates a different instance in addition to the current instance
    new Test0("Hello"){};
}

Обратите внимание, что если вы вызываете оператор new с конструктором без аргументов, вы получите StackOverflowError.

Ответ 2

То, что вы пытаетесь сделать, выполняется с помощью кода, который вы закомментировали:

public Test0()
{
    this("Hello");
}

Ответ 3

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

new Test0("Hello"){};

Над строкой будет создан анонимный экземпляр класса Test0 и присвоено значение Hello переменной имени. Но поскольку вы не ссылаетесь на созданный анонимный экземпляр, он будет исчезать из строки сразу после. Таким образом, вы еще не присвоили значение переменной name экземпляра, который вызывает конкретный сегмент кода. Поэтому имя null

В памяти это похоже на

enter image description here

Ответ 4

Поскольку вы создаете новый экземпляр Test0 с именем "привет", но никогда не используете его.

public Test() {

    new Test0("hello") // nothing is referencing this new object
}

Вы просто создаете объект внутри другого конструктора, но он не будет влиять на экземпляр, создаваемый первым вызовом конструктора.

Ответ 5

Вы можете сделать это, но результат этого использования new исчезнет в конце конструктора. Особенно, t.name будет null.

Используйте this("Hello").

Ответ 6

Имя - это переменная экземпляра. Переменные экземпляра являются объектно-ориентированными.

С помощью нового Test0 ( "Hello" ); вы создаете новый экземпляр Test0.

Если вы хотите, чтобы t.getName() возвращал "Hello" [я имею в виду значение поля, не зависящее от объекта], измените поле name на static:

static String name;

Ответ 7

Вы можете отображать вывод, используя новое ключевое слово, используя код ниже. Так как вы использовали public Test0(){new Test("Hello){};" здесь {}, скобки не важны. Поэтому, когда вызывается конструктор test0()... Внутри этого конструктора test0(args); называется bt в первом конструкторе u didnot выводимый вывод.. где будет отображаться ваш "Hello", просто отредактируйте

`

public test0(String str)
{
 this.name=str;
System.out.println(str);
}`

И у вас будет желаемый выход ur.See мой код ниже.

class test01{
public test01(String str)
{System.out.println(str);
   }
public test01(){

    new test01("Print");
}
}public class Const {
public static void main(String args[])
{test01 t = new test01();

    //System.out.println(t.getName());
    }}

Результат этого кода даст требуемую строку String