【问题标题】:Are methods of static members considered static?静态成员的方法是否被认为是静态的?
【发布时间】:2018-08-09 05:22:43
【问题描述】:

在以下来自 pg 的静态导入示例中。 Oracle OCA/OCP Java SE 7 程序员 I 和 II 学习指南的第 16 章:

import static java.lang.System.out;              // 1
import static java.lang.Integer.*;               // 2
public class TestStaticImport {
  public static void main(String[] args)  {
    out.println(MAX_VALUE);                      // 3
    out.println(toHexString(42));                // 4
  }
}

这本书提到了标记为 3 的行:

“现在我们终于看到了静态导入功能的好处!我们不必在 System.out.println 中键入 System!哇!第二,我们不必在 Integer 中键入 Integer。 MAX_VALUE。因此,在这行代码中,我们能够使用静态方法和常量的快捷方式。

在这里将 println 称为静态方法是错误的吗?

以上程序如文所示。

对于标记为 4 的行,书中说:“最后,我们再做一个捷径,这次是 Integer 类中的一个方法。”

【问题讨论】:

  • 我猜它被认为是静态的,因为它是通过静态成员访问的,但 println 实际上并不是 PrintStream 类中的静态方法。这是解释语句的正确方法吗?
  • 你是对的,println 绝对不是任何人定义的 static 方法,当然也不是 JLS。它是System 类的static 成员的实例方法。但是,第 4 行,toHexString static 方法。
  • static 方法只能被其他static 方法直接引用。
  • @dryleaf 这甚至意味着什么?如果我当然可以直接从实例方法调用static 方法!或者来自演员!

标签: java static-members static-import


【解决方案1】:

引自书中:

  1. 现在我们终于看到了静态导入功能的好处!我们不必在 System.out.println 中输入系统!哇!第二, 我们不必在 Integer.MAX_VALUE 中输入 Integer。所以在这个 我们能够使用静态方法的快捷方式和 常数。

您的批评是有效的。在这行代码中,我们没有使用静态方法的快捷方式。它只是静态字段的快捷方式。

【讨论】:

    【解决方案2】:

    'import static' 只能引用类的静态成员。
    所以这里它是从 System 类中引用“out”对象。
    在 System 类中,'out' 定义为

      public final static PrintStream out = null;
    

    println() 是 java.io.PrintStream 类的非静态方法。

    所以这里的 'import static' 与 println() 无关,它只是引用 'out' 对象。
    'out' 进一步指的是 println()。

    与整数类相同。它正在导入 Integer 类的所有静态方法和变量。所以可以直接调用为

    out.println(MAX_VALUE);  
    

    而不是

    out.println(Integer.MAX_VALUE);
    

    【讨论】:

      【解决方案3】:

      被称为静态的方法是toHexString,而不是println。该行的意思是他们能够使用单个语句 (import static java.lang.Integer.*;) 导入 toHexStringMAX_VALUE

      【讨论】:

      • "这本书说第 3 行:“所以在这行代码中......” - 所以你同意这本书是错的?我不认为这句话可以以任何方式解释为引用第 4 行和第 3 行。
      • @BoristheSpider 所指的“第 3 行”是 import 语句,而不是用法。您可以在 Java 中导入静态方法和常量。这本书说你不必分别做这两个,而是可以使用星号快捷方式。
      • 这不是标签所说的,也不是计数所说的。
      • 那么也许 OP 没有完全按照书中的代码发布代码,或者他们遗漏了一些东西,但对我来说很明显他们指的是 import 声明。
      • 引自书中:3。现在我们终于看到了静态导入功能的好处!我们不必在 System.out.println 中输入系统!哇!其次,我们不必在 Integer.MAX_VALUE 中输入 Integer。因此,在这行代码中,我们能够使用静态方法和常量的快捷方式。
      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 2012-10-19
      • 2011-08-18
      • 2020-08-06
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多