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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 康子龙 中级黑马   /  2012-7-6 20:13  /  2779 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class Person {
  2.    public void eat(Apple apple) {
  3.     Apple peeled = apple.getPeeled();
  4.     System.out.println("Yummy");
  5. }
  6. }
  7. class Peeler {
  8.     static Apple peel(Apple apple) {
  9.         return apple;
  10. }
  11. }

  12. class Apple {
  13.     Apple getPeeled() {return Peeler.peel(this);}
  14. }

  15. public class PassingThis {
  16.     public static void main(Stringp[ args) {
  17.     new Person().eat(new Apple());
  18. }
  19. }

  20. /*
  21. 这里面的this看得我好糊涂啊,这里的this指的是神马啊?大虾们帮帮忙教教我呗。
  22. */


复制代码

9 个回复

倒序浏览
个人理解:
通过new Person().eat(new Apple());创建一个新的Person和apple对象,然后调用,Person和Apple类,通过getPeeled()方法,返回一个Apple对象,所以return Peeler.peel(this);里面的this应该是通过Peeler()类创建的那个Apple对象,所以this 指的是Apple
我也是菜鸟,以上所述纯属个人见解,希望可以帮到你,要是有什么错误的地方,请拍砖。

点评

捋了捋貌似明白点,那个this 好像就是 new Apple()。。。  发表于 2012-7-6 22:55
回复 使用道具 举报
田向向 发表于 2012-7-6 20:38
个人理解:
通过new Person().eat(new Apple());创建一个新的Person和apple对象,然后调用,Person和Apple ...

Peeler()没有建立对象啊。直接类名调用

点评

对对对,我这一块学的也不大好,让你见笑了,呵呵,谢谢提醒  发表于 2012-7-6 21:02
回复 使用道具 举报
这个主要就是调来调去的调的我懵了
回复 使用道具 举报
康子龙 发表于 2012-7-6 22:41
这个主要就是调来调去的调的我懵了

java编程思想里的一段代码,以前就看过没看明白,然后想起来了就又看了看还是有点糊涂啊
回复 使用道具 举报

因为this是代表本类对象的引用所以通过new Person().eat(new Apple());  创建了一个Person的对象相当于Apple a=new Apple();在把 a 当成参数传递给Person类的eat方法然后调用apple.getPeeled();在他的方法中又返回一个Peeler.peel(this)  ,this代表本类对象,也就是说peel();方法返回的还是你最初创建的那个对象new Apple(), 相当于Apple peeled=new Apple();等于绕了一大圈还是创建了一个名为peeled的Apple类对象,然后就是执行输出语句。确实挺绕的

本人见解可能还有不太到位的地方

回复 使用道具 举报
class Person {
   public void eat(Apple apple) {
    Apple peeled = apple.getPeeled();
    System.out.println("Yummy");
}
}
class Peeler {
    static Apple peel(Apple apple) {
        return apple;
}
}
class Apple {
    Apple getPeeled() {return Peeler.peel(this);}
}

public class PassingThis {
    public static void main(Stringp[ args) {
    new Person().eat(new Apple());
}
}
========================================
先自己看了一遍,果然是专门考查对this的理解的。
程序的运行从主函数开始,
1.new Person().eat(new Apple());
在堆内存中建立了一个Person对象,一个Apple对象。Person对象调用了方法eat(),并将新创建的Apple对象传入其中。
2.Apple peeled = apple.getPeeled();
Apple类型的引用peeled接收了Apple对象的getPeeled方法返回的apple对象,getPeeled方法则是把堆内存中的Apple对象传入了Peeler类的peel静态方法,peel方法直接返回了传入的Apple对象,即堆内存中的Apple对象。绕了一大圈,peeled实际上最终得到了一开始堆内存中建立的Apple对象。
3.System.out.println("Yummy");
这句话就不绕了,输出“Yummy”。
4.程序执行完毕。
回复 使用道具 举报
曹恒业 发表于 2012-7-7 12:23
class Person {
   public void eat(Apple apple) {
    Apple peeled = apple.getPeeled();

所以说,这个this应该就是传入的那个new Apple()了吧?是呗?
回复 使用道具 举报
康子龙 发表于 2012-7-7 12:30
所以说,这个this应该就是传入的那个new Apple()了吧?是呗?

当然咯,堆内存中只创建了2个对象,而传入的this又只能是Apple的对象,所以咯。。。
回复 使用道具 举报
this代表当前状态(当前状态是指:对象正在调用类中的方法)的对象下面Apple类中的apple)。
class Peeler
{
    static Apple peel(Apple apple)
    {
        return apple;
    }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马