为什么 "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,它不会做任何事情,因为你将构造函数中声明的变量的值赋给它自己。

您的第一个示例不起作用,因为您尝试分配的字段 cNamecourseNummod 未在 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 时,它指的是构造函数的参数名称。