0

我正在尝试了解动态方法调度。

class A {
int i=10;
void callme() {
    System.out.println("Inside A's callme method");
} }
class B extends A {
int j=20;
    void callme() {
        System.out.println("Inside B's callme method");
} }
class C extends A {
int k=30;
void callme() {
    System.out.println("Inside C's callme method");
} }
class  Over_riding_loading{
    public static void main(String args[]) {
        A a = new A(); 
        B b = new B(); 
        C c = new C(); 
        A r; 
        B r; //error when i am using this instead of A r;
        C r; //error when i am using this instead of Ar and B r;
        r = a;

        r.callme();
        System.out.println(r.i);//prints 10
        r = b; 
        r.callme(); 
        System.out.println(r.j);//j cannot be resolved or is not a field--what does this mean?
        r = c; 
        r.callme();
        System.out.println(r.k);//k cannot be resolved or is not a field
} }

为什么会显示错误?为什么我不能创建 B 或 C 类型的变量 r 并调用 callme() 方法?

编辑:为了澄清一些事情,我不想使用相同的变量名,我想说的是,而不是 A r; 我正在尝试使用 B r 并保持其余代码相同。

4

3 回答 3

2

不同类型的变量名不能相同(在同一范围内)

将您的主要方法修改为

   public static void main(String args[]) {
    A a = new A();
    B b = new B();
    C c = new C();
    A r;
    //you cannot have same variable name for different types (in same scope)
    //B r; // error
    //C r; // error
    r = a;

    r.callme();
    System.out.println(r.i);// prints 10
    r = b;
    r.callme();

    //here you're getting error because object is available at runtime, what you are getting is a compile time error
    System.out.println(r.j);// can be resolved by casting it as System.out.println(((B)r).j)
    r = c;
    r.callme();
    // here you're getting error because object is available at runtime, what you are getting is a compile time error
    System.out.println(r.k);// can be resolved by casting it as System.out.println(((C)r).k);
}

希望能帮助到你 !!

于 2020-04-29T04:07:36.590 回答
0

在运行时,它取决于被引用对象的类型(而不是引用变量的类型),它决定了将执行哪个版本的覆盖方法。

超类引用变量可以引用子类对象。这也称为向上转换。Java 使用这一事实来解决在运行时对覆盖方法的调用。但反之亦然。

声明B r1C r2 。您为所有三个类指向相同的变量名称。

通过 r= b 您将 A 对象引用到 r(因为 r 已经通过 A 引用r=a)。因此,当您调用r.j它时会出错,因为 j 是 B 对象的属性。

案例的解释r.k也一样

于 2020-04-29T04:07:02.523 回答
0

B r; //错误 C r; //错误

出现上述错误是因为您试图对r不同的类类型 A、B 和 C 使用相同的变量名。由于首先使用了 A,因此它在编译时注册以及任何后续尝试更改variable rend的类型在给出编译时错误。

System.out.println(rj); System.out.println(rk);

这些错误发生在编译时,因为在编译期间variable jvariable kclass A. 发生这种情况是因为您variable r的类型为 A。如果您想访问variable jand variable k,请分别variable r转换为class B& class C

希望这可以帮助!

于 2020-04-29T04:08:41.790 回答