class Car{
class Wheel{
}
}class PlaneWheel extends Car.Wheel{
PlaneWheel(Car car){
car.super();//这里的super不是调用父类的构造函数吗?car.super不是调用car的父类了啊?
}
public static void main(String[] args){
Car car = new Car();
PlaneWheel pw = new PlaneWheel(car);
}
}
class Wheel{
}
}class PlaneWheel extends Car.Wheel{
PlaneWheel(Car car){
car.super();//这里的super不是调用父类的构造函数吗?car.super不是调用car的父类了啊?
}
public static void main(String[] args){
Car car = new Car();
PlaneWheel pw = new PlaneWheel(car);
}
}
car.super();
调用的是car的父类的构造方法
如果car没有父类,那调用的是Object类的构造方法
Object类是所有Java类的祖先。每个类都使用 Object 作为超类。
car.super();//这里的super不是调用父类的构造函数吗?car.super不是调用car的父类了啊?
外表看来是的,其实并非如此.实际上调用的是 PlaneWheel .
具体解释不清楚,楼主硬记吧.
enclosingClassHandle.super();
它提供了必要的句柄,以便程序正确编译。
内部类中隐藏一个outer指针$this,指向外围类的对象。
用java反射分析类结构时,wheel会被解析成car$wheel
另外通过运行程序,car。super()却是调用的是wheel的构造方法
class A
{
class B{}
}
A a = new A();
A.B b = a.new B();
这个和你所遇到的问题有点类似 类比一下即可
如果想要创建某个外部类的内部类的一个对象,就需要提供此外部类的一个实例的引用
然后用此引用. new 一个内部类对象,即为必须用外部类对象区创建内部类对象,
不能在没有创建外部类实例之前去实例化一个内部类对象。
对于PlaneWheel,Car中的Carwheel类是不可见的,所以你的extends 是Car.Wheel。
Car.super()是调用的Car的构造方法,即产生一个Car对象,让PlaneWheel和Wheel类建立联系。
(还有好多你都删除了,不懂再看看视频,嗯嗯,就这样)
还没明白么,再补充下。this是一个对象指针,可以指向一个对象。但super与this不同,只是告诉编辑器调用父类方法或构造器,并不是一个指针。可以用this给一个对象附值,可以return this,但绝对不能用super给对象附值或return super。
car.super(),可以分两步理解。car提供一个句柄,用于通过外围类找到内部类,super,提示调用父类构造器。
另外,java中点运算符“.”的功能有两个:一是引用类中成员,二是指示包的层次等级。
这里应该表示的是层次等级。
这句话的意思是:先拿到外围类的引用,再初始化内部类的构造器。
就好比,我们在创建内部类对象时的语法:
Car car = new Car();
Car.Wheel cw = car.new Wheel();
"c.new Wheel" 也是用 "外围类引用."的这种语法。
同样的如果你要初始化内部类的构造器,也得遵循 "外围类引用.super();"的语法,这样程序才能编译通过。
一句话,car.super()指向的就是内部类的构造器。
如果你的内部类Wheel有一个参数,那么在导出类构造器里的得写成 :car.super(参数);