[英]Java - are constructors static?
我刚刚写了一个这样的构造函数:
public ArchivesManager(String identifier) {
String[] components = String.split("\nNEW");
}
但是有一条错误消息: non-static method split(java.lang.String) cannot be referenced from a static context
。 我知道那个错误信息,但为什么构造函数是静态的?!
这是因为 split 应该在 String 对象上调用。 IE
String foo = "Hello, world";
String[] arr = foo.split(",");
我知道那个错误信息,但为什么构造函数是静态的?!
构造函数上下文不是静态的,但是当您使用类名限定它时,您在静态上下文中显式调用了split
方法; 即String.split(...)
。
你可能打算这样写:
String[] components = identifier.split("\nNEW");
它调用作为identifier
传递的String
对象的(非静态)上下文中的方法; 即它说应该拆分哪个字符串。
要回答标题中的问题:
“构造函数不是成员” [JLS 索引] 所以静态并不是一个真正合适的概念。 构造函数不是成员,因为它们没有被继承(我希望静态方法也没有被继承)。 从类文件的角度来看,它们是返回void
的特殊实例方法。 调用构造函数的字节码首先分配内存,复制对该内存的引用,然后在其中一个引用上调用构造函数。 (如果目标是 1.4 或更高版本,对于“外部 this”的内部类分配和封闭的final
字段,在调用构造函数之前发生。)
因为这个String.split("\nNEW");
split
不是静态方法
你可能需要
public ArchivesManager(String identifier) {
String[] components = identifier.split("\nNEW");//NOTE: components are local to const. this doesn't make sense
}
而不是String.split("\nNEW");
你需要调用identifier.split("\nNEW");
. 您要拆分标识符对象(字符串类型)。 基本上你所说的是“拆分字符串类”,这没有意义,因此编译器会抱怨。
此错误并不意味着您的构造函数是静态的。 这意味着 Split 不是静态方法,您必须从其对象中调用此方法。
其实我也不知道为什么构造函数默认是静态的。 《Thinking in Java》一书说,“尽管它没有显式使用 static 关键字,但构造函数实际上是一个静态方法。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.