1 在生成子类对象的时候会生成一个隐式的父类对象(不管父类对象是抽象还是具体),这个对象是在虚拟机中生成的相当于不可见(如果不生成父类对象,不对父类进行初始化,之类就无法调用父类属性)。
2 this指代对当前对象的引用这个没有问题,但是super,很多人说不能把super当做父类对象的引用,但是本质上,this和super都是一样的,都是对象的引用。区别在于,super引用的父类对象是在java虚拟机中隐式生成的,所以又不能把super当做对象的引用。
3 生成子类对象,如果没有显式的使用super调用父类构造函数,虚拟机也会替你调用的,因为如果不调用,父类就无法初始化,子类就不能正常调用父类字段和方法。
4 生成子类对象,实际上进行了两次初始化,调用两次构造函数,第一次,调用父类构造函数初始化隐式的父类对象,第二次调用,调用父类构造函数初始化子类。
5 而在子类的普通方法中使用super,只是相当于把父类的方法调到子类中执行。
package Test3; import org.omg.CORBA.PUBLIC_MEMBER; class A{ public A() { System.out.println(this.getClass().getName()); } public String method(){ return this.getClass().getName(); } } public class B extends A{ //生成B对象的时候,初始化B会调用A的构造函数来初始化B,同时也会生成隐式的A的对象,隐式的调用A的构造函数。 public String method(){ //把父类的方法调用到这里,不过是只在子类对象中执行, //而生成对象的时候构造函数会同时在父类和子类对象中执行,但是 //父类中的构造函数的执行是不可见的 System.out.println("我在这"); return super.method(); } public static void main(String args[]){ B b=new B();//在生成子类对象的时候会生成隐式的父类对象,不可见。 System.out.println(b.method()); } } 执行结果: Test3.B 我在这 Test3.B
以上理解如果有错误,请指出,谢谢了。