java – 为什么在构造函数和Setter中使用“this”关键字?

构造函数用于初始化一个值,并在创建类实例时将其赋值给类变量,对吧?

public class Joke{
   private String jokeSetup;
   private String jokePunchLine;

   public Joke(String jokeSetup , String jokePunchLine){
       this.jokeSetup=jokeSetup;
       this.jokePunchLine=jokePunchLine;
   }
}  

考虑以下:

public Joke(String jokeSetup , String jokePunchLine) 

是否创建了同名的另一个变量?

如果是这样,为什么将它们分配给前jokeSetup和jokePunchLine值?

PS:这段代码不是由我创建的.它是在我学习Java的视频中显示的.

解决方法:

构造函数的目的是初始化刚刚创建的对象,例如填充其实例字段(也称为实例变量).这在构造函数中用于引用构造函数初始化的实例.

在示例构造函数中,您有参数和实例字段.构造函数正在获取参数的值并将这些值分配给实例字段:

public Joke(String jokeSetup , String jokePunchLine)
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---- Declares parameters this
//                                                      constructor accepts when
//                                                      called
{
//                 vvvvvvvvv------------ parameter
    this.jokeSetup=jokeSetup;
//  ^^^^^^^^^^^^^^---------------------- instance field

//                     vvvvvvvvvvvvv---- parameter
    this.jokePunchLine=jokePunchLine;
//  ^^^^^^^^^^^^^^^^^^------------------ instance field
}

构造函数可以使用常量值初始化实例字段,或者间接使用参数值(例如,查找某些内容)等.它并不总是直接的一对一分配,就像在您的示例中一样.

在您的示例中,参数与实例字段具有相同的名称,但这不是必需的.例如,这个构造函数与您的构造函数完全相同:

public Joke(String theJokeSetup , String theJokePunchLine)
//                 ^---------------------^---------- Note the name changes
{
//                   vvvvvvvvvvvv------------ parameter
    this.jokeSetup = theJokeSetup;
//  ^^^^^^^^^^^^^^--------------------------- instance field

//                       vvvvvvvvvvvvvvvv---- parameter
    this.jokePunchLine = theJokePunchLine;
//  ^^^^^^^^^^^^^^^^^^----------------------- instance field
}

Java让你不用这个.部分引用实例字段时,只需单独使用字段名称(例如jokeSetup而不是this.jokeSetup).但是,除非重命名参数,否则不能在构造函数中执行此操作,因为它们与实例字段具有相同的名称,因此构造函数中的jokeSetup是参数,而不是字段.当出现类似的冲突时,最本地的标识符优先(在构造函数中,参数是最本地的).

当没有冲突时,无论你是否使用它都是一种风格问题.部分与否. (我总是使用它.我发现它更清楚.)例如,这是另一个版本的构造函数,它与原始版本完全相同:

public Joke(String theJokeSetup , String theJokePunchLine)
//                 ^---------------------^---------- Note the name changes
{
//              vvvvvvvvvvvv------------ parameter
    jokeSetup = theJokeSetup;
//  ^^^^^^^^^--------------------------- instance field

//                  vvvvvvvvvvvvvvvv---- parameter
    jokePunchLine = theJokePunchLine;
//  ^^^^^^^^^^^^^----------------------- instance field
}

我之所以提到这一点是因为,当没有冲突时,这是一个风格问题,你会看到有时使用这种风格.

上一篇:如何在我的类中使用PHP的__get()和__set()来定义字段?


下一篇:Java Setter和Constructor混淆