这两种实例化类的新对象的方法有何不同,如下所示:
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);
}
}
答案 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$1
是Test
的子类。
现在,您收到该错误的原因是,您错过了+
标志:
System.out.println(t1.x + " " + t2.x);
^
上找到更多详细信息
答案 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。