【问题标题】:Question about constructors in Java关于Java构造函数的问题
【发布时间】:2011-06-08 06:48:05
【问题描述】:

我有几个关于 Java 构造函数的问题

  1. 构造函数可以是私有的吗?如果是,那么在什么情况下?
  2. 构造函数是不是方法?
  3. 如果构造函数不返回任何内容,那么为什么我们每次调用它时都会得到一个新对象?
  4. 如果我们不指定,构造函数的默认访问修饰符是什么。

编辑

1 和 3 的答案非常明确。我仍然不确定 2 和 4,因为我得到了不同的答案。

【问题讨论】:

  • 是的。我建议在serverfault.com 上询问有关 Tomcat 的部分
  • @Chris:好的,会的。谢谢
  • 对于#4,共识似乎是包私有的。指定 public 的答案只是部分正确,因为公共可见性仅限于包。 #2 看起来也像共识:它是一种方法。这些解释只是使用了不同的术语。
  • 对于#4,默认不是包私有(即默认)。所有类都扩展了 java.lang.Object,其中包含一个公共构造函数,通过继承,子类继承了这个公共构造函数。因此,答案是公开的。如有疑问,请进行测试。

标签: java constructor


【解决方案1】:

构造函数可以是私有的吗?如果是,那么在什么情况下?

是的。没有条件。当然,除了类本身之外,没有人可以调用它。

这实际上是一种常见的模式:拥有static getInstance() 并保持构造函数私有。

也可以有公共构造函数内部调用的私有构造函数。

构造函数是不是方法?

嗯。我拒绝”。至少,这是一种“非常特殊”的方法。究竟是在什么情况下?术语不如您尝试做的重要。

如果构造函数没有返回任何东西,那么为什么我们每次调用它都会得到一个新的对象。

new 运算符返回一些东西(新实例)。

构造函数的默认访问修饰符是什么。

与方法相同。包私有。

如果不指定任何构造函数,则该类将获得一个默认构造函数,该构造函数不带参数,除了调用父构造函数之外什么都不做,并且是公共的。

【讨论】:

  • 只有当类是公共的时,默认的构造函数才会是公共的。来自 JLS:“在枚举类型中,默认构造函数是隐式私有的。否则,如果该类被声明为公共,则默认构造函数被隐式赋予访问修饰符 public;如果该类被声明为受保护,则默认构造函数是隐式给定访问修饰符 protected;如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符 private;否则,默认构造函数具有没有访问修饰符所隐含的默认访问权限。"
【解决方案2】:
  1. 是的,无论如何。但是,如果一个类的所有构造函数都是私有的,这意味着该类不能直接实例化。您需要使用 Factory Pattern 之类的东西来创建对象的实例。
  2. 是的,构造函数是一个方法。
  3. 更好的思考方式是new 运算符返回对象,并在创建对象的过程中调用构造函数。另一种思考方式(虽然这只是一种思考方式,但在技术上并不正确)只是返回类型是约定俗成的。阅读更多有关此内容的好地方是阅读context of C++ 中的new。构造函数的作用不是创建对象,而是初始化对象中包含的内存。
  4. Java 中构造函数的默认访问是包私有的,就像任何其他方法一样。 (其中一个来源:http://www.javabeginner.com/learn-java/introduction-to-java-access-modifiers 来自马口:http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

【讨论】:

  • 如果构造函数是方法,那么它为什么不返回任何东西呢?因为根据 java 方法,它必须返回一些东西,否则使用也可以无效。但是方法的返回类型中必须有一些东西???
  • 啊,是的,你是对的。当您探索这个主题时,您还会发现,与其他方法不同,构造函数不能被继承。它是一种方法,它只是一种特殊的方法。
  • 默认访问为default,不同于private或protected。默认方法可以被同一个包中的类访问。受保护的方法可以通过实现(扩展该方法的类)或在同一个包中访问。 private 只能在类本身的范围内调用,或者内部类。对象的默认访问是公共的,因为所有类都扩展了 Object,其中包含 public Object() {} 构造函数。构建器模式是另一种使用私有构造器的创建模式。
  • @hisdrewness 你说的完全正确,这对我来说是个彻头彻尾的傻瓜。我已经更新了我的答案以消除这种不准确之处。
【解决方案3】:
  1. 是的,构造函数可以是私有的。当您希望通过工厂方法或 Singleton 等模式对实例创建进行更严格或交替的控制时,就会这样做。
  2. 它是一种方法,但不是直接调用的。它是在您创建新对象时代表您调用的一种特殊类型的方法。
  3. 构造函数不返回任何内容,它们创建新对象。
  4. 默认为包私有。因此对包内的任何类都是公开的,但对包外的代码不可见。

关于 Tomcat 性能和可扩展性的想法:这是一个高度可变的情况,具体取决于您的服务器硬件和请求类型,当然还有服务每个请求的代码的质量、效率和内存占用。

并发请求的下限是 500。考虑到您可能希望为每个请求创建一个线程,并给每个线程一个 1MB 的堆栈,您正在寻找 0.5 GB 的线程堆栈空间。这是在堆内存和分配那么多线程的性能开销之前。我认为如果需要一次处理这么多请求,您可能需要考虑使用更重的服务器,例如 JBoss。

【讨论】:

    【解决方案4】:
    • 可以为任何类声明构造函数。
    • 构造函数是一种特殊方法,它返回其所属类的实例,因此您无需指定构造函数的返回类型。
    • 如下所述,包私有是正确的答案。

    【讨论】:

    • “方法没有默认的访问修饰符”如果你不指定任何东西,它就是包私有的。
    • 实际上构造函数不返回任何内容,它是new 运算符创建实例并调用该实例的/在该实例上的构造函数(因此我们可以在ctor 中使用this)。
    【解决方案5】:
    1. 是的——工厂实例单例经常使用这种模式,强制用户通过静态工厂方法初始化他们的类。
    2. 是的,这是一种方法
    3. 因为这是构造函数所做的 - 它构造。 (假设会返回构造结果)
    4. 与方法相同

    关于您的 Tomcat 问题,这取决于 Tomcat 的版本、它使用的 IO 模型(例如,NIO 与历史网络 IO 模块)以及您的配置。单个 Tomcat 一次可以处理数百个请求,尽管并发性是可调的(每个请求将由不同的线程或池中的线程处理)。

    【讨论】:

      【解决方案6】:

      构造函数的默认访问修饰符是CLASS ACCESS MODIFIER, 如果一个类是 public ,那么构造函数的访问修饰符是 public 。如果类是默认的,那么构造函数也是默认的。

      【讨论】:

        【解决方案7】:
        1. 在任何情况下都可以将构造函数创建为私有的。
        2. 构造函数是一种特殊类型的方法,当我们使用它时可以自动调用它 正在为相应的类创建对象。
        3. 构造函数不包含任何返回值。它只是创建新对象。不应为构造函数提供任何返回类型。
        4. 构造函数的默认访问说明符是public

        【讨论】:

          【解决方案8】:
          1. 是的。
          2. 是的。
          3. 因为new调用了构造函数。返回的对象是new,构造函数只是设置了内部状态。
          4. 公开。

          【讨论】:

          • “4. 公开”?我猜是模棱两可的问题。隐含的默认构造函数是公共的,但没有修饰符的构造函数是包私有的。
          • @Thilo:我问的是没有修饰符的构造函数。
          猜你喜欢
          • 2014-06-13
          • 2014-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多