2013-06-22 30 views
-2

如果我用这么代码与“空”构造函数不执行

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个输出 构造 构造

但是如果我添加空隙的构造函数(公共无效测试()) - 输出为空。为什么这么奇怪?

+2

构造函数没有返回类型 –

+1

请参阅 http://stackoverflow.com/questions/6801500/why-do-constructors-in-java-not-have-a-return-type – Swapnil

+0

@Jayram构造函数在'JVM'中有一个'void'返回类型,但它远离开发者隐藏 – Anirudha

回答

10

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

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

是一个构造,但

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

的是,你可以调用使用t1.Test()的简单方法。

This page列表构造函数和方法之间的差异:

1)方法VS在Java中构造之间第一个区别是构造的名字必须是相同的同类的名称,但对于方法没有这样的要求在Java中。方法在Java中可以有任意的名称。

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

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

4)与方法不同,在类中声明的构造函数不被视为Class的成员。构造函数不是由子类继承,而是方法由子类继承,直到它们变为私有。在这种情况下,他们只能在声明他们的课堂上看到。同样,私有构造函数意味着您不能从外部创建该类的对象,这是用于在Java中实现Singleton模式的技术之一。

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

+0

谢谢,但我认为构造函数也是方法(但具体) – yAnTar

+1

@yAnTar通常我们可以将它看作一种方法,但它不是一个简单的方法,你不能使用't1.Test()'作为其他方法调用它,当初始化对象时调用构造函数 – BackSlash

+0

在JVM级别,构造函数hav e void返回类型,但它对开发人员隐藏 – Anirudha

5

因为如果将void添加到不再是构造函数的构造函数中。这只是一种碰巧与班级名称相同的方法。

然后,你可以问“但我怎样才能调用构造函数,如果一个不存在?”那么,每个类都有隐式的,无参数的构造函数。

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

2

构造函数没有返回类型。方法有返回类型。如果你添加void()那么它会转向一种方法。要调用您需要调用的方法。

t1.test(); 
+0

但我认为 - 构造函数也是方法(但具体)。 – yAnTar

+0

人们也可以说,构造函数没有名字,只有返回类型:) – dasblinkenlight

0

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

编译器给你一个无参数的构造函数,因为你没有写任何东西,而且什么都不做,因为它不是你创建的方法。

0

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

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

它的java语言规范。

Docs saying

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

0

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

1

当你写:

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

这绝对是一个构造函数。而且,正如你的写作创建测试类的第一个对象:

Test t1 = new Test(); 

这将调用构造函数的第一次,你已经写在打印语句的代码,也就是构造将在控制台上打印。请记住,创建类的对象时会自动调用构造函数。

你第二次通过书面形式创建对象:

Test t2 = new Test(); 

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

所以,你得到的答案原样 构造 构造

在第二种情况下,当你写:

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

你的编译器就会把它当作一个方法,而不是构造函数。

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

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

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

默认的构造函数可以被认为是书面的地方为:所以现在你可以想像,当你创建两个对象发生了什么

test() { } 

,计划将编译和运行正常,空输出返回到你!

我希望对你有帮助。