33

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

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);
    }
}
4

7 回答 7

62

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);
                          ###
于 2014-03-04T05:56:58.183 回答
16

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

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

您可以在这篇文章这篇文章中找到更多详细信息

于 2014-03-04T05:56:07.507 回答
5
test t1=new test();

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

test t2=new test(){ };  

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

于 2014-03-04T05:56:03.370 回答
5
Test t1=new Test();

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

Test t2=new Test(){ };

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

而且,您在以下行中犯了一个错误,更正它,您错过了+

System.out.println(t1.x + " " + t2.x);
于 2014-03-04T05:58:30.200 回答
4

一个)

 Test t1=new Test();

通过这样做,您可以通过调用默认构造函数来创建类 Test 的对象

b)

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 即对这个对象(扩展 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{}

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

于 2014-03-05T05:03:28.217 回答
3

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

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

用这个

System.out.println(t1.x+" "+t2.x);
于 2014-03-04T05:59:29.733 回答
2
Test t2=new Test();` 

将创建 Test 类的对象。

Test t2=new Test(){ };

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

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

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

于 2014-03-05T06:51:17.187 回答