java - 为什么我必须使用 this 关键字来初始化构造函数中的实例变量?
问题描述
我对 JAVA 很陌生,并尝试使用以下代码使用构造函数初始化对象变量的值:
public class Javaprog {
int rollnumber;
String name;
Javaprog(int rollnumber, String name) {
rollnumber = rollnumber;
name = name;
}
public static void main(String[] args) {
Javaprog student1 = new Javaprog(12, "Simon");
System.out.println(student1.rollnumber);
System.out.println(student1.name);
}
}
我想了解为什么上面的代码返回rollnumber和name(0和null)的默认值,除非我使用“this”来引用构造函数中的变量,如下所示:
this.rollnumber = 卷数;this.name = 名称;我知道这指的是当前对象,但我的意思是当构造函数运行以创建对象时,默认情况下它是否不理解这些变量与正在创建的对象相关。
是不是,如果不使用这个关键字,它们只是“类变量”并且不附加到正在创建的对象上。
在这里找到了一个类似的Q,但是没有完全理解使用this的授权: java this keyword inside constructor
解决方案
让我们把构造函数放在一边,只从代码的角度来看它。
参数 rollnumber 和 name 是局部变量,它们的作用域只在函数中。所以当你说
rollnumber = rollnumber;
它只是将局部变量 rollnumber 的当前值分配给它自己(什么都不做)。没有办法区分rollnumber(函数内部的参数/位置变量)和实例变量rollnumber。
为了确保编译器理解我们想要的,我们使用
this.rollnumber (referring to instance variable) = rollnumber (parameter);
为避免这种情况,您可以将实例变量命名为其他名称,例如 rollnum。这样,编译器将在本地范围内(即在构造函数中,未找到)搜索 rollnum,然后在更高的范围内搜索,在那里它将作为实例变量找到并正确分配。
rollnum = rollnumber;
将工作。
推荐阅读
- r - purrr:将 %in% 与列表列一起使用
- java - JPA 中的删除查询给出错误
- jenkins - 为什么詹金斯不能使用可扩展的选择/系统常规选择参数找到工作对象?
- parsing - Ocaml中的哈希表,其中键是一个元组
- python - CONCURRENT_REQUESTS 不会发出更多请求
- python - 为什么 combine_first() 在将同一列中的值替换到同一 DataFrame 中的另一列时会显示此行为?
- c - 为什么 printf 在删除 & 时没有显示字符串,也没有在 C 中显示地址?
- openshift - 使用 OpenShift Java REST 客户端获取持久卷列表
- tensorflow - 如何在 tf.estimator.DNNClassifier 中指定特征列?
- c# - MVC 控制器在完成之前开始读取有效负载