多态,总结起来就一句话:父类引用指向子类对象
但是对于执行流程,很多人并不是特别清楚,今天,为将通过一个例子,向大家详细解释程序的执行流程。话不多说,直接上代码:
可以直接将代码全部复制到eclipse里面,先运行一下,再仔细阅读注释里面的内容。
public class DuoTaiSample_YunXingLiuCheng {
public static void main(String[] args)
{
Super d=new Demo("A"); //父类引用指向子类对象(方法才会调用子类的,成员变量还是调用父类的)//这一行代码的执行顺序如下:
// 先执行等号右边
// 1)调用子类的对应构造器(有一个参数)(直接进入子类构造器内部)
// 进入此行代码: public Demo(String a){
// 2)默认调用父类无参构造器(但是并没有进入构造器内部)(在子类构造器中是否写super()关键字都会默认执行)
// 执行此行代码: super(); //super()写不写都会默认执行
// 3)把父类所有的成员变量copy过来,并给成员变量赋初始值(注意,子类可以声明和父类名称一样的变量名,此时子类相当于有两个名称一样变量)//进入下面这几行代码 :
// int i=100;
// int j=150;
// int k=250;
// String name="父类名字";
// 4)进入父类的无参构造器内部(如果无参构造器里面有内容的话),执行构造器内部程序。执行下面的程序:
// System.out.println("父类i的值为:"+i);
// System.out.println("B");
// i+=2; //经过此步,i的值变为102
// 5)程序执行到构造器内部时,如果对成员变量进行修改,是对 子类 成员变量进行的修改(变量已经被复制到子类了)//执行此步时,i+=2; this Demo中,i的值已经被修改了
// 6)对子类自己的变量进行初始化。执行下面的程序:
// String name ="子类名字";
// String sex = "男";
// 7)进入子类构造器内部执行子类构造器。执行下面的程序:
// System.out.println("C");
// i=i+1; //经过此步,i的值变为103
// System.out.println("子类i的值为:"+i);
// 走到这一步,才完成了等号右边 , 下一步是将 new 出的this Demo,赋给 Super d
// 注意:因为 Super(父类) 本身没有属性 sex,所以 d.sex 是无法访问的,所以下面这行代码,编译会报错。
// System.out.println(d.sex);
System.out.println(d.i); //最终输出结果,i的值是103
}
}
class Super { //Super是父类
int i=100;
int j=150;
int k=250;
String name="父类名字";
public Super() //父类Super的无参构造器
{
System.out.println("父类i的值为:"+i);
System.out.println("B");
i+=2;
}
public Super(String a) //父类Super的无参构造器
{
System.out.println("A");
i=1;
}
}
class Demo extends Super { //Demo是子类
String name ="子类名字";
String sex = "男";
public Demo(String a) //子类Demo的有参构造器
{
super();//super()写不写都会默认执行
System.out.println("C");
i=i+1;
System.out.println("子类i的值为:"+i);
}
Demo() { //子类Demo的无参构造器
}
}