A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-25 09:23  /  1534 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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()方法,求解释!

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

11 个回复

倒序浏览


  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
Person类要调用Dog的eat方法时,要先创建Dog类的实例,然后实例名.eat();这样才会调用Dog的吃骨头。
否则只是调用本类的成员函数eat();
其实就是this.eat();
回复 使用道具 举报
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()才可以的。     


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
class Person
{
        void eat(){
                System.out.println("人吃肉");
        }
        void show(Dog dog){
                eat(); //这里其实jvm在解析的时候,你什么都没加,它先从自身类里边找这个方法,有就调用了。如果想要调用Dog里边的那么你必须这样写dog.eat(),这样你就告诉jvm我要调用的是dog里边的方法

        }
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}
回复 使用道具 举报
本帖最后由 孙金鑫 于 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. }        
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
hacket 高级黑马 2013-4-25 16:57:48
8#
  1. void show(Dog dog){
  2.        eat();
  3. }
复制代码
eat()其实是省略了this关键字,this.eat();
回复 使用道具 举报
吴波 中级黑马 2013-4-25 17:16:28
9#
Person p=new Person();
Dog dog =new Dog();
p.show(dog);
p.show()调用的是Person对象里面的show函数,然后传的一个参数进去,接着又调用了本类中的eat()其实前也省略了this关键字
也可以这么理解:方法先从本类中找,找不到,再从其他类中找。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你没有调到dog的eat()方法,是因为,你只是把dog对象通过参数的形式传了进去,但是没有调用对象来调方法,自然就不可能有你说的那种效果咯
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
构造方法相互调用时this(这里省略了this)指代本类类名。因为Person类里面定义了eat()方法,当调用show方法时,先在本类找,正好Person类中有eat()方法,就直接调用了。当Person类中没有时,就会在其他类中查找,此时才会调用Dog类中的eat()方法。如果想直接调用Dog类中的eat(),就需要把Person类中的eat()变为Dog.eat()。
希望能帮到你!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马