为什么“this”关键字在此构造函数中不起作用?

时间:2015-11-19 02:25:18

标签: java this

我不确定我做错了什么,但是当我构建时,我得到了错误:

  

找不到符号

这两个陈述。这是构造函数。

public Course
{ 
    public Course(String cName,String cNum,ArrayList<Module> mod)
    {                         
       this.cName = cName;
       courseNum = cNum;
       this.mod = mod;                     
    }
}

这是我必须做的吗?如果是这样,为什么不放弃“this”关键字而只使用cName = cName? “这个”的目的是什么?

public course
{
    String cName;
    public Course(String cName)
    {
        this.cName = cName;
    }
}   

5 个答案:

答案 0 :(得分:2)

您的第一个示例无效,因为您尝试分配的字段cNamecourseNummod未在类中声明。您需要声明字段以使分配起作用。将变量设为私有以确保它们封装良好:

public Course {
    private String cName;
    public Course(String cName) {
        this.cName = cName;
    }
}

您需要使用this的原因是在cName - 参数和cName - the-instance-variable之间消除歧义。您可以通过其他方式消除歧义 - 例如,通过重命名其中一个变量:

public Course {
    private String cName;
    public Course(String name) {
        cName = name; // Using "this" is no longer required,
                      // because names are different.
    }
}

答案 1 :(得分:0)

在同一范围内有两个同名变量的问题。最本地的一个阴影/隐藏另一个,并且需要this.来接触隐藏的变量。

  

为什么不放弃&#34;这个&#34;关键字,只需使用cName = cName

那不会做任何事情。只需将cName分配给自己。有用的编译器可能会给你一个警告。

而您真正想要的是将局部变量(方法参数)分配给实例变量(字段)。由于这两者具有相同的名称(在构造函数之外被认为是样式问题),因此如果要实例变量,则必须通过说this.cName来消除歧义。

请注意,对于第二个变量,它的工作没有this,其中参数和字段具有不同的名称:

courseNum = cNum; // no this

答案 2 :(得分:-1)

this.为前缀的变量将引用该类的实例变量。 this.cName = cName会将构造函数参数列表中声明的cName变量的值赋给cName类成员变量。

如果您只是写cName = cName,它就不会做任何事情,因为您将构造函数中声明的变量的值分配给它自己。

答案 3 :(得分:-1)

您的第二个代码示例是格式化代码的正确方法。要回答您的问题,this关键字有助于澄清范围(仅访问对象的实例字段)。

使用

public course
{
String cName;
    public Course(String cName)
   {
    cName = cName;
    }
}   

仅在使用

时将参数值分配回自身
public course
{
String cName;
public Course(String cName)
{
    this.cName = cName;
}
}   

将构造函数参数中的值cName指定为声明为类级别字段的cName

答案 4 :(得分:-2)

这应该有效,

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时,它引用构造函数的参数名称。