请问对于
class A{
class B{
B(){}
}
}
class C extends A.B
{
public static void main(String args[]){
new A().super();
C c=new C();
}
中的 new A().super() 应如何理解?
我试过它等价于 (new A()).super()
但我觉得这样得不到内部类B的实例.
...全文
18224打赏收藏
请教一个内部类的问题: new A().super()
请问对于 class A{ class B{ B(){} } } class C extends A.B { public static void main(String args[]){ new A().super(); C c=new C(); } 中的 new A().super() 应如何理解? 我试过它等价于 (new A()).super() 但我觉得这样得不到内部类B的实例.
你的问题归根到底是要理解inner class的含义,一个非static的inner class是instance作用域的,也就是必须在一个实例的范围内生效,因此初始化一个非static的inner class就必须指明它存在的instance域。
如果是要继承一个inner class,那么只能在构造子里指明它的Instance域,如下的代码也是可以的:
public class Outer {
class Inner {
}
}
class Test extends Outer.Inner {
static Outer outer = new Outer();
Test(){
outer.super();
}
}
从一个static的实例去调super不是更奇怪?其实不过是通过这种语法指定inner class的instance域而已,没什么奇怪的
class A {
class B{
}
}
那么通过反射你可以发现,B()这个无参构造子的参数列表长度并不是0而是1,而这个隐含的参数类型的class就是A,也就是说它需要一个a的实例,同样下面的程序中B()的参数是两个而不是1个,分别是A.class, int.class
class A {
class B{
B(int x) {
}
}
}
所以a.super(),实际上是super(a),但是由于内部类的outer实例是隐式约定,所以才使用类似a.super()的语法
new A() 当然就是先调用A的构造方法了,然后返回一个引用,这个引用有super()方法吗?
.super()为什么可以调用B的构造方法?
为什么不能以
A a=new A();
a.super();
来代替
new A().super();
既然
(new A()).super()等价于new A().super();
编译器在后面做了些什么?
这个语法是不是有点特殊?
super是调用父类的构造函数,如果你想调用A的B。
这样:class A{
class B{
B(){}
public void example()
{system.out.println("example");}
}
public static B getB()
{
rerurn new B();
}
}
class C extends A.B
{
public static void main(String args[]){
A.getB().example();
C c=new C();
}