子类对象调用 | 上转对象调用 | 复写方法中调用 | 继承方法中调用 | |
---|---|---|---|---|
复写方法(方法存在复写) | Y | Y | Y | Y |
同名变量(成员变量只是被隐藏) | Y | N | Y | N |
- 方法可以被复写,没有this、super引用下,总是调用复写方法;
- 变量不存在复写,父类变量只是被隐藏了,没有this、super引用下,继承方法、上转对象调用隐藏变量;子类对象、复写方法调用同名变量;
- 根本原因是由于java的绑定:
- 静态绑定:依据静态类型(外观类型),例如:
- 在编译期,依据参数静态类型(静态分派),进行方法重载;
- 字段调用,依据所有者静态类型;
- 非虚方法:static静态方法、private私有方法、实例构造器、父类方法、final方法
- 动态绑定:依据实际类型,例如:
- 方法的复写(动态分派),依据方法的所有者(接收者)的实际类型;
- 静态绑定:依据静态类型(外观类型),例如: