本帖最后由 emos-c 于 2013-6-25 09:07 编辑
对于继承,我认为可以这样理解(只是用于理解):相当于将父类中所有非私有的成员(成员变量和成员方法)复制,并在子类中粘贴了一份。所以子类中的i与父类中的i都是各自类中的变量,指的也就不是同一个变量。子类修改的也是自己类中变量i的值(参见楼上说明,本类中变量i前省略了this关键字),如果需要访问和修改父类中i的值,可以在前面加super关键词修饰,声明访问的是父类中的变量i的值。想要知道i的值是怎么变化的,就需要知道函数的加载顺序。
加载顺序:JVM读取主函数--->栈内存开辟空间,定义变量i,赋值4---> Super d=new Demo("A");--->加载super类,执行该类的static代码块(在这里没有)--->栈内存开辟空间,定义引用型变量d,堆内存中开辟空间,分配内存地址值--->new一个新对象,建立对象的特有属性--->进行默认初始化,显示初始化,构造代码块初始化(在这里也都没有)--->对对象进行对应的构造函数初始化,构造函数内第一句是访问了父类的空参数构造函数,所以跳转到父类该构造函数,执行打印“B”,i=2;--->父类执行完毕,回到子类构造函数中继续执行,打印“C”,i=5--->将内存地址赋给栈内存中的变量d,使d指向该对象--->Super d=new Demo("A");该语句至此执行完毕--->System.out.println(d.i);执行打印“5”。--->函数执行完毕。 |