Java 爪哇语;“无效”;及;“非无效”;建造师
我用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)
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()代码>完全有效。