我有一个问题要关键字和方法中的变量范围。 一般来说,我知道如何使用这个关键字,但在下面的方法余额中观察到以下所有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
答案 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
),通常只是一个清晰度和编码风格指南的问题。
另见: