ITPub博客

首页 > 应用开发 > Java > java中this关键字的用法

java中this关键字的用法

原创 Java 作者:Diy_os 时间:2015-11-15 04:50:47 0 删除 编辑

对于this关键字,都不陌生,只要在java程序代码中都可见,下面是android中绑定按钮监听一段代码:

点击(此处)折叠或打开

  1. button1.setOnClickListener(new OnClickListener() {
  2.             
  3.             @Override
  4.             public void onClick(View v) {
  5.                 // TODO 自动生成的方法存根
  6.                 Intent intent = new Intent(MainActivity.this,SecondActivity.class);//传入MainActivity作为上下文
  7.                 startActivity(intent);
  8.                 //MainActivity.this.startActivity(intent);
  9.             }
  10.         });
MainActivity.this的意思一目了然,指的是当前MainActivity对象

下面看一段很常见的代码:

点击(此处)折叠或打开

  1. public class this1{
  2.     
  3.     private int i;
  4.     
  5.     this1(int i){
  6.         this.i = i;
  7.         this.geti();
  8.         this1.printname();
  9.         int c = 0;
  10.     }
  11.     
  12.     static{
  13.         
  14.         int i = 9;
  15.         System.out.println("static块中的i:" + i);
  16.     }
  17.     public void geti(){
  18.         
  19.         System.out.println(this.i);
  20.         this.printname();
  21.     }
  22.     public static void printname(){
  23.         
  24.         System.out.println("lios");
  25.     }
  26.     public static void main(String[] args){
  27.         
  28.         new this1(1);
  29.         //geti();静态方法内不可以调用非静态方法,反之可以
  30.     }
  31. }
当在堆中new出内存空间时,系统就调用构造器,初始化该对象。构造器中的this含义指的就是当前对象。在构造器中,调用对象中非静态方法时,可以省略this关键字,但是在调用静态方法时,虽然可以通过this来调用并通过编译,但是java建议我们用类名调用静态方法。但是在static方法或者static块中,是不能调用非static方法,这一点需要注意。
构造函数也是一个特殊的static方法,它没有返回值,我是这样理解的,在new出一个对象时系统自动调用了构造函数,用来初始化实例;在类中如果有static方法块时(如上图),系统加载时,首先初始化static字段以及方法,然后才调用构造器,两者有相似之处。上述个人看法可以说是无稽之谈,当然深入的理解java构造器,还需要理解JVM机制,鉴于本人水平有限,这里不作分析。

下面看一个很有趣的程序:

点击(此处)折叠或打开

  1. public class This1 {
  2.     
  3.      public int i = 0;
  4.      
  5.      public This1 getthis(){
  6.         i++;
  7.         return this;
  8.     }
  9.      public void geti(){
  10.         
  11.         System.out.println(i);
  12.     }
  13.     public static void main(String[] args){
  14.         
  15.         This1 th = new This1();
  16.         th.getthis().getthis().getthis().getthis().geti();
  17.         System.out.println(th);
  18.         System.out.println(th.getthis());
  19.         System.out.println(th.getthis().getthis());
  20.         System.out.println(th.getthis().getthis().getthis());
  21.         System.out.println(th.getthis() == th.getthis().getthis());
            System.out.println(th.getthis().getthis()== th.getthis().getthis().getthis().getthis());

  22.     }
  23. }
有前面的简单的介绍,上面的代码很容易看明白,getthis()返回当前对象的引用(this),返回的引用指向同一块内存区域。

下面的代码也许会有点新奇:

点击(此处)折叠或打开

  1. public class Thiss {
  2.     private int i;
  3.     Thiss(int i){
  4.         
  5.         int j = i;
  6.         System.out.println("j:"+j);
  7.     }
  8.     public Thiss(String ss) {
  9.         this(1);
  10.         String s = ss;
  11.         System.out.println("s:"+s);
  12.     }
  13.     public Thiss() {
  14.         this("diy_os");
  15.     }
  16.     
  17.  public static void main(String[] args){
  18.     
  19.      new Thiss();
  20.  }
      }
this可以调用当前对象的构造器,用来初始化对象域。一个类可以有很多构造器,this通过构造器中不同的参数列表,来调用不同的构造器,也就是重载机制。注意:this调用构造器时,必须放在构造器的首行,否则报错。


this可以将当前对象传给其他方法:

点击(此处)折叠或打开

  1. public class Person {
  2.   public void eat(Apple apple){
  3.      Apple appled = apple.getPeeled();
  4.      System.out.println("Yummy");
  5.      System.out.println(appled);
  6.   }
  7. }

  8. public class Peeler {
  9.   static Apple peel(Apple apple){
  10.     
  11.      return apple;
  12.   }
  13. }

  14. public class Apple {
  15.   
  16.     Apple getPeeled(){
  17.         return Peeler.peel(this);
  18.     }
  19. }

  20. public class PassingThis {
  21.     
  22.  public static void main(String[] args){
  23.     
  24.      Apple A = new Apple();
  25.      new Person().eat(A);
  26.      System.out.println(A);
  27.      System.out.println(A.getPeeled());
  28.  }
  29. }
(上面代码摘自《thinking in java》)书中的解释是:Apple需要调用Peeler.peel()方法,它是一个外部的工具方法,将执行由于某种原因而必须放在Apple外部的操作(也许是因为该外部方法要应用于许多不同的类,而你却不想重复这些代码)。为了将其自身传递给外部方法,Apple必须使用this关键字。

文章用于学习总结,如有不当错误之处,请读者指正!谢谢!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876893/viewspace-1839283/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-12-11

  • 博文量
    159
  • 访问量
    1006449