黑马程序员技术交流社区

标题: java新手对this的问题,不是很理解 [打印本页]

作者: 张天强    时间: 2012-6-11 01:24
标题: java新手对this的问题,不是很理解
对this不是很了解,很多地方又没有很好的总结,谁总结好的我学习学习
作者: 江南    时间: 2012-6-11 01:29
this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!
下面用一个例子来说明这三中用法[code=java]package cn.itcast.heima;
public class ThisTest {
    private int i=0;
    //第一个构造器:有一个int型形参
    ThisTest(int i){
       this.i=i+1;//此时this表示引用成员变量i,而非函数参数i
       System.out.println("Int constructor i——this.i:  "+i+"——"+this.i);
       System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
       //从两个输出结果充分证明了i和this.i是不一样的!
    }
    //  第二个构造器:有一个String型形参
    ThisTest(String s){
       System.out.println("String constructor:  "+s);
    }
    //  第三个构造器:有一个int型形参和一个String型形参
    ThisTest(int i,String s){
       this(s);//this调用第二个构造器
       //this(i);
       /*此处不能用,因为其他任何方法都不能调用构造器,只有构造方法能调用他。
       但是必须注意:就算是构造方法调用构造器,也必须为于其第一行,构造方法也只能调
       用一个且仅一次构造器!*/
       this.i=i++;//this以引用该类的成员变量
       System.out.println("Int constructor:  "+i+"/n"+"String constructor:  "+s);
    }
    public ThisTest increment(){
       this.i++;
       return this;//返回的是当前的对象,该对象属于(ThisTest)
    }
    public static void main(String[] args){
       ThisTest tt0=new ThisTest(10);
       ThisTest tt1=new ThisTest("ok");
       ThisTest tt2=new ThisTest(20,"ok again!");
      
       System.out.println(tt0.increment().increment().increment().i);
       //tt0.increment()返回一个在tt0基础上i++的ThisTest对象,
       //接着又返回在上面返回的对象基础上i++的ThisTest对象!
    }
}[/code]
要学会自己多多总结 这是我之前的笔记希望对你有帮助
作者: wangxinyu    时间: 2012-6-11 01:39
楼上总结的好!楼主你太懒了
作者: 一生一世    时间: 2012-6-11 07:27
楼上的呀,真懒,百度都不会吗?百度文库里面有呀,不好意思哈,一不小心看到的
作者: 郑冬    时间: 2012-6-11 07:37
    this关键字总是指向调用该方法的对象,根据this出现位置的不同,this作为对象的默认引用有两种情形:1.构造器中引用该构造器执行初始化的对象2,在方法中引用调用该方法的对象。
    this关键字最大的作用就是让类中一个方法,访问该类的另一个方法和属性。
    this可以代表任何对象,当this出现在某个方法体时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的对象只能是当前类:只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this就代表谁。
    static修饰方法中不能使用this引用。
    大部分时候,普通方法访问其它方法,属性时无须使用this前缀,但如果方法里有个局部变量和属性同名,但程序又需要在该方法里访问这个被覆盖的属性,则必须使用this前缀。除此之外,this引用也可以用于构造器中作为默认引用,由于构造器是直接使用new关键字来调用,而不是使用对象来调用,所以this在构造器中引用的是该构造器进行初始化的对象。
    与普通方法类似,在构造器中使用其他属性和方法的大部分时候都可以省略this前缀,但如果构造器中有一个与属性同名的局部变量,又必须在构造器中访问这个被覆盖的属性,则必须使用this前缀。
   
作者: sbeeqnui1987    时间: 2012-6-11 09:48
在java定义方法时,可以使用关键字this代表调用对象。如果在调用类的实例变量或方法时没有显式指明调用对象,那么可以认为this就是调用对象。
在使用过程中,通常会省略this,但在某些情况下,this关键字是必须的,例如类的实例变量被局部变量屏蔽的情况。
作者: 李鑫    时间: 2012-6-11 09:56
1. this是指当前对象自己。
当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。如下面这个例子中:

public class Hello {

String s = "Hello";

public Hello(String s)
{
System.out.println("s = " + s);
System.out.println("1 -> this.s = " + this.s);
this.s = s;
System.out.println("2 -> this.s = " + this.s);
}

public static void main(String[] args) {
Hello x="new" Hello("HelloWorld!");
}
}

运行结果:

s = HelloWorld!
1 -> this.s = Hello
2 -> this.s = HelloWorld!

在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果; 第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!

2. 把this作为参数传递
当你要把自己作为参数传递给别的对象时,也可以用this。如:

public class A {
public A() {
new B(this).print();
}

public void print() {
System.out.println("Hello from A!");
}
}

public class B {
A a;
public B(A a) {
this.a = a;
}

public void print() {
a.print();
System.out.println("Hello from B!");
}
}

运行结果:
Hello from A!
Hello from B!

在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。

3. 注意匿名类和内部类中的中的this。
有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名使用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:

public class A {
int i = 1;

public A() {
Thread thread = new Thread() {
public void run() {
for(;;) {
A.this.run();
try {
sleep(1000);
} catch(InterruptedException ie) { }

}
}
}; //注意这里有;
thread.start();
}

public void run() {
System.out.println("i = " + i);
i++;
}

public static void main(String[] args) throws Exception {
new A();
}

}

在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。

4。在构造函数中,通过this可以调用同一class中别的构造函数,如
public class Flower{
Flower (int petals){}
Flower(String ss){}
Flower(int petals, Sting ss){
//petals++;调用另一个构造函数的语句必须在最起始的位置
this(petals);
//this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数
}
}

值得注意的是:
1:在构造调用另一个构造函数,调用动作必须置于最起始的位置。
2:不能在构造函数以外的任何函数内调用构造函数。
3:在一个构造函数内只能调用一个构造函数。
作者: 彭翠    时间: 2012-6-11 10:39
江南 发表于 2012-6-11 01:29
this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和 ...

这算什么,百度的也能加分?
作者: 吴小东    时间: 2012-6-11 11:15
对答案来说应该是很完整的了,不过东西学的是自己的,分都是浮云再多也没用。就算不要分让你去黑马了,你也跟不上。
作者: 武剑峰    时间: 2012-6-11 17:53
一楼总结的1、表示对当前对象的引用,其实在张老师讲解枚举时就提到了
package com.itheima.enumstudy;

public class WeekDaypt {
        private WeekDaypt(){}
        public final static WeekDaypt SUN=new WeekDaypt();
        public final static WeekDaypt MON=new WeekDaypt();
        public WeekDaypt nextDay(){
                if(this==SUN){                    //this表示当前调用对象
                        return MON;
                }else {
                        return SUN;
                }
        }
        public String toString(){
                return this==SUN?"SUN":"MON";   //this表示当前调用对象

        }

}
/* ************************************************* */
package com.itheima.enumstudy;

public class EnumTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                WeekDaypt weekday=WeekDaypt.SUN;
                System.out.println(weekday.nextDay().toString());
                }
           }
作者: 陈永波    时间: 2012-6-11 18:14
this关键字
1.构造函数中
可以使用"this(参数)"形式调用其它构造函数
2.普通函数中
this代表调用当前函数的对象
通常在set方法和构造函数中都会使用, 当局部变量和成员变量同名时访问成员变量
作者: 陈永波    时间: 2012-6-11 18:14
this关键字
1.构造函数中
可以使用"this(参数)"形式调用其它构造函数
2.普通函数中
this代表调用当前函数的对象
通常在set方法和构造函数中都会使用, 当局部变量和成员变量同名时访问成员变量




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