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

时间:2014-03-04 05:53:04

标签: java anonymous-inner-class

这两种实例化类的新对象的方法有何不同,如下所示:

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

当我尝试以下代码时,我发现两个对象都可以访问方法foo(),但是t2无法访问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);
    }
}

7 个答案:

答案 0 :(得分:59)

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);
                          ###

答案 1 :(得分:16)

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

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

您将看到不同的输出。原因是,new Test() { }表达式创建了Test的匿名子类的实例。因此,Test$1Test的子类。

现在,您收到该错误的原因是,您错过了+标志:

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

您可以在this postthis post

上找到更多详细信息

答案 2 :(得分:5)

test t1=new test();

这将创建类test

的新实例
test t2=new test(){ };  

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

答案 3 :(得分:5)

Test t1=new Test();

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

Test t2=new Test(){ };

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

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

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

答案 4 :(得分:4)

a)

 Test t1=new Test();

通过执行此操作,您可以通过调用默认构造函数

来创建类Test的对象

b)中

Test t2=new Test(){ };

通过这样做,你创建了一个扩展Test类的类的对象,这个类没有名称,因此被称为“Anonymous Inner Class” 例如

     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即此对象的引用(指针)(扩展Test的匿名内部类的对象)仅理解foo()方法,因为它是父类的引用

只有在你这样做时才能调用doSomething()

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


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

        };

即。在foo()中显式调用doSomething(),在

之外可以访问foo()
t2.foo();

注意:请正确写出班级名称,班级的第一个字母必须是大写的

public class Test{}

当你开始编写大量代码时,它会帮助你和其他人,因为它使你的代码可读。

答案 5 :(得分:3)

你错过了下面一行的+运算符试试这个

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

使用此

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

答案 6 :(得分:2)

Test t2=new Test();` 

将创建Test类的对象。

Test t2=new Test(){ };

将创建一个test子类的对象 (即本例中的匿名内部类)。

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

当从对象t2调用foo()方法时, 它会打印foo。