Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这里的构造师是谁?_Java_Constructor - Fatal编程技术网

Java 什么';这里的构造师是谁?

Java 什么';这里的构造师是谁?,java,constructor,Java,Constructor,一本著名的基础Java编程教科书中的练习内容如下: '有时我们希望类只有一个唯一的实例。创建一个Merlin类,该类有一个属性theWizard,它是静态的,属于Merlin类型。该类只有一个构造函数和两个方法,如下所示: *Merlin-一个私有构造函数。只有此类可以调用此构造- tor;没有其他类或程序可以创建Merlin的实例 *召唤-如果向导不为空,则返回向导的静态方法;如果向导为null,则此方法使用私有构造函数创建Merlin实例,并在返回它之前将其分配给向导。 *consult—一

一本著名的基础Java编程教科书中的练习内容如下:

'有时我们希望类只有一个唯一的实例。创建一个Merlin类,该类有一个属性theWizard,它是静态的,属于Merlin类型。该类只有一个构造函数和两个方法,如下所示: *Merlin-一个私有构造函数。只有此类可以调用此构造- tor;没有其他类或程序可以创建Merlin的实例 *召唤-如果向导不为空,则返回向导的静态方法;如果向导为null,则此方法使用私有构造函数创建Merlin实例,并在返回它之前将其分配给向导。 *consult—一个非静态方法,返回字符串“拉动剑” “从石头上”

你能理解作者在“Merlin-一个私有构造函数”这一点上提出的问题吗?我知道什么是构造函数,也知道什么是私有方法。但答案是什么?我想到了类似的事情

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()”是递归的。那我该怎么办?下一个练习与上面的练习相关,可以帮助你理解答案是什么;这是:

  • 创建一个测试上一练习中描述的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() {}
            ...
        }