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

2022-09-01 08:00:36

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

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

当我尝试以下代码时,我可以看到两个对象都可以访问该方法,但t2无法访问( 无法解析):foo()variable xvariable 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);
    }
}

答案 1

Test t2=new Test();将创建测试类的对象。

但是将创建测试子类的对象(即在这种情况下为匿名内部类)。Test t2=new Test(){ };

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

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

这样,当从对象调用方法时,它将打印 。foo()t2This 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() { }TestTest$1Test

现在,您收到该错误的原因是,您缺少一个标志:+

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

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


推荐