Подтвердить что ты не робот

Разница между новым тестом() и новым тестом() {}

В чем разница между этими двумя способами создания новых объектов класса следующим образом:

Test t1=new Test();
Test t2=new Test(){ };

Когда я попробовал следующий код, я мог видеть, что оба объекта могут получить доступ к методу foo(), но t2 не может получить доступ к variable x (variable x не может быть разрешен):

public class Test
{ 
    int x=0;
    public void foo(){ }

    public static void main (String args[])
    {
        Test t1=new Test();
        Test t2=new Test(){ };
        t1.x=10;
        t2.x=20;
        t1.foo();
        t2.foo();
        System.out.println(t1.x+" "t2.x);
    }
}
4b9b3361

Ответ 1

Test t2=new Test(); создаст объект класса Test.

Но Test t2=new Test(){ }; создаст объект подкласса теста (т.е. анонимный внутренний класс в этом случае).

вы можете обеспечить реализацию для любого метода там, например

Test t2=new Test(){ 
public void foo(){ System.out.println("This is foo");}
};

чтобы при вызове метода foo() из объекта t2 он напечатал This is foo.

Добавление

Ошибка компиляции в коде из-за отсутствия оператора конкатенации

System.out.println(t1.x+" "+t2.x);
                          ###

Ответ 2

Тип среды выполнения обеих ссылок будет отличаться. Попробуйте:

System.out.println(t1.getClass());  // class Test
System.out.println(t2.getClass());  // class Test$1

Вы увидите другой вывод. Причина в том, что выражение new Test() { } создает экземпляр анонимного подкласса Test. Итак, Test$1 является подклассом Test.

Теперь, причина, по которой вы получаете эту ошибку, отсутствует значок +:

System.out.println(t1.x + " " + t2.x);
                              ^

Вы можете найти более подробную информацию о этом сообщении и этот пост

Ответ 3

test t1=new test();

Это создаст новый экземпляр класса test

test t2=new test(){ };  

Это анонимный внутренний класс, который расширяет класс test

Ответ 4

Test t1=new Test();

Здесь вы создаете экземпляр класса Test и назначаете его t1

Test t2=new Test(){ };

Здесь вы создали анонимный подкласс класса Test и создаете его и назначили t2

И вы сделали ошибку здесь в следующей строке, скорректировали ее, пропустили +

System.out.println(t1.x + " " + t2.x);

Ответ 5

a)

 Test t1=new Test();

Посредством этого вы создаете объект класса Test, вызывая конструктор по умолчанию

б)

Test t2=new Test(){ };

И делая это, вы создаете объект класса, который расширяет класс Test, этот класс не имеет имени и, следовательно, он называется "Анонимный внутренний класс", например.

     Test t2=new Test(){ 
// this is the body of the anonymous(un-named) class 
//you can overide the method foo() here
// you can write more methods here but you will not be able to call them 
// for example
public void doSomething(){}
};

doSomething() недоступен снаружи, поскольку t2 i.e ссылка (указатель) на этот объект (объект анонимного внутреннего класса, который расширяет Test) понимает только метод foo(), поскольку он является ссылкой на родительский класс

doSomething() можно вызвать, только если вы это сделаете

  Test t2=   new Test(){
            public void foo()
            {
              doSomething();


            }
            public void doSomething(){
                  System.out.println("Do Something");
            }

        };

то есть. явным образом вызываю doSomething() в foo() и foo() доступен снаружи

t2.foo();

Примечание. Пожалуйста, напишите имя класса правильно, первая буква класса должна быть такой, как

public class Test{}

Когда вы начинаете писать огромные куски кода, это поможет вам и другим, так как делает ваш код доступным для чтения.

Ответ 6

вы пропустите оператор + в строке ниже, попробуйте

System.out.println(t1.x+" "t2.x);

используйте этот

System.out.println(t1.x+" "+t2.x);

Ответ 7

Test t2=new Test();` 

создаст объект класса Test.

Test t2=new Test(){ };

создаст объект подкласса теста (т.е. анонимный внутренний класс в этом случае).

Test t2=new Test(){ 
public void foo(){ System.out.println("foo");}
};

когда метод foo() вызывается из объекта t2, он напечатает foo.

Ответ 8

    interface My
     {
       void show();
     }
        My my=new My(
        {
           @override
             void show()
          {
               System.out.println("Hello");
          }
     });     

Здесь мы создаем анонимный, который реализует мой интерфейс.