Java this的一两点使用

Java this的一两点使用

之前的文章都是关于Android的使用,这次想写一些关于Java的知识,总结一下Java的使用。这次写的是关于Java this的使用,介绍以下内容:

  1. this的概念
  2. this的各种应用
  3. 总结

this 是什么

在写一个方法的时候,如果想在方法内部获得对当前对象的引用就可以用this.this表示对“调用方法的那个对象”的引用。也就是说this指的是方法所属的类的对象的引用。根据这个定义,我们可以总结出很多关于this的用法。

  1. 当局部变量与成员变量重名的时候,可以用this表明用的是对象的成员变量。
  2. 当方法需要一个该类的对象做参数的时候,可用this代替。
  3. 在Android开发中,我们经常需要对事件处理写一个内部类或者匿名内部类,在内部类里用this,按照刚才的定义,指的就是内部类的对象,如果想要用外部类的对象,则要外部类名.this的形式表示外部类的对象的引用。
  4. 在构造函数中,可以用this来调用另一个构造函数。
  5. 当一个方法需要返回对当前对象的引用的时候,可以用return this。这时就可以在不断对这个对象进行多次这种方法的操作。

下面会针对每一种用法
进行说明和举例。

this的用法1

在Java程序中,如果一个方法中的参数与成员变量的名称是一样的时候,我们可以用this来指定调用的成员变量,例子如下:

/**
 * Created by byhieg on 16-4-23.
 */
public class A {

    public String s = "A";

    public A() {

    }

    public A(String s) {
        System.out.println("s的值 = " + s);
        s = "B";
        System.out.println("经过s=\"B\"赋值后成员变量s的值");
        System.out.println("成员变量s的值 = " + this.s);
        this.s = "B";
        System.out.println("经过this.s=\"B\"赋值后成员变量s的值");
        System.out.println("成员变量s的值 = " + this.s);
    }


    public void show() {
        System.out.println("无参构造器中成员变量s的值 = " + s);
    }

    public static void main(String[] args) {
        new A().show();
        System.out.println("调用含参构造器后");
        new A("C");
    }
}

运行结果如下:

无参构造器中成员变量s的值 = A
调用含参构造器后
s的值 = C
经过s="B"赋值后成员变量s的值
成员变量s的值 = A
经过this.s="B"赋值后成员变量s的值
成员变量s的值 = B

我们从这个程序可以看出来,当局部变量没有的时候,直接输出s不用加this,编译器也知道s指的是成员变量,当有局部变量的时候,编译器首先会用局部变量,这也就是在调用含参构造器后,直接输出s的值,s实际指的是局部变量,后续一切对s的操作,都是指的是局部变量s。这时,如果我们要对成员变量进行操作,就要用this.s表明是对对象的成员变量进行操作。
通过刚才的分析,我们已经可以看出this就是指的对当前对象的引用,所以既然是对象的引用,那么他不仅可以调用成员变量,还可以调用成员方法,一个方法中,可以通过this来调用其他方法。话虽如此,不过恐怕很多程序都是在方法中不加this直接调用,因为当前方法中this引用会自动应用于同一类中的其他方法。

this的用法2

在写一个方法的时候,如果该方法需要一个该类的对象做参数的时候,通常传入this代指该类的对象,具体的使用场景如下:
在Android开发中,我们的一些方法经常需要context作为一个参数传进去,通常我们传入的都是context的子类,即当前Activity的对象this进去。
我们可以看一下下面的代码:

/**
 * Created by byhieg on 16-4-23.
 */
class B {
    B(A a) {
        a.show();
    }
}
public class A {

    public void doB() {
        new B(this);
    }
    public void show() {
        System.out.println("我是A");
    }

    public static void main(String[] args) {
        new A().doB();
    }
}

输出我是A
这个例子虽然写的很特意,但我们可以看出this在这里面取得的作用,this作为该类的对象的引用,在这里this就是指A的对象的引用。因为this是在A类的方法中传进去的所以指的是A的对象的引用。我们可以看一下下面的有趣例子:

/**
 * Created by byhieg on 16-4-23.
 */
