我是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();
}
}
先谢谢。
答案 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,通过投射你实际上并没有改变对象本身,你只是用不同的方式标记它。
答案 2 :(得分:2)
如果覆盖了方法,则无法通过子类对象调用超类的方法。在你的情况下,Mammal是Animal的子类,因此当你使用Mammal对象时,JVM将首先在Mammal类中查找methodA implmentation,如果存在,那么它将调用Mammal类方法,否则将调用Animal类方法。
这个想法在继承方面是合乎逻辑的,如果孩子有一个从Parent继承的行为而有人在子上调用该行为,那么将执行子方法。如果孩子没有自己的行为,那么它只会从Parent继承它,因此将调用Parent的方法。