/**
* Description:<br>
* 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a><br>
* Copyright (C), 2001-2022, Yeeku.H.Lee<br>
* This program is protected by copyright laws.<br>
* Program Name:<br>
* Date:<br>
* @author Yeeku.H.Lee kongyeeku@163.com 公众号: fkbooks<br>
* @version 1.0
*/
class Base
{
int count = 2;
public void display()
{
System.out.println(this.count);
}
}
class Derived extends Base
{
int count = 20;
@Override
public void display()
{
System.out.println(this.count);
}
}
public class FieldAndMethodTest
{
public static void main(String[] args)
{
// 声明、创建一个Base对象
Base b = new Base(); // ①
// 直接访问count实例变量和通过display访问count实例变量
System.out.println(b.count);
b.display();
// 声明、并创建一个Derived对象
Derived d = new Derived(); // ②
// 直接访问count实例变量和通过display访问count实例变量
System.out.println(d.count);
d.display();
// 声明一个Base变量,并将Derived对象赋给该变量
Base bd = new Derived(); // ③
// 直接访问count实例变量和通过display访问count实例变量
System.out.println(bd.count);
bd.display();
// 让d2b变量指向原d变量所指向的Dervied对象
Base d2b = d; // ④
// 访问d2b所指对象的count实例变量
System.out.println(d2b.count);
}
}
继承成员变量和继承方法之间存在这样的差别 ,所以对于一个引用类型的变直而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明该变量时的类型(Base bd = new Derived(); 这个声明的类型是指Base 父类 ):当通过该变量来调用所引用的对象的万法时,该方法行为取决于它所头际引用的对象的类型(Base bd = new Derived(); 这个实际引用的类型是指Derived 子类)
也就是 说 父类引用指向 子类时
当父类和子类都有相同变量时,会优先调用父类,当子类重写父类方法时,优先调用 子类