java“void”和“non void”构造函数

我在java中编写了这个简单的类来testing它的一些特性。

public class class1 { public static Integer value=0; public class1() { da(); } public int da() { class1.value=class1.value+1; return 5; } public static void main(String[] args) { class1 h = new class1(); class1 h2 = new class1(); System.out.println(class1.value); } } 

输出是:

2

但是在这个代码中:

 public class class1 { public static Integer value=0; public void class1() { da(); } public int da() { class1.value=class1.value+1; return 5; } public static void main(String[] args) { class1 h = new class1(); class1 h2 = new class1(); System.out.println(class1.value); } } 

这个代码的输出是:

0

那么,为什么当我在构造方法声明中使用void时,类的静态字段不再变化呢?

在Java中,构造函数不是一个方法。 它只有class级的名字和具体的知名度。 如果它声明了返回值,那么它不是一个构造函数 ,即使它声明返回一个void 。 注意这里的区别:

 public class SomeClass { public SomeClass() { //constructor } public void SomeClass() { //a method, NOT a constructor } } 

另外,如果一个类没有定义一个构造函数,那么编译器会自动为你添加一个默认的构造函数。

公共无效class1()不是一个构造函数,它是一个无效的方法,其名称恰好与类名匹配。 它从来没有被称为。 相反,java创build一个默认的构造函数(因为你还没有创build一个),它什么都不做。

按照定义在构造函数中使用void将导致它不再是构造函数。 构造函数具体没有返回types。 虽然void不会以最严格的意义返回一个值,但它仍被视为返回types。

在第二个例子中(在你使用void的地方),你必须为方法调用h.class1() ,因为它不再是构造函数。 或者你可以删除空白。

这可以说是Java中的一个devise缺陷。

 class MyClass { // this is a constructor MyClass() {...} // this is an instance method void MyClass() {...} } 

完全合法。 可能不应该,但是。

在你的例子中,class1()永远不会被调用,因为它不是一个构造函数。 相反,默认的构造函数被调用。

build议:熟悉Java命名约定。 类名应该以大写字母开头。