多态,总结起来就一句话:父类引用指向子类对象

但是对于执行流程,很多人并不是特别清楚,今天,为将通过一个例子,向大家详细解释程序的执行流程。话不多说,直接上代码:

可以直接将代码全部复制到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的无参构造器
		
	}
}