2011-01-27 103 views
3

我只是写这样的构造:Java - 构造函数是静态的吗?

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

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

回答

9

这是因为拆分应该String对象上调用。即

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

哦,很明显......我手边有一些错误的文档。 – ryyst 2011-01-27 10:13:21

2

也不是一成不变的方法

你可能需要

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

我知道的错误消息,但为什么是构造静态?

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

你可能意味着写:

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

它调用在作为identifier通过String对象的(非静态)上下文中的方法;即它说哪个字符串应该被拆分为

+0

`String [] components = identifier.split(“\ nNEW”);`它会在构造函数中有意义吗? – 2011-01-27 10:29:42

0

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

0

这个错误并不意味着你的构造函数是静态的。这意味着分割也不是一成不变的方法,你有2个呼叫thisc方法,从物体..........

3

要回答标题中的问题:

“构造函数不是成员” [ JLS指数],所以静态不是一个合适的概念。构造函数不是成员,因为它们没有被继承(我希望静态方法不被继承)。从类文件的角度来看,它们是返回void的特殊实例方法。调用构造函数的Bytecode首先分配内存,复制对该内存的引用,然后在其中一个引用上调用构造函数。 (如果目标是1.4或更高版本,对于“outer this”的内部类分配并在调用构造函数之前出现final字段)。

-1

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