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)
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)
test t1=new test();
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的类实例 test
test t2=new test(){ };
Run Code Online (Sandbox Code Playgroud)
这是一个扩展类的匿名内部类 test
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)