链接继承时的输出

Nai*_*ain -2 java inheritance casting

class Monster {
    boolean frighten(int x) {
        System.out.println("Monster");
        return true;
    }
}

class Vampire extends Monster {
    boolean frighten(byte x) {
        System.out.println("Vampire");
        return true;
    }
}

class Dragon extends Monster {
    boolean frighten(int x) {
        System.out.println("Dragon");
        return true;
    }
}


class Sample {
    public static void main(String s[]) {
        Monster[] inst = new Monster[3];
        inst[0] = new Monster();
        inst[1] = new Vampire();
        inst[2] = new Dragon();

        for (int i = 0; i < 3; i++) {
            inst[i].frighten(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行与上面的代码x作为intMonsterDragon类,代码工作在我所期望的方式很好.但是,当我通过将xfrom 的类型更改为in 或classes int来运行代码时,它将打印以下内容: longMonsterDragon

Monster                           
Monster                                 
Monster                                   
Run Code Online (Sandbox Code Playgroud)

有人可以解释输出背后的逻辑吗?

Mak*_*oto 8

你没有传递byte给你的实例Vampire; 你正在传递int你的循环.因为Monster接受int,它就是所谓的.

实际上,您正在重载方法,而不是覆盖它 - 您有一个具有相同名称和两个相同签名的方法.

在覆盖方法时,你真的应该使用同类型,这样你就不会遇到这样的问题.有效地:改变frightenin 的签名Vampire来接受int而不是a byte.

使用注释方法@Override将让编译器帮助选择这样的东西.

// Would cause a compilation error since the method isn't overridden
@Override
public boolean frighten(byte x) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • @Nain:我不会称之为"工作正常",因为代码的意图是调用某些类"怪物"的"吓唬".这是我可以看到的最明显的问题,因为你没有看到"吸血鬼",因为你已经重载了你的方法而不是覆盖它. (2认同)