繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM