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命名约定。 类名应该以大写字母开头。