构造函数用于初始化一个值,并在创建类实例时将其赋值给类变量,对吧?
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
}
我之所以提到这一点是因为,当没有冲突时,这是一个风格问题,你会看到有时使用这种风格.