关于java中静态导入的问题

时间:2011-04-15 09:41:33

标签: java

import static java.lang.System.out;  
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class ShadowingByImporting
{
    public static void main(String[] args)throws FileNotFoundException
    {
       out.println("Calling println() in java.lang.System.out");
       PrintWriter pw=new PrintWriter("log.txt");
       writeInfo(pw);
       pw.flush();
       pw.close();
     }

    public static void writeInfo(PrintWriter out)    
    {
      out.println("Calling pritnln() in the parameter out");
      System.out.println("Calling println() in java.lang.System.out Example");
    }  
}

上面的程序在Khalid Mugal的SCJP指南中给出,根据他的静态导入中的阴影原理写入writeInfo中的第二个println方法。方法将执行两次,但是当我运行以下不同的输出时。

请有人解释一下实际的概念。

Calling println() in java.lang.System.out

Calling println() in java.lang.System.out Example

2 个答案:

答案 0 :(得分:7)

这一般与静态导入无关, 但更确切地说,out的参数writeInfo隐藏了out的外部定义,在这种情况下恰好是静态导入。

当你有

时,这种隐藏也是可能的
public class ShadowingByImporting
{
    PrintWriter out = ...;
    public static void main(String[] args)throws FileNotFoundException
    {

答案 1 :(得分:0)

在函数writeInfo中,out是局部变量,而 System.out 是完全限定的,表示标准输出流。

静态导入通常用于将静态公共对象导入范围,例如在本例中为System.out。因此,您可以直接使用 out 而不使用完全限定名称 ClassName.ObjectName ,在这种情况下为System.out。