新Test()和新Test(){}之间的区别

Cru*_*yro 33 java anonymous-inner-class

这两种实例化类的新对象的方法有什么区别,如下所示:

Test t1=new Test();
Test t2=new Test(){ };
Run Code Online (Sandbox Code Playgroud)

当我尝试下面的代码时,我可以看到两个对象都可以访问该方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

eat*_*ode 60

Test t2=new Test(); 将创建Test类的对象.

但是Test t2=new Test(){ };会创建一个测试子类的对象(即本例中的匿名内部类).

你可以为那里的任何方法提供实现

Test t2=new Test(){ 
public void foo(){ System.out.println("This is foo");}
};
Run Code Online (Sandbox Code Playgroud)

这样当foo()从对象调用的方法t2将打印时This is foo.

加成

代码中的编译时错误是由于缺少连接运算符

System.out.println(t1.x+" "+t2.x);
                          ###
Run Code Online (Sandbox Code Playgroud)

  • @Solace不,一点也不.尝试编译该类,您将看到生成两个类文件.一个名为"Test $ 1"的名字 (4认同)
  • @eatSleepCode好吧,`t2 instanceof Test`将返回`true`,但这并不意味着`new Test(){}`会创建一个`Test`对象.不,不.子类对象总是`instanceof`所有它的超类. (2认同)

Roh*_*ain 16

两个引用的运行时类型都不同.尝试:

System.out.println(t1.getClass());  // class Test
System.out.println(t2.getClass());  // class Test$1
Run Code Online (Sandbox Code Playgroud)

你会看到不同的输出.原因是,new Test() { }表达式创建了一个匿名子类的实例Test.所以,Test$1是一个子类Test.

现在,你得到这个错误的原因是,你错过了一个+标志:

System.out.println(t1.x + " " + t2.x);
                              ^
Run Code Online (Sandbox Code Playgroud)

你可以在这篇文章这篇文章中找到更多细节


Ank*_*hag 5

test t1=new test();
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的类实例 test

test t2=new test(){ };  
Run Code Online (Sandbox Code Playgroud)

这是一个扩展类的匿名内部类 test


Abi*_*san 5

Test t1=new Test();
Run Code Online (Sandbox Code Playgroud)

在这里,您将创建一个Test类的实例并将其分配给t1

Test t2=new Test(){ };
Run Code Online (Sandbox Code Playgroud)

在这里,您创建了一个匿名子类Test并将其实例化并分配给t2

而且,你在下面的一行中犯了一个错误,纠正了它,你错过了 +

System.out.println(t1.x + " " + t2.x);
Run Code Online (Sandbox Code Playgroud)