我刚写了一个像这样的构造函数:
public ArchivesManager(String identifier) {
String[] components = String.split("\nNEW");
}
但是有一条错误消息:non-static method split(java.lang.String) cannot be referenced from a static context
。我知道错误信息,但为什么构造函数是静态的?!
答案 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关键字,但构造函数实际上是一个静态方法。”