在动物类中的以下代码中,当我删除 ClimbTrees()方法时,为什么会生成错误
public class Refr1
{
public static void main(String[] args)
{
Animal objChimp = new Chimp();
objChimp.ClimbTrees();
}
}
class Animal
{
void ClimbTrees()
{
System.out.println("I am Animal Which Climb Tree");
}
}
class Chimp extends Animal
{
void ClimbTrees()
{
System.out.println("I am Chimp Which Climb Tree");
}
}
如果我删除动物类中的 ClimbTrees(),则显示以下错误
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method ClimbTrees() is undefined for the type Animal
答案 0 :(得分:1)
when I remove the ClimbTrees() Method why is it generating Error
这很简单,因为使用objChimp
实例可以调用Animal
类中的方法。由于ClimbTrees()
方法不在Animal
类,因此您收到此错误。
修改强> 我想你正试图学习压倒性和多态性。您应该获得更多详细信息here。在你的情况下,下面是真的。我没有在下面的例子中向你解释为什么我将留给你研究。
// a. You can call only methods/variables is Animal class using objChimp instance
// b. If you are calling overridden methods, the method in Chimp class will be called in run time
Animal objChimp = new Chimp();
// a. You can call methods/variables both in Animal class and Chimp class using objChimp instance
// b. If you are calling overriden methods, the method in Chimp class will be called in runtime
Chimp objChimp = new Chimp();
答案 1 :(得分:1)
这是你将得到的错误 - 方法ClimbTrees()未定义为Animal类型。 为什么会这样?
编译器检查objChimp的静态类型。这是动物。动态类型的objChimp是Chimp。
编译器首先检查静态类型objChimp中是否存在名为ClimbTrees()的方法。如果找不到,则会抛出错误。但是,当您不删除该方法时,编译器会看到静态类型并找到ClimbTrees()。只有在找到它时,它才会让你编译代码。在运行时,它检查动态类型objChimp中是否还有ClimbTrees()。如果找到,则执行黑猩猩的ClimbTrees()而不是动物的ClimbTrees()。如果没有找到,则执行静态类型objChimp的ClimbTrees(),即Animal的ClimbTrees()(注释黑猩猩的爬树,看看会发生什么)。
备注 -
答案 2 :(得分:0)
由于objChimp
是从Animal
类型声明的,因此您只能使用您有权访问的Animal
属性/方法。如果要从子项调用特定属性/方法,则应该向下转发它。这可以使您的代码正常工作(假设您从ClimbTrees
类中删除了Animal
方法):
Animal objChimp = new Chimp();
((Chimp)objChimp).ClimbTrees();
但是,您必须确保可以将课程转发到特定课程。查看Downcasting in Java了解详情。