【问题标题】:Java out.println() how is this possible?Java out.println() 这怎么可能?
【发布时间】:2011-01-31 00:53:26
【问题描述】:

我看过一些代码,例如:

out.println("print something");

我试过import java.lang.System;

但它不起作用。 out.println()怎么用?

【问题讨论】:

    标签: java printing libraries


    【解决方案1】:

    静态导入可以解决问题:

    import static java.lang.System.out;
    

    或者使用导入每个静态方法和字段

    import static java.lang.System.*;
    

    @Steve C 的附录:请注意 @sfussenegger 在我的回答中的评论中说了这一点。

    “使用 System.out 的这种静态导入仅适用于简单的运行一次代码。”

    所以请不要以为他(或我)认为这个解决方案是好的做法。

    【讨论】:

    • 现在大多数 ide 都会为你解决这个问题,在 eclipse 中进行组织导入,它会改变你的 java.lang.System.*;到 java.lang.System.out;给你(假设你只用out)
    【解决方案2】:
    PrintStream out = System.out;
    out.println( "hello" );
    

    【讨论】:

      【解决方案3】:

      @sfussenegger 的回答解释了如何进行这项工作。但我会说不要这样做!

      有经验的 Java 程序员使用,并期望看到

              System.out.println(...);
      

      而不是

              out.println(...);
      

      System.out 或 System.err 的静态导入是 (IMO) 不好的风格,因为:

      • 它打破了公认的成语,并且
      • 这使得追踪在测试期间添加但未删除的不需要的痕迹打印变得更加困难。

      如果您发现自己对 System.out 或 System.err 进行了大量输出,我认为最好将流抽象为属性、局部变量或方法。这将使您的应用程序或库更易于维护和重用。

      (显然,如果您的 Java 程序是一次性的东西,您打算在完成当前任务后丢弃,那么可维护性就不是问题。但另一方面是“丢弃”代码通常是不要扔掉。)

      【讨论】:

      • 我同意缺少“系统”。乍一看可能会令人困惑。使用局部变量或属性并没有真正改变任何东西,不是吗?使用本地 protected void println(Object o) { System.out.println(o);} 可能是个好主意,因为输出目标很容易更改,例如 log.info(o)。
      • @sfussenegger - 使用局部变量或属性 确实 比在所有地方使用 System.out 更容易更改目的地......是否 System.out是否导入。
      • 好的,没错。但也可以将 System.out 的静态导入替换为名为 out 的字段 - 无需将 System.out 分配给 out。但总的来说,我同意你的看法。使用 System.out 的这种静态导入仅适用于简单的运行一次代码。
      【解决方案4】:

      嗯,你通常会使用

      System.out.println("print something");
      

      不需要任何导入。但是,由于 out 是 System 内部的一个静态字段,您可以像这样编写使用静态导入:

      import static java.lang.System.*;
      
      class Test {
          public static void main(String[] args) {
              out.println("print something");
          }
      }
      

      看看这个link。通常,只有在使用来自特定类的大量静态方法时才会这样做,例如我一直将它用于 junit 断言和 easymock。

      【讨论】:

      • out 不是方法,而是字段。
      • 哇!谢谢你抓住那个。我的意思是说字段。
      【解决方案5】:

      out 是 System 类的 PrintStream 类型的静态变量(对象),println() 是 PrintStream 类的函数。

      class PrintStream
      {
          public void println(){}    //member function
          ...
      }
      
      class System
      {
          public static final PrintStream out;   //data member
          ...
      }
      

      这就是为什么使用类名System 访问静态变量(对象)out 的原因,这进一步调用了其类型为PrintStream(这是一个类)的方法println()。

      【讨论】:

        【解决方案6】:

        您必须先创建一个对象out。更多关于这里的信息:

            // write to stdout
            out = System.out;
            out.println("Test 1");
            out.close();
        

        【讨论】:

        • 现在你不用“创建”一个对象了 :)
        • 官方 java 文档使用术语“创建对象”以及我猜你指的是“实例化”java.sun.com/docs/books/tutorial/java/javaOO/…
        • 您根本不创建或实例化对象。您只需复制参考。因此System.out 和out 将引用同一个对象,即System.out == out 将是true
        • 哦,错过了你的“现在”部分:P
        【解决方案7】:

        您也可以在套接字中看到这一点...

        PrintWriter out = new PrintWriter(socket.getOutputStream());
        
        out.println("hello");
        

        【讨论】:

          【解决方案8】:

          只需导入:

          import static java.lang.System.*;
          

          【讨论】:

            【解决方案9】:

            或者简单地说:

            System.out.println("Some text");
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-05-25
              • 2018-11-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多