这个我看视频的时候也是模棱两可,现在总结一下,和大家分享;
这个应该主要是子类对象的实例化过程,我想只要这个过程清晰了,其它的过程,就了解了。
下面以小程序的方式说明:[code=java]class ;P erson
{
public String name = "unkonwn";
public int age = -1;
public ;P erson()
{
}
public ;P erson(String name,int age)
{
this.name = name;
this.age = age;
}
public void getInfo()
{
System.out.println("name= " + name +"\n" + "age = " + age);
}
}
class Student extends ;P erson
{
public String school = "unkonwn";
public Student()
{
super();
}
public Student(String name, int age)
{
super(name,age);
}
public Student(String name,int age ,String school)
{
this(name,age);
this.school = school;
}
public void study()
{
}
}
class TestStudent
{
public static void main(String [] args)
{
Student st = new Student("xiaobai",20,"Ncist");
st.getInfo();
}
} [/code]
分析:
1)当new Student 对象时,会在内存中产生一个Student 对象,产生该对象以后,为该对象分配存储空间,并进行默认的初始化,即name,age,school分别设置为 Null,0,Null;
2)绑定构造方法的参数,"xiaobai",20,"Ncist" 是传递的实际参数,编译器会将这些实际参数传递给构造方法Student(String name,int age ,String school)的形式参数,即形式参数即name,age,school分别设置为 xiaobai,20,Ncist;
3)编译器不会直接执行构造方法,在执行构造方法之前,编译器首先检查是否存在 this 调用,即是否调用其它的构造函数,若存在,程序便去执行this调用的其它构造函数,执行的过程也是同样的过程。例如:Student 类在执行 Student(String name,int age ,String school) 构造方法时,方法中存在 this(name,age)调用,继而程序执行 Student(String name, int age) 构造方法,执行结束后,继续执行Student(String name,int age ,String school) 构造方法中的其它程序代码;
4)如果构造方法中不存在 this 调用,便去调用父类的构造方法,调用父类的构造方法分为隐式调用和显示调用两种,如果构造方法中没有 super (),系统会默认为该构造方法加上 super(),此种调用称为隐式调用。如:构造方法 Student(String name, int age) 中没有 super(name,age) ,系统会默认的加上 super()。构造方法中明确写出了super()这种调用称为显示调用。父类的构造方法又按照以上流程执行。显示或隐式调用父类的构造方法一直追溯到Object 类为止。
5)当父类的构造方法执行完成以后,又回到子类的构造方法上来。子类的构造方法继续往下执行。
子类构造方法的执行过程:
对实例变量进行显示的初始化;如:Student(String name,int age ,String school)构造方法,在执行完 super() 构造方法后,程序会执行 public String school = "unkonwn"; 对school 进行显示的初始化;
执行完显示初始化的语句后,才真正开始执行构造方法体中自己的代码,即 this.school = school 至此,子类对象的实例化过程完成。 |