黑马程序员技术交流社区

标题: 方法的调用问题 [打印本页]

作者: て淡莣了陌生    时间: 2013-4-25 09:23
标题: 方法的调用问题
class Test1
{
        public static void main(String[] args)
        {
                Person p=new Person();
                Dog dog =new Dog();
                p.show(dog);
        }
}

class Person
{
        void eat(){
                System.out.println("人吃肉");
        }
        void show(Dog dog){
                eat();
        }
}

class Dog
{
        void eat(){
                System.out.println("狗吃骨头");
        }
}       
这段代码调用eat()方法时为什么不是调用的class Dog中的eat()方法,求解释!
作者: 高新星    时间: 2013-4-25 09:30


  1. class Test {
  2.         public static void main(String[] args) {
  3.                 Person p = new Person();
  4.                 Dog dog = new Dog();
  5.                 p.show(dog);
  6.         }
  7. }

  8. class Person {
  9.         void eat() {
  10.                 System.out.println("人吃肉");
  11.         }

  12.         void show(Dog dog) {
  13.                 eat();                        //省略了this.;调用的是本类对象的eat()方法
  14.                 dog.eat();        //要调用dog中的eat()就应该使用dog的对象,
  15.         }
  16. }

  17. class Dog {
  18.         void eat() {
  19.                 System.out.println("狗吃骨头");
  20.         }
  21. }
复制代码

作者: 刘胜寒    时间: 2013-4-25 09:52
Person类要调用Dog的eat方法时,要先创建Dog类的实例,然后实例名.eat();这样才会调用Dog的吃骨头。
否则只是调用本类的成员函数eat();
其实就是this.eat();
作者: 郭军亮    时间: 2013-4-25 10:03
class Test1
{
        public static void main(String[] args)
        {
                Person p=new Person();
                Dog dog =new Dog();
                p.show(dog);
        }
}

class Person
{
        void eat(){
                System.out.println("人吃肉");
        }
        void show(Dog dog){
                eat();// 这里调用的是默认的Person类的eat()方法。要想调用dog类的eat()方法,需要在前面加上类名,如dog.eat().

        }
}

class Dog
{
        void eat(){
                System.out.println("狗吃骨头");
        }
}   
你在person类中调用的eat()方法就默认是Person的类方法,即this.eat()方法。想调用Dog类的方法要用dog.eat()才可以的。     



作者: harborbest    时间: 2013-4-25 10:42
class Person
{
        void eat(){
                System.out.println("人吃肉");
        }
        void show(Dog dog){
                eat(); //这里其实jvm在解析的时候,你什么都没加,它先从自身类里边找这个方法,有就调用了。如果想要调用Dog里边的那么你必须这样写dog.eat(),这样你就告诉jvm我要调用的是dog里边的方法

        }
}


作者: 袁梦希    时间: 2013-4-25 14:26
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}

作者: 孙金鑫    时间: 2013-4-25 15:56
本帖最后由 孙金鑫 于 2013-4-25 15:58 编辑
  1. class Test1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Person p=new Person();
  6.                 Dog dog =new Dog();
  7.                 p.show(dog);
  8.         }
  9. }

  10. class Person
  11. {
  12.         void eat(){
  13.                 System.out.println("人吃肉");
  14.         }
  15.         void show(Dog dog){
  16.                 eat();    //如果用dog的eat方法,这里需要用dog.eat()。这里你写的eat调用的是class Person本类的eat方法。
  17.         }
  18. }

  19. class Dog
  20. {
  21.         void eat(){
  22.                 System.out.println("狗吃骨头");
  23.         }
  24. }        
复制代码

作者: hacket    时间: 2013-4-25 16:57
  1. void show(Dog dog){
  2.        eat();
  3. }
复制代码
eat()其实是省略了this关键字,this.eat();
作者: 吴波    时间: 2013-4-25 17:16
Person p=new Person();
Dog dog =new Dog();
p.show(dog);
p.show()调用的是Person对象里面的show函数,然后传的一个参数进去,接着又调用了本类中的eat()其实前也省略了this关键字
也可以这么理解:方法先从本类中找,找不到,再从其他类中找。
作者: 蒋名勇    时间: 2013-4-25 21:08
你没有调到dog的eat()方法,是因为,你只是把dog对象通过参数的形式传了进去,但是没有调用对象来调方法,自然就不可能有你说的那种效果咯
作者: 黄玉昆    时间: 2013-4-25 23:10
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
作者: 郑才熹    时间: 2013-4-26 10:47
构造方法相互调用时this(这里省略了this)指代本类类名。因为Person类里面定义了eat()方法,当调用show方法时,先在本类找,正好Person类中有eat()方法,就直接调用了。当Person类中没有时,就会在其他类中查找,此时才会调用Dog类中的eat()方法。如果想直接调用Dog类中的eat(),就需要把Person类中的eat()变为Dog.eat()。
希望能帮到你!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2