【问题标题】:Java - are constructors static?Java - 构造函数是静态的吗?
【发布时间】:2011-01-27 10:10:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: java static constructor


    【解决方案1】:

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

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

    【讨论】:

    • 哦,操,是的,显然...我手头有一些错误的文档。
    【解决方案2】:

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

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

    你可能打算这样写:

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

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

    【讨论】:

    • String[] components = identifier.split("\nNEW"); 在构造函数中有意义吗??
    • 如果您假设 1) identifier 是构造函数参数(在 OP 的示例中),2) "\nNEW" 旨在成为正则表达式(这是合理的) , 和 3) OP 打算在他尚未编写或已删除的构造函数的其余部分中使用 component 以试图隔离问题。
    【解决方案3】:

    回答标题中的问题:

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

    【讨论】:

      【解决方案4】:

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

      你可能需要

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            其实我也不知道为什么构造函数默认是静态的。 《Thinking in Java》一书说,“虽然没有显式使用 static 关键字,但构造函数实际上是一个静态方法。”

            【讨论】:

              猜你喜欢
              • 2021-11-08
              • 2022-06-16
              • 2011-01-28
              • 1970-01-01
              • 2011-08-13
              • 2011-02-24
              • 1970-01-01
              • 1970-01-01
              • 2011-03-01
              相关资源
              最近更新 更多