通过强制调用Animal类的方法

时间:2013-07-10 05:23:05

标签: java downcast

我是Java的初学者,所以有人请说如何在Animal Through Mammal对象中调用methodA()。我无法理解为什么我们需要明确地进行向下转换和向上转换。

class Animal{
void methodA(){
    System.out.println("I m Animal");
}
}
class Mammal extends Animal{
    void methodA(){
        System.out.println("I m Mammal child class of Animal");
    }
    void methodAB(){
        System.out.println("Two child class Dog and Cat I have");
    }
}

public class UpDownCast {

public static void main(String[] args) {

Animal a = new Animal();
a.methodA();

Mammal m = new Mammal();
m.methodA();


Animal A = new Mammal();
if (A instanceof Mammal){
    A.methodA();
}
Animal A1= new Animal();
Mammal M1 =(Mammal)A1;
M1.methodA();

}
}

先谢谢。

3 个答案:

答案 0 :(得分:4)

如果您的实例为Mammal,并且您正在调用methodA()Mammal覆盖),则java会调用Mammal' s methodA()。这称为Dynamic Polymorphism

要从methodA()课程中呼叫Animal Mammal,您需要使用super类中的Mammal关键字来调用它,如下所示< / p>

class Mammal extends Animal{
    void methodA(){
        super.methodA();// --> calling Animal's methodA()
    }
    void methodAB(){
        System.out.println("Two child class Dog and Cat I have");
    }
}

此外,以下声明会导致ClassCastException Animal IS NOT A Mammal(作为哺乳动物IS A动物)

Animal A1= new Animal();
Mammal M1 =(Mammal)A1;
M1.methodA();

答案 1 :(得分:4)

how to call methodA() in Animal Through Mammal object.

为此,您必须在methodA中查看Mammal,如果您有Mammal个对象,则可以直接调用它。在这种情况下,无需进行投射。< / p>

First, you must understand,通过投射你实际上并没有改变对象本身,你只是用不同的方式标记它。

enter image description here

答案 2 :(得分:2)

如果覆盖了方法,则无法通过子类对象调用超类的方法。在你的情况下,Mammal是Animal的子类,因此当你使用Mammal对象时,JVM将首先在Mammal类中查找methodA implmentation,如果存在,那么它将调用Mammal类方法,否则将调用Animal类方法。

这个想法在继承方面是合乎逻辑的,如果孩子有一个从Parent继承的行为而有人在子上调用该行为,那么将执行子方法。如果孩子没有自己的行为,那么它只会从Parent继承它,因此将调用Parent的方法。