Java 什么';这里的构造师是谁?
一本著名的基础Java编程教科书中的练习内容如下: '有时我们希望类只有一个唯一的实例。创建一个Merlin类,该类有一个属性theWizard,它是静态的,属于Merlin类型。该类只有一个构造函数和两个方法,如下所示: *Merlin-一个私有构造函数。只有此类可以调用此构造- tor;没有其他类或程序可以创建Merlin的实例 *召唤-如果向导不为空,则返回向导的静态方法;如果向导为null,则此方法使用私有构造函数创建Merlin实例,并在返回它之前将其分配给向导。 *consult—一个非静态方法,返回字符串“拉动剑” “从石头上” 你能理解作者在“Merlin-一个私有构造函数”这一点上提出的问题吗?我知道什么是构造函数,也知道什么是私有方法。但答案是什么?我想到了类似的事情Java 什么';这里的构造师是谁?,java,constructor,Java,Constructor,一本著名的基础Java编程教科书中的练习内容如下: '有时我们希望类只有一个唯一的实例。创建一个Merlin类,该类有一个属性theWizard,它是静态的,属于Merlin类型。该类只有一个构造函数和两个方法,如下所示: *Merlin-一个私有构造函数。只有此类可以调用此构造- tor;没有其他类或程序可以创建Merlin的实例 *召唤-如果向导不为空,则返回向导的静态方法;如果向导为null,则此方法使用私有构造函数创建Merlin实例,并在返回它之前将其分配给向导。 *consult—一
public class Merlin {
private static Merlin theWizard;
/*public Merlin()
{
???
}*/
private Merlin()
{
this();
}
public static Merlin summon(Merlin theWizard) {
if (theWizard == null) {
theWizard = new Merlin();
return theWizard;
}
public String consult() {
return "Pull the sword from the stone";
}
}
当然,JavaBeans说“private Merlin()”是递归的。那我该怎么办?下一个练习与上面的练习相关,可以帮助你理解答案是什么;这是:
- 使用toString方法验证是否已创建唯一实例
非常感谢您能告诉我的一切。这是单例模式的一个例子;在您的情况下,只需将
this()
替换为super()
,即可使用超类的构造函数(从技术上讲,如果您不调用超级构造函数,编译器将为您插入一个;因此您可以删除它)
值得思考的是:
- 为什么Merlin类是私有的
- 为什么Merlin类是静态的
- 你剩下的代码在哪里
- 摆脱
这个()
this
后跟parens是用于调用同一类的构造函数的语法,因为您没有在parens中指定任何参数,所以您指的是无参数指导器,它是从中调用的构造函数,因此构造函数将递归调用自己,直到堆栈空间用完为止。IDE正在检查此问题并试图警告您
允许在构造函数中调用super()
(它调用超类中的无参数构造函数,这里是java.lang.Object),但不是必需的,如果不需要,编译器将插入对super的调用
顺便说一下,一个构造函数或方法不能在同一个参数列表中有多个重载。不能有公共无参数构造函数和私有无参数构造函数
作者试图描述一个可以控制其实例创建方式的类,它将其构造函数设置为私有,这样就只允许类本身实例化该类的对象。那么构造函数只是递归的,因为您有this()
在其中…我的其余代码是:public static Merlin callout(Merlin theWizard){if(theWizard==null){theWizard=new Merlin();}else{}返回向导;}公共字符串consult(){返回“从石头上拔出剑”}它是静态的,因为就其性质而言,cIt是静态的,因为此构造函数用于构建类的对象,而不需要使用预先存在的对象来调用构造函数方法本身。它是私有的,因为它只能在类中使用(尽管,我承认,我不清楚为什么……)我非常感谢你的回答。我将尝试完成练习9。我在书中还没有提到的super()的使用是这个问题的唯一答案吗?再次非常感谢。太好了,内森!你消除了我最后的疑虑。我也非常感谢你!
public class Merlin {
private static Merlin theWizard;
private Merlin() {}
...
}