调用方法按引用类型

时间:2013-03-30 01:30:09

标签: java

动物类中的以下代码中,当我删除 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

3 个答案:

答案 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()(注释黑猩猩的爬树,看看会发生什么)。

备注 -

http://en.wikipedia.org/wiki/Type_system

答案 2 :(得分:0)

由于objChimp是从Animal类型声明的,因此您只能使用您有权访问的Animal属性/方法。如果要从子项调用特定属性/方法,则应该向下转发它。这可以使您的代码正常工作(假设您从ClimbTrees类中删除了Animal方法):

Animal objChimp = new Chimp();
((Chimp)objChimp).ClimbTrees(); 

但是,您必须确保可以将课程转发到特定课程。查看Downcasting in Java了解详情。