哪你看这个程序片断,创建的到底是什么类的匿名实例?: public void doAnonymous() { System.out.println((new InnerInterface() { }).someConstant); ( // Anonymous class extending the inner class new InnerClass() { public void doSomething() { secret="secret is changed"; super.doSomething(); } } ).doSomething(); }
new InnerClass() { public void doSomething() { secret="secret is changed"; super.doSomething(); } } ).doSomething(); 可能这段代码这样说你会更明白点: 有一个类叫Inner,上面的代码创建了它的一个实例,然后调用它的doSomething()方法。
new Inner(){ } 这种写法是说创建了Inner类的一个匿名子类, 这样的匿名类的创建在scjp中经常会考的。 new Inner() 这才是创建Inner类的实例。 new Inner("xxx") { } 这是说把参数"xxx"通过super("xxx")通用Inner类的Constructor Inner(String parm)。
你说: new Inner("xxx") { } 这是说把参数"xxx"通过super("xxx")通用Inner类的Constructor Inner(String parm)。我还不是恨明白,能讲讲清楚吗?
new Inner("xxx") { } 这就是说在创建Inner类的一个匿名子类,任何一个类如果没有定一个constructor的话,系统会自动加上default constructor,而且任何一个constructor都存在一句话叫做:super()或者super(...),如果你自己没有写的话,系统会自动添加前者,对于匿名类,系统会自动根据创建的方式确定调用super() 还是 super(...)。 这样解释可以了吗?
也就是说new Inner("xxx") { }用的是super(XXX)构建器,对么?
liukuncn(旺旺): 是这样的。
完全正确的理解如下: Anonymous classes can implement an interface (implicit extension of Object) or explicitly extend a class. Cannot do both.new interfacename() { } <==> new super() extends Object implements interfacename or new classname(can take arg.) { }<==> new super() extends classname
public void doAnonymous()
{
System.out.println((new InnerInterface() { }).someConstant); (
// Anonymous class extending the inner class
new InnerClass()
{
public void doSomething()
{
secret="secret is changed";
super.doSomething();
}
}
).doSomething();
}
{
public void doSomething()
{
secret="secret is changed";
super.doSomething();
}
}
).doSomething();
可能这段代码这样说你会更明白点:
有一个类叫Inner,上面的代码创建了它的一个实例,然后调用它的doSomething()方法。
但是这个Inner类是继承了一个完全空的抽象类的。所以看不明白这个片断,能解释一下吗?
这样的匿名类的创建在scjp中经常会考的。
new Inner() 这才是创建Inner类的实例。
new Inner("xxx") { } 这是说把参数"xxx"通过super("xxx")通用Inner类的Constructor Inner(String parm)。
new Inner("xxx") { } 这是说把参数"xxx"通过super("xxx")通用Inner类的Constructor Inner(String parm)。我还不是恨明白,能讲讲清楚吗?
这样解释可以了吗?
or
new classname(can take arg.) { }<==> new super() extends classname