抱歉,刚才复制了看视频时记下的笔记粘帖了直接发了。。。。。{:2_33:}。编译的时候是看父类中有没有num这个成员变量,你的代码里有,所以编译通过了;至于运行时的值, Fu f = new Zi();由这句代码,创建的子类对象被提升成了父类型,所以引用成员变量num时是引用父类的num成员变量值;另外,关于有几个num变量的问题,我觉得只有一个,因为只创建了一个子类对象,其中不可能有两个同名变量,父类的num成员变量是被继承了的,在 Fu f = new Zi();这句代码的前提下,不会有如何区分的困扰,因为子类型已经被提升成了父类型。
当在执行Fu f = new Zi()时,做为多态的特点:
当f.num引用F去查找NUM值时,因为是父类引用,它是先从父类中开始进行查找,如果本类中有NUM值,就直接打印本类的值,如果没有就才去查找子类NUM。也就是说,在多态中,成员变量无论是在编译还是运行是,数据查找都是以引用型变量所属的类为先。
如换成Zi f = new Zi()
NUM值打印的就成了子类NUM值
当在执行Fu f = new Zi()时,做为多态的特点:
当f.num引用F去查找NUM值时,因为是父类引用,它是先从父类中开始进行查找,如果本类中有NUM值,就直接打印本类的值,如果没有就才去查找子类NUM。也就是说,在多态中,成员变量无论是在编译还是运行是,数据查找都是以引用型变量所属的类为先。
如换成Zi f = new Zi()
NUM值打印的就成了子类NUM值