Fields cannot be overridden; they can only be
hidden.
字段不会被覆盖,只会被隐藏。如果在子类中声明了与父类中完全同名的字段(与该字段是否相同类型无关),其父类中的该同名字段仍然存在,但是现在不能直接被子类使用,而需要使用super.fieldName。
当通过一个对象的引用调用一个方法时,该方法为对象的实际类中的实现,不管是通过父类引用还是子类引用,调用的方法都是子类中的实现。
当访问一个字段时,与调用方法不同,此时该字段是与该对象的引用有关的。当使用父类的引用去访问字段时,得到的是父类中该字段的值;当使用子类的引用去访问字段时,得到的是子类中该字段的值。
可以参考如下示例:
输出结果为:
Extend.show: ExtendStr
Extend.show: ExtendStr
sup.str = SuperStr
ext.str = ExtendStr
///
一个对象,有两个指向它的引用,一个是 ExtendShow类型,一个是 SuperShow类型。
调用show()方法时,会判断该对象的实际类型,该对象实际为 ExtendShow类型,所以执行的show()方法也是 ExtendShow类中定义的方法。
对于str字段的访问与指向该对象的引用的类型有关, sup.str取得的是 SuperShow类中的str值,而 ext.str取得的是 ExtendShow类中的str值。方法里面使用的字段是在定义该方法的类中声明的,如果没有声明,则是继承而来的。
字段不会被覆盖,只会被隐藏。如果在子类中声明了与父类中完全同名的字段(与该字段是否相同类型无关),其父类中的该同名字段仍然存在,但是现在不能直接被子类使用,而需要使用super.fieldName。
当通过一个对象的引用调用一个方法时,该方法为对象的实际类中的实现,不管是通过父类引用还是子类引用,调用的方法都是子类中的实现。
当访问一个字段时,与调用方法不同,此时该字段是与该对象的引用有关的。当使用父类的引用去访问字段时,得到的是父类中该字段的值;当使用子类的引用去访问字段时,得到的是子类中该字段的值。
可以参考如下示例:
- class SuperShow {
- public String str = "SuperStr";
- public void show() {
- System.out.println("Super.show: " + str);
- }
- }
- class ExtendShow extends SuperShow {
- public String str = "ExtendStr";
- public void show() {
- System.out.println("Extend.show: " + str);
- }
- public static void main(String[] args) {
- ExtendShow ext = new ExtendShow();
- SuperShow sup = ext;
- sup.show();
- ext.show();
- System.out.println("sup.str = " + sup.str);
- System.out.println("ext.str = " + ext.str);
- }
- }
Extend.show: ExtendStr
Extend.show: ExtendStr
sup.str = SuperStr
ext.str = ExtendStr
///
一个对象,有两个指向它的引用,一个是 ExtendShow类型,一个是 SuperShow类型。
调用show()方法时,会判断该对象的实际类型,该对象实际为 ExtendShow类型,所以执行的show()方法也是 ExtendShow类中定义的方法。
对于str字段的访问与指向该对象的引用的类型有关, sup.str取得的是 SuperShow类中的str值,而 ext.str取得的是 ExtendShow类中的str值。方法里面使用的字段是在定义该方法的类中声明的,如果没有声明,则是继承而来的。