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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请问this的用法  谁能讲一下啊 不太理解  谢谢

6 个回复

倒序浏览
这个是我的学习笔记,给你参考下

this:看上去,是用于区分局部变量和成员变量同名情况

this为什么可以解决这个问题?
this到底代表的是什么呢?

this:就代表本类对象,到底代表哪一个呢?
        this代表它(this)所在函数的所属对象的引用
        简单说:哪个对象在调用this所在的函数,this就代表哪个对象


this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,
这时用this来表示这个对象
        但凡本类功能内部使用到了本类对象,都用this表示,this是对象的引用
class Person
{
        int age;
        Person(int age)
        {
                this.age = age;
        }
        //比较年龄的功能
        public boolean compare(Person p)
        {
                return this.age==p.age;
        }
}

class OOP_4_ThisDemo
{
        public static void main(String[] args)
        {
                Person p = new Person(20);
                Person p1 = new Person(20);
                System.out.println(p.compare(p1));
        }
}


this关键字在构造函数间调用
Person(String name,int age)
{
        //用于构造函数间的互相调用,对 this 的调用必须是构造函数中的第一个语句
        this(name);
        this.age = age;
}

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张会文 于 2013-1-1 18:13 编辑
  1. public class ThisTest {    private int i=0;    //第一个构造器:有一个int型形参   
  2. ThisTest(int i){      
  3. this.i=i+1;//此时this表示引用成员变量i,而非函数参数i      
  4. System.out.println("Int constructor i——this.i:  "+i+"——"+this.i);      
  5. System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));       //从两个输出结果充分证明了i和this.i是不一样的!    }    //  第二个构造器:有一个String型形参   
  6. ThisTest(String s){       System.out.println("String constructor:  "+s);    }    //  第三个构造器:有一个int型形参和一个String型形参   
  7. ThisTest(int i,String s){      
  8. this(s);//this调用第二个构造器      
  9. //this(i);      
  10. /*此处不能用,因为其他任何方法都不能调用构造器,只有构造方法能调用他。       但是必须注意:就算是构造方法调用构造器,也必须为于其第一行,构造方法也只能调       用一个且仅一次构造器!*/      
  11. this.i=i++;//this以引用该类的成员变量      
  12. System.out.println("Int constructor:  "+i+"\n"+"String constructor:  "+s);   
  13. }   
  14. public ThisTest increment(){      
  15. this.i++;      
  16. return this;//返回的是当前的对象,该对象属于(ThisTest)    }   
  17. public static void main(String[] args){       T
  18. hisTest tt0=new ThisTest(10);      
  19. ThisTest tt1=new ThisTest("ok");      
  20. ThisTest tt2=new ThisTest(20,"ok again!");      
  21. System.out.println(tt0.increment().increment().increment().i);      
  22. //tt0.increment()返回一个在tt0基础上i++的ThisTest对象,      
  23. //接着又返回在上面返回的对象基础上i++的ThisTest对象!    }}
复制代码
运行结果:
Int constructor i——this.i:  10——11
String constructor:  ok
String constructor:  ok again!
Int constructor:  21
String constructor:  ok again!
14
其实this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。

3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
this关键字主要有以下几个应用:

1.在一个类中类的成员变量和方法的局部变量同名。使用this.XX来访访问成员变量。

2.this调用这个类中的另外一个构造方法。

3.在一个实例方法内访问当前实例的应用。
应用一:
1.public class Student{  
2.  String name;   
3.  
4.  private void SetName(String name){   
5.  
6.  this.name=name; //将局部变量的值传递给成员变量  
7.  
8.  }  
9.  
10.}
     一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量。这主要是从便于代码的阅读考虑的。一看到这个this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。不过话说回来,这是this关键字在Java语言中的最简单的应用。从这个应用中,我们可以看出this关键字其代表的就是对象的名字。掌握这个基本的原理之后,再了解后续的一些高级应用,也就是水到渠成的事情了。
应用二:
1.public class Student{   
2.  public Student(){   
3.  this("xiaoxiao")  
4.  }  
5.  
6.  public Student(String name){   
7.          System.out.println(name);  
8.  }  
9.}
上面两个构造方法一个带形参一个不带,形参了方法的重载,需要注意的是在一个类中,不能每个构造方法都有this()。

应用三:
1.return this;  

this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的饮用。如在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。如这个代码在上面这个student类中,那么这个代码其代表的含义就是return student。可见,这个this关键字除了可以引用变量或者成员方法之外,还可以做为类的返回值。这才是this关键字最引人注意的地方。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
这是我收藏的,肯定可以帮到你!
1. this是指当前对象自己。
当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。如下面这个例子中:
  1. public class Hello {

  2.     String s = "Hello";

  3.     public Hello(String s){
  4.         System.out.println("s = " + s);
  5.         System.out.println("1 -> this.s = " + this.s);
  6.         this.s = s;
  7.         System.out.println("2 -> this.s = " + this.s);
  8.     }

  9.     public static void main(String[] args) {
  10.     Hello x=new Hello("HelloWorld!");
  11.     }
  12. }
复制代码

运行结果:

  1. s = HelloWorld!
  2. 1 -> this.s = Hello
  3. 2 -> this.s = HelloWorld!
复制代码
在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果; 第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!
2. 把this作为参数传递 当你要把自己作为参数传递给别的对象时,也可以用this。如:
  1. public class A {
  2.   public A() {
  3.     new B(this).print();
  4.   }

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

  9. public class B {
  10.   A a;
  11.   public B(A a) {
  12.     this.a = a;
  13.   }

  14.   public void print() {
  15.     a.print();
  16.     System.out.println("Hello from B!");
  17.   }
  18. }

  19. 运行结果:
  20.   Hello from A!
  21.   Hello from B!
复制代码
在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。
3. 注意匿名类和内部类中的中的this。 有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:
  1. public class A {
  2.     int i = 1;

  3.     public A() {
  4.         Thread thread = new Thread() {
  5.             public void run() {
  6.                 for(;;) {
  7.                     A.this.run();
  8.                     try {
  9.                         sleep(1000);
  10.                     } catch(InterruptedException ie) {     }

  11.                 }
  12.            }
  13.         }; //注意这里有;
  14.         thread.start();
  15.     }

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

  20.     public static void main(String[] args) throws Exception {
  21.         new A();
  22.     }
  23. }
复制代码
在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。
4。在构造函数中,通过this可以调用同一class中别的构造函数,如
  1. public class Flower{
  2.            Flower (int petals){}
  3.            Flower(String ss){}
  4.            Flower(int petals, Sting ss){
  5.                 //petals++;调用另一个构造函数的语句必须在最起始的位置
  6.                 this(petals);
  7.                //this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数
  8.            }
  9. }
复制代码
值得注意的是:
1:在构造调用另一个构造函数,调用动作必须置于最起始的位置。
2:不能在构造函数以外的任何函数内调用构造函数。
3:在一个构造函数内只能调用一个构造函数。


评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
必须用this关键字的三种情况:
   1、我们想通过构造方法将外部传入的参数赋值给类的成员变量,构造方法的形式参数名称与类的成员变量名相同。例如:
        class Person
        {
             String name;
             public Person(String name)
             {
                  this.name = name;
             }
        }
2、假设有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接受一个代表其所在容器的参数。例如:
class Container
        {
             Component comp;
             public void addComponent()
             {
                  comp = new Component(this);
             }
        }
        class Component
        {
             Container myContainer;
             public Component(Container c)
             {
                  myContainer = c;
             }
        }

3、构造方法是在产生对象时被java系统自动调用的,我们不能再程序中像调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。例如
public class Person
        {
             String name;
             int age;
             public Person(String name)
             {
                  this.name = name;
             }
             public Person(String name,int age)
             {
                  this(name);
                  this.age = age;
             }
        }



1.this可指代对象自己本身: 当在一个类中要明确指出使用对象自己的属性或方法时就应该加上this引用,如下例 子:

输出的结果为:       Maybe=love you

                                   this.Maybe=love

                                   this.Maybe=love you

第一行直接对构造函数中传递过来的参数Maybe进行输出,第二行是对成员变量(属性) Maybe的输出,第三行是先对成员变量(属性)Maybe赋值后进行输出。

2.在一个构造函数中调用另一个构造函数时,用this关键字:

  以下例子:

   public class Flower{  

         private int petalCount=0;

          private String s=new String("null");

          public Flower(int petals){

                  petalCount=petals;

          }

            public Flower(String ss){

                   s=ss;

            }

             public Flower(String s,int petals){

                     this(petals); //java中在一个构造函数中可以调用一次其他的构造函数,并且这条语句 必须在这个构造函数的第一行  

                      this.s=s;

                }

    }

public class love{

    String Maybe="love";

    public love(String Maybe){

        System.out.println("Maybe=" + Maybe);

        System.out.println("this.Maybe="+this.Maybe);

        this.Maybe=Maybe;

        System.out.println("this.Maybe="+this.Maybe);

    }

    public static void main(String[] args){

         love s=new love("love you");

    }

}

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
2l楼说的好,学习了。
这个是我的学习笔记,给你参考下

this:看上去,是用于区分局部变量和成员变量同名情况

this为什么可以解决这个问题?
this到底代表的是什么呢?

this:就代表本类对象,到底代表哪一个呢?
        this代表它(this)所在函数的所属对象的引用
        简单说:哪个对象在调用this所在的函数,this就代表哪个对象


this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,
这时用this来表示这个对象
        但凡本类功能内部使用到了本类对象,都用this表示,this是对象的引用
class Person
{
        int age;
        Person(int age)
        {
                this.age = age;
        }
        //比较年龄的功能
        public boolean compare(Person p)
        {
                return this.age==p.age;
        }
}

class OOP_4_ThisDemo
{
        public static void main(String[] args)
        {
                Person p = new Person(20);
                Person p1 = new Person(20);
                System.out.println(p.compare(p1));
        }
}


this关键字在构造函数间调用
Person(String name,int age)
{
        //用于构造函数间的互相调用,对 this 的调用必须是构造函数中的第一个语句
        this(name);
        this.age = age;
}

评分

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

查看全部评分

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