Java 爪哇语;“无效”;及;“非无效”;建造师

Java 爪哇语;“无效”;及;“非无效”;建造师,java,constructor,void,Java,Constructor,Void,我用java编写这个简单的类只是为了测试它的一些特性 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)

我用java编写这个简单的类只是为了测试它的一些特性

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);
    }
}
输出为:

二,

但在这部法典中:

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中,构造函数不是一个方法。它只有类的名称和特定的可见性。如果它声明返回某个内容,则它不是构造函数,即使它声明返回一个
void
。注意这里的区别:

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

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

public void class1()不是构造函数,它是一个void方法,其名称恰好与类名匹配。从来没有人叫它。相反,java创建了一个默认构造函数(因为您还没有创建一个),它什么也不做。

根据定义在构造函数中使用void会导致它不再是构造函数。 构造函数没有具体的返回类型。虽然void不返回严格意义上的值,但它仍然被视为返回类型


在第二个示例中(使用void),必须执行
h.class1()
才能调用该方法,因为它不再是构造函数。或者您可以删除这个空白。

这可以说是Java中的一个设计缺陷

class MyClass {

   // this is a constructor
   MyClass() {...}

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

 }
完全合法。也许不应该,但事实确实如此

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


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

第二个不是构造函数。它只是一个碰巧与其类共享一个名称的方法。因为它不再是构造函数。这个类似问题的答案给出了一个很好的理由。令人惊讶的是,你在我刷新页面之前写下了答案;总之,可以说构造函数是用于初始化对象实例的方法的特例,因为它在语法上支持构造函数支持的99%。避免这种混淆是遵循方法命名约定的另一个很好的理由。@Makoto在Java中,@chrylis:是的,我知道这一点。但在使用Java进行AST解析时,我发现它是一个没有返回类型的方法(因此是构造函数);x、 MyClass()完全有效。