java继承中继承成员变量和继承方法的区别
我们都知道java继承中子类会继承父类的变量和方法,那么我们来看一段简单的代码请你看看运行结果与想的是否相符



请试着看图3的运行打印结果:
.
.
.
.
结果是 2,2; 20, 20; 2,20;2, 20;
跟你的答案是否有出入呢?什么你说我第三和第四组结果错了,应该都是20, 20;!嘿嘿代码很简单,你敲一下试试嘛 :)
运行结果出来了吧,怎么样,嘿嘿。
我们来说下这个东东,第一组2,2;和第二组的20, 20;肯定是没疑问了。第三组明明是父类引用Base指向子类对象Derived,那么bd.count 怎么会是父类中的值2而不是子类中的20呢?
从java编译的角度来说:
如果子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。
对于实例变量(成员变量)来说则不存在这样的现象,即使子类中定义了与父类完全同名的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量
从内存角度来说:
图 3,17行子类Derived初始化先在内存里为其分配内存空间,一块是其本身的count分配空间,一块是其父类变量count分配的空间,默认值都是0。然后会调用它的构造方法进行赋值操作,并且会先隐式调用父类构造方法,所以过程是先隐式调用了Base的构造方法将内存里代表父类count的内存块赋值为2,再在子类构造方法中将内存里代表子类count的内存块赋值为20;如图

子类初始化后在堆内存中会有子类对象的空间,里面包含子类本身的实例变量和它所有父类的成员变量。内存中是没有父类对象的;
因为继承成员变量和继承方法之间这样的差别,所以对于一个引用类型的变量而言,
当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于该变量的声明类型;
当通过该变量来调用它所引用的对象的方法时,该方法取决于它实际引用的对象的类型。
所以图 3 的17行bd是以Base声明的,所以bd.count访问的是内存中代表父类count的内存块的值,即2。db.display()因为db实际引用的是Derived对象,所db.display()调用的是子类Derived的display()方法;
同理可以分析第四组的值;