class B {
    public B() {
        System.out.println("这里的this是" + this.getClass().getSimpleName());
    }

    public void Bshow() {
        System.out.println("这里的this是" + this.getClass().getSimpleName());
    }
}
public class A extends B {
    public A() {
    }
    public static void main(String[] args) {
        new A();
        new B().Bshow();
    }
}

结果很值得讨论,结果如下:

这里的this是A
这里的this是B
这里的this是B

明明是this出现B的构造器内,按照刚才说的不是应该指的是B吗?其实,注意刚才说的是this是指从那个方法中传进去那个类的对象。jvm在执行编译的时候,在成员方法中,会默认隐藏的传递一个参数,这个参数就是当前调用的对象本身。换句话说,虽然new A()的时候会先执行父类的默认构造函数,但此时已经把JVM已经秘密的传入的A的对象,所以我们可以看出输出的this是A。而在new B()的时候,传入的当然就是B的对象,所以输出的this就是B。

this的用法3

在Android开发中,我们经常需要对事件处理写一个内部类或者匿名内部类,在内部类里用this,按照刚才的定义,指的就是内部类的对象,如果想要用外部类的对象,则要外部类名.this的形式表示外部类的对象的引用。这个没什么细说的,直接看下面的例子算了

/**
 * Created by byhieg on 16-4-23.
 */
public class A {
    int i = 1;

    public A() {
        Thread thread = new Thread() {
            public void run() {
                for (int j = 0;j < 2;j++) {
                    //调用外部类的方法
                    A.this.run();
                }
            }
        };
        thread.start();
    }

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

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

这里run方法和内部类里面的run重复了,如果想要调用A的run方法就需要A的对象→this,但如果直接在内部类里面用this,则this就指的是内部类的对象,所以我们需要加上外部类的名字。A.this来明确表明这是A的对象。

this的用法4

在构造函数中,可以用this来调用另一个构造函数。这是this比较独特的用法,即在构造器中,如果为this添加了参数列表,那么这将产生对符合参数列表的某个构造器的明确调用。这样我们就可以在构造器中调用其他构造器,但书写上有所限制,必须将构造器的调用置于最初始处,而且只能用一次。
例子如下:

/**
 * Created by byhieg on 16-4-23.
 */
public class A {
    int a ,b;
    public A(int a) {
        this.a = a;
        System.out.println(this.a);
    }
    public A(int a, int b) {
        this(a);
        this.b = b;
        System.out.println(this.a + " " + this.b);
    }
    public static void main(String[] args) {
        new A(2);
        new A(2, 3);
    }
}

具体的用法就如上面所示,我们可以打开调试器看一看里面的信息,如下图

1.png

我们可以看出this作为当前的对象,里面存放这该类的三个成员变量,我们可以很容易验证,无论this调用什么方法,内存中永远存放这个类的成员变量,所以才可以通过this对成员变量进行修改。

this的用法5

当一个方法需要返回对当前对象的引用的时候,可以用return this。这时就可以在不断对这个对象进行多次这种方法的操作。
这是一个很神奇的操作,因为这个方法的返回值是当前对象的引用,因此你可以用这个引用继续调用其他方法,很容易一行语句执行多次操作,就像python的一行语法一样。
我们看一个好玩的例子

/**
 * Created by byhieg on 16-4-23.
 */
public class A {
    int  i = 0;
    public A add() {
        i ++;
        return this;
    }
    public A show() {
        System.out.println(i);
        return this;
    }
    public void end() {
        System.out.println("到此为止");
    }

    public static void main(String[] args) {
        new A().add().show().add().show().add().show().add().show().add().show().end();
    }
}

输出结果显而易见,我就不放出来了。

总结

我们这里讨论了this的五种用法,但是都是根据this的定义引申出在不同情况下的用法。this只能在方法内部使用,当调用方法中含有this的时候,this就指的调用该方法的对象的引用,当方法参数中需要传入一个类的对象的时候,用this代指这个传入类的对象。当用构造方法初始化成员变量的时候,JVM会默认传入当前对象来初始化成员变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容