更正:
不好意思,我又试验了一下,super并不能引用子类成员方法,修改如下:
根据我的理解,首先说一下对象的构造过程:
1.首先从根类到直接父类依次执行父类的构造方法(没有显示调用构造方法的情况下),这个过程执行父类成员的初始化。
2.最后调用本类的构造方法。
以上两步的结果是创建了本类对象,这个对象如图:
从图中可知,压根没有父类对象,只有子类对象,而且this完全引用这个对象,super只是引用了这个对象中从父类继承来的成员,也就是说,除了super不能访问子类定义的成员之外,super和this是同一个对象,这可以通过toString()方法验证(如果子类没有重写toString()方法,则调用父类的该方法,如果父类没有,再找父类的父类,直到Object的toString()方法)。
Object类toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass 和 getName 都是Object类的方法。
总之,没有super这个对象,他只是引用了子类对象的一部分数据,所有无法输出super。
那么为什么能输出super.toString()呢,原因在前面图中,这个调用过程是先试图调用从子类对象中直接父类继承的toString方法(注意:super.toString()是显式调用),如果没有则向上追述知道Object。
根据我的理解,首先说一下对象的构造过程:
1.首先从根类到直接父类依次执行父类的构造方法(没有显示调用构造方法的情况下),这个过程执行父类成员的初始化。
2.最后调用本类的构造方法。
以上两步的结果是创建了本类对象,这个对象如图:
![](http://img.bbs.csdn.net/upload/201407/19/1405705661_864502.png)
从图中可知,压根没有父类对象,只有子类对象,而且this完全引用这个对象,super只是引用了这个对象中从父类继承来的成员,也就是说,除了super不能访问子类定义的成员之外,super和this是同一个对象,这可以通过toString()方法验证(如果子类没有重写toString()方法,则调用父类的该方法,如果父类没有,再找父类的父类,直到Object的toString()方法)。
Object类toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass 和 getName 都是Object类的方法。
总之,没有super这个对象,他只是引用了子类对象的一部分数据,所有无法输出super。
那么为什么能输出super.toString()呢,原因在前面图中,这个调用过程是先试图调用从子类对象中直接父类继承的toString方法(注意:super.toString()是显式调用),如果没有则向上追述知道Object。