子类可以继承父类的成员变量和方法,但是之间是有区别的。
Derived extends Base;
Base b=new Derived();
此时因为将Derived的对象赋给了Base变量,系统会自动向上转型来保证程序的正确。
此时,通过b来访问实例变量时输出的是Base(声明时类型)对象的实例变量值,如果调用方法,则调用的是Derived(运行时类型)对象的行为。
如果
Derived d = new Derived();
Base bd = d;
这意味这 bd 和 d 变量都指向了同一个java对象。因此如果判断 bd == d返回的是 true;
但是 此时 通过 d调用成员变量,调用的是 子类的成员变量。通过bd调用成员变量,调用的却是父类的成员变量。
两个指向同一个对象的变量,访问他们的实例却输出了不同的值。
这表明:bd 和 d所指向的java对象中包含了两块内存。
不管对象的声明类型是什么,调用方法时,方法的行为总是表现出他们实际类型的行为。
如果通过对象来访问他们所指向的实例变量时,这些实例的值总是表现为这些变量声明类型的行为。
这是成员变量和方法在继承时的区别
如果子类重写了父类的方法,这意味着子类定义的方法彻底覆盖了父类的同名方法,系统将不可能把父类的方法转移到子类中。
但是实例变量即使在子类中定义了与父类完全同名的实例变量,这个实例变量也依然不能覆盖父类中定义的实例变量。