这个关键字及其工作原理

时间:2016-04-17 10:21:11

标签: java this

我有一个问题要关键字和方法中的变量范围。 一般来说,我知道如何使用这个关键字,但在下面的方法余额中观察到以下所有3个选项的相同结果时会感到困惑。 问题是,选项的正确实现是什么以及为什么它以相同的结果处理所有选项。 这是否意味着如果方法余额中没有局部变量,则忽略此关键字?

非常感谢!

选项#1

public int balance(int balance) {
        this.age = this.age + balance;
        return age;
    }

选项#2

public int balance(int balance) {
        age = age + balance;
        return age;
    }

选项#3

public int balance(int balance) {
        age = age + balance;
        return this.age;
    }

代码

package com;
public class Elephant {

    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        }
    }

    public int balance(int balance) {
        age = age + balance;
        return age;
    }

    public int getAge() {
        return age;
    }

    public Elephant(String name, int age) {
        this.name = name;
        if (age > 0) {
            this.age = age;
        }
    }
}


package com;

import java.util.Scanner;

public class MainClass {

    public static void main(String arg[]) {
        Elephant e1 = new Elephant("Elephant1: ", 7);
        System.out.printf("Elephant name: %s age: %s \n", e1.getName(), e1.getAge());
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        e1.balance(i);
        System.out.printf("Entered deposit for e1: %d \n", i);
        System.out.printf("Balance for e1: %s", e1.getAge());
    }
}

所有3个选项的结果是相同的: 大象名:Elephant1:年龄:7岁 11 输入e1:11的存款 e1的平衡:18

2 个答案:

答案 0 :(得分:4)

除了需要在其实例方法中传递或存储对象引用的情况之外,在解析非限定名称时需要使用关键字this来执行消除歧义规则。

例如,此代码需要它:

public void setAge(int age) {
    if (age > 0) {
        this.age = age;
    }
}

标识符age可以引用成员字段age或参数age。编译器应用参数和局部变量" shadow"具有相同名称的字段可消除歧义。这就是为什么你必须在age前加this作为作业的原因;否则,该字段将不会被分配。

另一方面,您的balance方法根本不需要关键字this,因为它没有不明确的名称解析。

答案 1 :(得分:1)

在Java中,this始终是对当前对象的引用。可以在不明确提及this的情况下访问当前对象的对象属性和方法。您想要使用哪一个(有或没有提及this),通常只是一个清晰度和编码风格指南的问题。

另见: