Java - 构造函数是静态的吗?

时间:2011-01-27 10:10:25

标签: java static constructor

我刚写了一个像这样的构造函数:

public ArchivesManager(String identifier) {
    String[] components = String.split("\nNEW");
}

但是有一条错误消息:non-static method split(java.lang.String) cannot be referenced from a static context。我知道错误信息,但为什么构造函数是静态的?!

7 个答案:

答案 0 :(得分:9)

这是因为应该在String对象上调用split。即。

String foo = "Hello, world";
String[] arr = foo.split(",");

答案 1 :(得分:4)

  

我知道错误信息,但为什么构造函数是静态的?!

构造函数上下文不是静态的,但是当您使用classname限定它时,您在静态上下文中显式调用了split方法;即String.split(...)

你可能想写这个:

String[] components = identifier.split("\nNEW");

调用String对象传递的identifier对象的(非静态)上下文中的方法;即它说应拆分哪个字符串

答案 2 :(得分:3)

回答标题中的问题:

“构造函数不是成员”[JLS索引]因此静态不是一个合适的概念。构造函数不是成员,因为它们不是继承的(我希望静态方法也不会被继承)。从类文件的角度来看,它们是返回void的特殊实例方法。调用构造函数的字节码首先分配内存,复制对该内存的引用,然后在其中一个引用上调用构造函数。 (如果定位1.4或更高版本,对于“外部this”的内部类赋值,并且在调用构造函数之前发生封闭final字段。)

答案 3 :(得分:2)

因为String.split("\nNEW"); split不是静态方法

你可能需要

public ArchivesManager(String identifier) {
    String[] components = identifier.split("\nNEW");//NOTE: components are local to const. this doesn't make sense
}

答案 4 :(得分:0)

而不是String.split("\nNEW");,您需要致电identifier.split("\nNEW");。您想要拆分标识符对象(字符串类型)。基本上你所说的是“拆分字符串类”,这没有意义,因此编译器会抱怨。

答案 5 :(得分:0)

此错误并不意味着您的构造函数是静态的。这意味着Split不是静态方法,你有2个从它的对象调用thisc方法..........

答案 6 :(得分:-1)

实际上,我不知道为什么默认情况下构造函数是静态的。 “Thinking in Java”一书中说,“尽管它没有明确使用static关键字,但构造函数实际上是一个静态方法。”