为什么 "this" 关键字在此构造函数中不起作用?
Why isn't the "this" keyword working in this constructor?
我不确定自己做错了什么,但是在构建时出现错误:
Cannot find symbol
对于这两个陈述。这是构造函数。
public Course
{
public Course(String cName,String cNum,ArrayList<Module> mod)
{
this.cName = cName;
courseNum = cNum;
this.mod = mod;
}
}
这是我必须做的吗?如果是这样,为什么不放弃 "this" 关键字而只使用 cName = cName? "this" 有什么用途?
public course
{
String cName;
public Course(String cName)
{
this.cName = cName;
}
}
这是在同一范围内有两个同名变量的问题。最本地的一个shadows/hides另一个,需要this.
才能接触到隐藏变量
why not just forgo the "this" keyword and just use cName = cName
?
那不会有任何作用。只需将 cName
分配给自身即可。有用的编译器可能会给你一个警告。
而您真正想要的是将局部变量(方法参数)分配给实例变量(字段)。不幸的是,由于两者具有相同的名称(在被认为是样式问题的构造函数之外),如果您想要实例变量,则必须通过说 this.cName
来消除歧义。
请注意,第二个变量在没有 this
的情况下仍然有效,其中参数和字段具有不同的名称:
courseNum = cNum; // no this
前缀为this.
的变量将引用class的实例变量。 this.cName = cName
会将构造函数参数列表中声明的 cName
变量的值赋给 cName
class 成员变量。
如果你只写 cName = cName
,它不会做任何事情,因为你将构造函数中声明的变量的值赋给它自己。
您的第一个示例不起作用,因为您尝试分配的字段 cName
、courseNum
和 mod
未在 class 中声明。您需要声明字段才能使作业生效。将变量设为私有以确保它们被很好地封装:
public Course {
private String cName;
public Course(String cName) {
this.cName = cName;
}
}
您需要使用 this
的原因是 消除 在 cName
-the-parameter 和 cName
-the-instance- 之间的歧义多变的。您可以通过其他方式消除歧义 - 例如,通过重命名其中一个变量:
public Course {
private String cName;
public Course(String name) {
cName = name; // Using "this" is no longer required,
// because names are different.
}
}
您的第二个代码示例是格式化代码的正确方法。要回答您的问题,this
关键字有助于阐明范围(仅访问对象的实例字段)。
使用
public course
{
String cName;
public Course(String cName)
{
cName = cName;
}
}
只将参数值赋回给自己,而使用
public course
{
String cName;
public Course(String cName)
{
this.cName = cName;
}
}
将构造函数参数中的值 cName
分配给声明为 class 级别字段的 cName
。
这应该有效,
public clcass Course
{
String cName,courseNum; // instance variables
ArrayList<Module> mod; //// instance variable
public Course(String cName,String cNum,ArrayList<Module> mod)
{
this.cName = cName;
courseNum = cNum;
this.mod = mod;
}
}
当构造函数中的实例变量名称与参数名称相同时,您需要一种方法来区分两者。 this
关键字在这种情况下有帮助。例如 - 当您在构造函数中说 this.cName
时,它指的是实例变量 cName
而当您在构造函数中说 cName
时,它指的是构造函数的参数名称。
我不确定自己做错了什么,但是在构建时出现错误:
Cannot find symbol
对于这两个陈述。这是构造函数。
public Course
{
public Course(String cName,String cNum,ArrayList<Module> mod)
{
this.cName = cName;
courseNum = cNum;
this.mod = mod;
}
}
这是我必须做的吗?如果是这样,为什么不放弃 "this" 关键字而只使用 cName = cName? "this" 有什么用途?
public course
{
String cName;
public Course(String cName)
{
this.cName = cName;
}
}
这是在同一范围内有两个同名变量的问题。最本地的一个shadows/hides另一个,需要this.
才能接触到隐藏变量
why not just forgo the "this" keyword and just use
cName = cName
?
那不会有任何作用。只需将 cName
分配给自身即可。有用的编译器可能会给你一个警告。
而您真正想要的是将局部变量(方法参数)分配给实例变量(字段)。不幸的是,由于两者具有相同的名称(在被认为是样式问题的构造函数之外),如果您想要实例变量,则必须通过说 this.cName
来消除歧义。
请注意,第二个变量在没有 this
的情况下仍然有效,其中参数和字段具有不同的名称:
courseNum = cNum; // no this
前缀为this.
的变量将引用class的实例变量。 this.cName = cName
会将构造函数参数列表中声明的 cName
变量的值赋给 cName
class 成员变量。
如果你只写 cName = cName
,它不会做任何事情,因为你将构造函数中声明的变量的值赋给它自己。
您的第一个示例不起作用,因为您尝试分配的字段 cName
、courseNum
和 mod
未在 class 中声明。您需要声明字段才能使作业生效。将变量设为私有以确保它们被很好地封装:
public Course {
private String cName;
public Course(String cName) {
this.cName = cName;
}
}
您需要使用 this
的原因是 消除 在 cName
-the-parameter 和 cName
-the-instance- 之间的歧义多变的。您可以通过其他方式消除歧义 - 例如,通过重命名其中一个变量:
public Course {
private String cName;
public Course(String name) {
cName = name; // Using "this" is no longer required,
// because names are different.
}
}
您的第二个代码示例是格式化代码的正确方法。要回答您的问题,this
关键字有助于阐明范围(仅访问对象的实例字段)。
使用
public course
{
String cName;
public Course(String cName)
{
cName = cName;
}
}
只将参数值赋回给自己,而使用
public course
{
String cName;
public Course(String cName)
{
this.cName = cName;
}
}
将构造函数参数中的值 cName
分配给声明为 class 级别字段的 cName
。
这应该有效,
public clcass Course
{
String cName,courseNum; // instance variables
ArrayList<Module> mod; //// instance variable
public Course(String cName,String cNum,ArrayList<Module> mod)
{
this.cName = cName;
courseNum = cNum;
this.mod = mod;
}
}
当构造函数中的实例变量名称与参数名称相同时,您需要一种方法来区分两者。 this
关键字在这种情况下有帮助。例如 - 当您在构造函数中说 this.cName
时,它指的是实例变量 cName
而当您在构造函数中说 cName
时,它指的是构造函数的参数名称。