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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 施俊 中级黑马   /  2012-3-7 15:24  /  3324 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Hello
{
        public static void main(String[] args)
        {
                new Hello(3L);
        }
        public Hello(long x)
        {
                this ((int) x);
                System.out.println("a");
        }
        public Hello(int x)
        {
                this();
                System.out.println("b");
        }
        public Hello()
        {
                System.out.println("c");
        }
}
这个代码运行结果是“cba”,发现this用法比较特殊,这里的this是直接调用了函数吗?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

10 个回复

倒序浏览
this代表就是它所在的当前对象,Hello类里this代表Hello这个类
回复 使用道具 举报
此处的this为构造方法重用,构造方法中的this调用本类中其他的构造方法,看参列,就会知道是用到了诸多重载的构造方法中的哪一个

还是发一下自个儿收藏的this的作用吧

this为一系统资源,只允许用户读而不允许写,它存放当前对象的地址(引用)

this变量有以下作用:

1. 构造方法重用:
public class Rectangle
{
public Rectangle(Location at, Shape size)
{…}
public Rectangle(Shape size,Location at)
{
  this(at, size);
}
public Rectangle(Location at)
{
  this(at, new Shape(100,100));
}
public Rectangle(Shape size)
{
  this(size, new Location(1,1));
}
public Rectangle()
{
  this(new Location(1,1), new Shape(100,100));
}
}

2、消除歧义:
class Location
{
private int x;
private int y;
public Location(int x,int y)
{
  this.x=x;
  this.y=y;
}
  ……
}

3、返回对象-链式方法调用:
public class Count
{
private int i = 0;
Count increment()
{
  i++;
  return this; //返回对象的地址,所以我们可以链式访问它
}
void print()
{
  Sop("i = " + i);
}
}
public class CountTest
{
p s v main(String[] args)
{
  Count x = new Count();
  x.increment().increment().print();
  }
}

4、作为参数传递"this”变量-进行回调:
假设有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接受一个代表其所在容器的参数。例如:
class Container
{
Component comp;
public void addComponent()
  {
   comp = new Component(this);
//代表你所创建的对象,因为它要用到.
   }
}
class Component
{
Container myContainer;
public Component(Container c)
  {
    myContainer = c;
  }
}

慢慢的就会接触到更多更深入的应用的,加油加油,与楼主更勉之!!!

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 赞一个!

查看全部评分

回复 使用道具 举报
是啊,main中,hello(3l)调用的是hell(long x) ,执行内部文件this((int) x),又调用 Hello(int x) ,执行内部语句块, this();又调用Hello()并执行内部语句块,输出C,执行完返回到Hello(int x)中继续执行并输出B,执行完内部语句块,再次返回public Hello(long x),执行剩下的语句块,输出A。 在同一个类中,可以用this代表该类。
我是这样认为的,如果有问题请指出,大家相互学习。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
彭卫红 2012-3-7 15:43:15
报纸
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
this关键字指的是当前调用方法所在的对象;

1. 在main方法中new了一个hello对象,this就等于Hello,里面传的参数(3L)是long类型的;就会找到public Hello(long x)方法;
2. public Hello(long x) 中this((int) x) 把x强转为了int型, 就又会找到public Hello(int x)方法, 而不会执行打印("a")的语句;
3. 在public Hello(int x)方法中的 this()是代表调用无参的构造函数, 在方法中如果没有定义构造函数,系统会自动生成一个无参的构造函数, 也就是public Hello()这个方法;
4. 所以先输出打印("c")的语句, 然后执行this()下面的, 也就是打印("b")的语句, 最后执行打印("a")的语句;

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
this是它所在的当前对象,,,跟我们经常用到的this.name=name...那个 this是一个意思
回复 使用道具 举报
二楼说的不准确。
没什么特殊的,是this常见的用法。
这里的this的用法是在构造方法内部引用其他的构造方法。
程序的执行过程:先是Hello(3L)调用 public Hello(long x)。在 public Hello(long x)内部,this ((int) x)调用public Hello(int x)。
                在public Hello(int x)内部,this()调用public Hello()。执行完,返回public Hello(int x),接着执行。执行完,返回public Hello(long x),接着执行。
                所以结果就是“cba”

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 赞一个!

查看全部评分

回复 使用道具 举报
this方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择相应的方法
public class Hello
{
        public static void main(String[] args)
        {
                new Hello(3L);        //这里new了一个对象,往里边传的数据是长整形的,所以要到程序中找Hello(long  x)这个方法
        }
        public Hello(long x)
        {
                this ((int) x);       //这里的this方法里,this相当于是Hello,所以可以认为this((int)x)就等于是Hello(int  x),然后需要在程序中找Hello(int  x)这方法

                System.out.println("a");
        }
        public Hello(int x)
        {
                this();             //这里的this方法里,this相当于是Hello,所以可以认为this()就等于是Hello(),然后需要在程序中找Hello()这方法
                System.out.println("b");
        }
        public Hello()
        {
                System.out.println("c");
        }
}

this可以简单的理解为,哪个对象调用this所在的方法,那么this就可以代替这个对象,这里主函数new了一个Hello方法,那么只需要简单的把this理解为是Hello就行了,然后一步步往下边找就可以了
回复 使用道具 举报
王杰 黑马帝 2012-3-8 12:08:49
10#
this关键字:
this:用于区分局部变量和成员变量同名的情况;
this为什么能解决这个问题呢?
this到底代表什么?
this就代表本类的对象;
this代表他所在函数所属对象的引用;
简单说:那个对象在调用this所在的函数,this就代表那个对象。
肯定有一个对象在运行,运行时是哪一个对象this就代表哪个。
看到this就想到this代表一个对象,谁引用他他就代表谁。
this();
this语句用于构造函数之间进行互相调用;
this语句只能定义在构造函数的第一行,因为初始化要先执行。

this的用法:用于区分同名变量;用于构造函数间调用;一般函数是不能直接调用构造函数的,this语句是不能用在一般函数中的。只能用在构造函数间。
回复 使用道具 举报
本帖最后由 高宜 于 2012-6-5 15:12 编辑
逄焕玮 发表于 2012-3-7 15:35
此处的this为构造方法重用,构造方法中的this调用本类中其他的构造方法,看参列,就会知道是用到了诸多重载 ...

解释的详尽,但是有一点不懂,关于用this为构造方法重用能详细解释下吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马