这里的构造函数是什么?

时间:2016-02-22 17:25:09

标签: java constructor

来自着名的基础Java编程教科书的练习文本如下:

'有时我们希望一个只有一个唯一实例的类。创建一个具有一个属性Merlin的类Merlin,它是静态的并且是Merlin类型。该类只有一个构造函数和两个方法,如下所示: * Merlin -a私有构造函数。只有这个类可以调用这个构造 - TOR;没有其他类或程序可以创建Merlin的实例 * summon -a静态方法,如果它不为null,则返回向导;如果向导为null,则此方法使用私有构造函数创建Merlin实例,并在返回之前将其分配给向导。 * consult-一个返回字符串的非静态方法"拉剑 来自石头" '

你是否能够理解作者所提出的问题' Merlin -a私人构造函数' ?我知道构造函数是什么以及私有方法是什么。但这里的答案是什么?我想到了像

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

  1. 创建一个测试Merlin在上一个练习中描述的类的程序。
    • 使用toString方法验证是否已创建唯一实例。
  2. 非常感谢你能告诉我的一切。

2 个答案:

答案 0 :(得分:1)

这是Singleton模式的一个实例;在你的情况下,只需用<add key="autoFormsAuthentication" value="false" /> <add key="enableSimpleMembership" value="false"/> 替换this()以使用超类的构造函数(从技术上讲,如果你不进行超级构造函数调用,编译器将为你插入一个;所以你可以删除它)。

思考的食物:

  • 为什么是Merlin课程super()
  • 为什么是Merlin课程private
  • 你的代码的其余部分在哪里?

答案 1 :(得分:1)

摆脱this()

public class Merlin {

    private static Merlin theWizard;

    private Merlin() {}
    ...
}

this后跟parens是用于调用同一个类的构造函数的语法,因为你没有在parens中指定任何参数,那么你指的是无参数教师,它是构造函数这是从中调用的,因此构造函数会递归调用自身,直到它耗尽堆栈空间。 IDE正在检查此问题并尝试向您发出警告。

允许在构造函数中调用super()(它调用超类中的无参数构造函数,这里是java.lang.Object)但不是必需的,编译器将插入对super的调用“T

顺便说一句,你不能有多个具有相同参数列表的构造函数或方法的重载。你不能拥有一个公共的无参数构造函数和一个私有的无参数构造函数。

作者试图描述一个控制其实例创建方式的类,它使其构造函数成为私有,以便只允许类本身实例化该类的对象。