【问题标题】:Why cant a constructor be called like a function?为什么不能像函数一样调用构造函数?
【发布时间】:2014-05-18 06:10:22
【问题描述】:

以下代码不起作用,因为编译器说函数 AnotherNewClass() 不存在?这是为什么?构造函数不只是一个函数吗?为什么构造函数不能不引用特定对象?

class AnotherNewClass
{

    public AnotherNewClass(){
        System.out.println("Hello World!!");
    }

    public AnotherNewClass(String arg){
        System.out.println("Hello World!!");
    }


    public static void main(String []args){
        AnotherNewClass("Hello World!!");//This is the offending code; where the compiler throws an error
    }

}

PS。从下面的几个 cmets 中我想澄清一下,我知道我没有使用 new 关键字,这个问题的目的是强调函数和构造函数之间的区别(不能在没有'new'的情况下调用)

【问题讨论】:

  • 应该是new AnotherNewClass("Hello World!!");
  • 你永远不会显示有问题的代码......嗯。

标签: java function constructor


【解决方案1】:

可以,但您需要new 关键字。

new AnotherNewClass("Hello World!!");

请注意,这不仅仅是调用构造函数。这正是您需要new 关键字的原因。 new 关键字将在堆上分配内存,您的类的对象可以放入其中。但该内存尚不包含这样的对象。然后构造函数初始化那块内存。这就是为什么您不想将构造函数用作常规函数的原因。

【讨论】:

    【解决方案2】:

    拥有构造函数的目的是在Java中初始化对象

    构造函数不能直接调用;当new 关键字创建一个对象时,它们会被隐式调用。可以直接在已经用 new 创建的对象上调用方法。

    所以根据我的说法,你的问题的答案是,它们不可能是因为它们不应该是,这就是它的设计方式。你可以进一步阅读当我们深入说new Class()时会发生什么,你就会知道真正的原因。

    【讨论】:

      【解决方案3】:

      1 - 构造函数用于实例化类,在这里你做错了。应该是

      new AnotherNewClass("Hello World!!");
      

      看看这个question 以获得很好的解释。

      2 - 在 Java 中,我们说的是方法而不是函数。

      【讨论】:

        【解决方案4】:

        关于原因的答案可能会变得相当有哲理,或者只是参考Java Language Specification。无论如何,

        new AnotherNewClass("Hello World!!")
        

        应该可以。

        【讨论】:

          【解决方案5】:

          我假设您是从语言的角度提问。换句话说,为什么Java 不允许这样做,而不是如何 去做。

          我认为这是因为函数(方法)通常需要对象的实例。构造函数是一种特殊情况,因为它创建了这个实例,它需要 new 关键字。构造函数不应该在任何其他时间被调用,我希望这是显而易见的原因!

          在您上面的main 方法中,您没有AnotherNewClass 的实例来调用构造函数,这是编译器告诉您的。

          【讨论】:

            【解决方案6】:

            这就是我从下面的 cmets 和答案中了解到的:

            构造函数在本质上与 Java 中的所有其他函数不同,实际上它只是形式上的函数,而不是处理中的函数。

            构造函数只能处理由“new”运算符分配给它的一块内存或任何本地内存。而函数可以处理调用对象可能引用它的内存。

            'new' 运算符分配那块内存,因此本质上是“创建”一个对象,而构造函数“填充”那块内存。那块内存(由“new”运算符提供)是函数和构造函数在处理方面的主要区别。

            【讨论】:

            • 处理是指函数/构造函数对数据进行什么样的操作
            【解决方案7】:

            ​首先你只能从main方法中调用静态方法。正如其他人所说,必须使用 new 运算符调用构造函数。

            AnotherNewClass an = new AnotherNewClass("Hello World!!");
            

            一旦你有了一个实例,你就可以调用其他方法,如下所示。

            an.someMethod();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-05-30
              • 2016-02-17
              • 2017-12-21
              • 2017-04-09
              • 1970-01-01
              • 2011-09-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多