-1

如果我这样使用

class Test {
    public Test() {
        System.out.println("constructor");
    }
}

public class MainClass {
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
    }
}

我得到 2 个输出构造函数构造函数

但是,如果我将 void 添加到构造函数 (public void Test()) - 输出为空。为什么这么奇怪?

4

8 回答 8

11

这并不奇怪,这是它的正常行为。构造函数没有返回类型

public Test() {
    System.out.println("constructor");
}

是一个构造函数,但是

public void Test() {
    System.out.println("constructor");
}

是一个简单的方法,您可以使用t1.Test().

本页列出了构造函数和方法之间的区别:

1)Java中方法与构造函数的第一个区别是构造函数的名称必须与类的名称相同,但Java中的方法没有这样的要求。Java 中的方法可以具有任意名称。

2)Java中方法和构造函数之间的第二个区别是构造函数没有任何返回类型,但方法有返回类型并且返回一些东西,除非它的void。

3)Java中构造函数和方法之间的第三个区别是构造函数是链式的并且它们以特定的顺序被调用,方法没有这样的设施。

4)与方法不同,构造函数,但在类中声明不被视为类的成员。构造函数不被子类继承,但方法被子类继承,直到它们被私有化。在这种情况下,它们仅在声明它们的类中可见。同样,私有构造函数意味着您不能从外部创建该类的对象,这是用于在 Java 中实现单例模式的技术之一。

5)Java中方法和构造函数的另一个区别是特殊关键字this和super用于显式调用构造函数。方法没有这样的东西,它们有自己的名字可以用来调用它们。

于 2013-06-22T11:18:24.207 回答
5

因为如果你添加void到不再是构造函数的构造函数中。它只是一个恰好与类同名的方法。

然后,您可以问“但是如果构造函数不存在,我该如何调用呢?” 好吧,每个类都有隐式的、无参数的构造函数。

结论:构造函数不能有返回类型。

于 2013-06-22T11:18:32.023 回答
2

构造函数没有返回类型。方法有返回类型。如果你添加void(),那么它会变成一个方法。要调用该方法,您需要调用它。

t1.test();
于 2013-06-22T11:18:32.420 回答
1

它的java语言规范。

文档说

一个类包含被调用以从类蓝图创建对象的构造函数。构造函数声明看起来像方法声明——除了它们使用类的名称并且没有返回类型。

于 2013-06-22T11:20:16.333 回答
1

当你写:

public Test() 
    {
        System.out.println("constructor");
    }

这绝对是一个构造函数。而且,当您通过编写创建 Test 类的第一个对象时:

    Test t1 = new Test();

这将第一次调用您的构造函数,并且您在 print 语句中编写的代码,即构造函数将打印在控制台上。请记住,当您创建类的对象时会自动调用构造函数。

第二次通过编写创建对象:

    Test t2 = new Test();

这将调用相同的构造函数,并在屏幕上打印相同的“构造函数”,但这将是第二次。

所以你得到了答案——构造函数构造函数

在第二种情况下,当您编写时:

public void test()
    {
        System.out.println("constructor");
    }

您的编译器会将其视为方法而不是构造函数。

即使 void 不返回任何东西,它也是一个“返回类型”,构造函数永远不会有返回类型,永远不会。这并不意味着它们不返回任何东西,只是它们没有返回类型。

因此,在创建类的对象时不会自动调用方法。所以,你不应该期望同样的结果。

现在,您得到一个空输出,因为编译器为每个类提供了一个虚拟/默认构造函数,即使您没有定义它。并且,无论您是否显式调用它,每次创建该类的对象时都会调用此默认构造函数!

默认构造函数可以被认为是写在某处:

test() {   }

所以现在你可以想象当你创建两个对象时会发生什么,程序会正确编译和运行,返回空输出给你!

我希望这对你有所帮助。

于 2013-06-22T11:42:05.793 回答
0

因为构造函数没有返回类型。添加返回类型时创建的void是一个名为Test()不返回任何内容的方法。

编译器为您提供了一个无参数构造函数,因为您没有编写任何构造函数,并且它什么也不做,因为它不是您创建的方法。

于 2013-06-22T11:19:23.860 回答
0

java 构造函数的名称与它所属的类的名称相同。构造函数的语法不包括返回类型,因为构造函数从不返回值。

 public Test() {
    System.out.println("constructor");
}
于 2013-06-22T11:19:54.827 回答
0

如果您将返回类型添加到构造函数,那么它将不再是构造函数。这有点像一种方法。

于 2013-06-22T11:20:47.137 回答