2
class A { 
    int i = 1; 
    int f() { return i; } 
} 
class B extends A { 
    int i = 2;
    int @Override f() { return -i; }
} 
public class override_test { 
    public static void main(String args[]) { 
         B b = new B(); 
         A a = (A) b;               // Cast b to an instance of class A. 
         System.out.println(a.i);   // Now refers to A.i; prints 1; 
         System.out.println(a.f()); // Still refers to B.f(); prints -2; 
    } 
}

我想知道为什么 af() 仍然指的是 Bf() 而 ai 指的是 Ai

提前致谢!

4

3 回答 3

2

在java中字段不是多态的,这就是为什么a.iA.i

Whilea.f()指的是B.f()becauseb是一个对象 ob B,尽管您将其强制转换为A它意味着您将只能使用在 中声明的那些方法A

但对象仍然是 type B

因此,当您访问字段时,它基于引用类型,而当您访问方法时,它基于对象类型

于 2013-02-16T17:11:40.437 回答
0

简单的规则是当你调用一个方法时,它将是实例类型(多态性),在这种情况下实例是类型的,B即使引用是类型的A

当您调用变量时,它将位于引用的类型上。

阅读更多关于多态性

于 2013-02-16T17:09:06.077 回答
0

就是那样子。Java 实例方法调用在 C++ 术语中是虚拟的。选择的方法取决于目标对象的实际类,而不是对它的引用的类型。字段引用不是虚拟的,字段的选择取决于引用的类型。

我通常保持字段私有或受保护,并通过方法而不是直接外部访问字段来工作

于 2013-02-16T17:10:36.837 回答