Java中this关键字的功能与使用

Java中关键字this主要有2个功能

  1. 表示"当前对象"的引用
  2. 在构造器中调用构造器
表示"当前对象"的引用

(1)作为参数传入

//程序实例1  
public class MyObject {

    public Integer val;

    public MyObject() {
        this.val = 0;
    }

    public void methodA(Integer x) {
        this.val += x;
        System.out.println("MethodA: val = " + this.val);
    }

}
public static void main(String[] args) {
        MyObject objA = new MyObject();
        MyObject objB = new MyObject();
        System.out.println("Main A: val = "+objA.val);
        System.out.println("Main B: val = "+objB.val);
        
        objA.methodA(3);
        objB.methodA(10);
    }
//运行结果
1 Main A: val = 0
2 Main B: val = 0
3 MethodA: val = 3
4 MethodA: val = 10

【结果分析】

在main函数中,我们创建了两个对象objA和objB,并且它们调用了同一个方法methodA(),但是传入的参数是不同,那么methodA()是怎么知道它是objA、objB调用的呢?

其实,是编译器在暗中做了一个操作:将“所操作对象”的引用作为第一个参数传给了被调用的方法。

对应于程序实例1中代码,就是:

objA.methodA(3) — methodA(objA,3)

objB.methodA(10) — methodA(objB,10)

前面说,将操作对象的引用作为第一个参数传入到了方法中,参数传进来是要来使用的,否则多此一举传到方法中干啥,那么在方法内部该怎么获得“操作对象的引用”呢?

仔细观察程序实例1中的MyObject类的methodA(),发现:this.val += x;

也就是说,我们要取当前对象的val值,然后与x相加,再赋值给val。没错,此时this就是操作对象的引用!

(2)作为参数返回

//程序实例2
public class MyObject {

    public Integer val;

    public MyObject() {
        this.val = 0;
    }

    public MyObject methodA(Integer x) {
        this.val += x;
        return this;
    }
    
    public void printf(){
        System.out.println("print: val="+this.val);
    }

}
    public static void main(String[] args) {
        MyObject objA = new MyObject();
        objA.methodA(3).printf();

    }
//运行结果
print: val=3

【结果分析】

由于methodA()中返回的参数是this,我们才可以链式地调用方法printf(),否则,不能链式地调用。(this可以作为返回值很有用啊)

当然,此处的this仍然是当前操作对象的引用。

(3)this不建议使用的情况

//程序实例3
public class MyObject {

    public Integer val;

    public MyObject() {
        this.val = 0;
    }

    public void methodA(Integer x) {
        this.val += x;
        this.methodB();
        System.out.println("MethodA: val = " + this.val);
    }
    
     private void methodB(){
        System.out.println("Run methodB !");
    }

}

该代码是可以正常运行的,但是其实程序的第11行中的this是不符合规范的:如果我们想在方法内部调用另外一个方法,那么直接写方法名即可,不需要加上this。如果非要写上也可以,但是毫无必要。

在构造器中调用构造器
public class MyObject {

    public Integer val;
    
    public String strVal;

    public MyObject(Integer x) {
        this.val = x;
    }
    
    public MyObject(String str){
        this.strVal = str;
    }
    
    public MyObject(Integer x, String str){
        this(x);
        this.strVal = str;            //此处不能再次使用this(str)
    }

}

注意:

(1)可以用this调用另一个构造器,但是却不能调用两个;

(2)必须将构造器的调用放在方法的起始处,否则编译器会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值