为什么通配符导入语句使用类路径jar类而不是jdk类



最初我在类路径的jar中有一个java.io.File类,它没有separatorChar属性。因此,我遇到了以下代码块运行的问题:

import java.io.File;
public class HelloWorld {
    public static void main(String[] args) { 
        System.out.println("separatorChar= " + File.separatorChar); 
    } 
}

但我更改了进口声明如下:

import java.io.*;

然后我得到一个错误,基本上是说找不到File.separatorChar。

我认为,importjava.io.*使用的是类路径中jar中的一个类,而importjava.io.File则专门使用java附带的File类。

这里的问题是,为什么导入java.io.File有效,而java.io.*无效?

在一个空的Project中,代码仍然使用import java.io.*编译,因此似乎使用了另一个类。如果你使用Eclipse,你可以查看File的工具提示,看看它是哪个类

或者,您可以使用

System.out.println(File.class.toString())

它将在运行时打印出类。

正如EJP对原始问题的评论,

这是正确的。importjava.io.*为编译器提供了另一个查找当前包中没有的类的位置。导入java.io.File告诉编译器要使用哪个文件。寓意:不要重复使用JDK类名。

你一定是在别的地方搞砸了。

当我编译时

import java.io.*;
public class HelloWorld {
    public static void main(String[] args) { 
        System.out.println("separatorChar= " + File.separatorChar); 
    } 
}

我得到

c:filesj>javac HelloWorld.java
c:filesj>java HelloWorld
separatorChar= 

当您使用java.io.*时;你看到的只是文件,所以到达separatorChar的路径不是file.seperatorChar,而是io.file.separaterChar。它处理起点在哪里。这就像一个文件系统。。。如果您在/users/matt中,并键入/documents/mytext.txt,则完整路径为C:\users/matt/documents/mytext.txt。如果我返回到users文件,则相同的命令(/documents/metext.txt)将查找不存在的C:\users/documents/myext.txt。希望能有所帮助。

最新更新