Java 为什么通配符导入语句使用classpath jar类而不是jdk类?
最初,我在类路径的jar中有一个java.io.File类,它没有separatorChar属性。因此,我遇到了以下代码块运行的问题:Java 为什么通配符导入语句使用classpath jar类而不是jdk类?,java,java-io,Java,Java Io,最初,我在类路径的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;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("separatorChar= " + File.separatorChar);
}
}
但我将进口声明更改如下:
import java.io.*;
然后我得到一个错误,基本上是说找不到File.separatorChar
我认为现在正在发生的是import java.io.*使用的是类路径中jar中的类,而import java.io.File具体使用的是java附带的File类
这里的问题是,为什么导入java.io.File有效,而java.io.*无效?当您使用java.io.*时;您所看到的是file,因此到达separatorChar的路径不是file.separatorChar,而是io.file.separaterChar。它涉及起点在哪里。它就像一个文件系统。。。如果您在/users/matt中并键入/documents/mytext.txt,则完整路径为C:/users/matt/documents/mytext.txt如果我返回到用户文件,则相同的命令(/documents/mytext.txt)将查找不存在的C:/users/documents/mytext.txt。希望对您有所帮助。当您使用java.io时。*;您所看到的是file,因此到达separatorChar的路径不是file.separatorChar,而是io.file.separaterChar。它涉及起点在哪里。它就像一个文件系统。。。如果您在/users/matt中并键入/documents/mytext.txt,则完整路径为C:/users/matt/documents/mytext.txt如果我返回到用户文件,则相同的命令(/documents/mytext.txt)将查找不存在的C:/users/documents/mytext.txt。希望能有帮助。你一定是在什么地方把别的事情搞砸了 当我编译
import java.io.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("separatorChar= " + File.separatorChar);
}
}
我明白了
你一定是在什么地方把事情搞砸了 当我编译
import java.io.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("separatorChar= " + File.separatorChar);
}
}
我明白了
在空项目中,代码仍然使用
import java.io.*
编译,因此似乎使用了另一个类。如果使用Eclipse,可以查看文件的工具提示,查看它是哪个类
或者,您可以使用
System.out.println(File.class.toString())
它将在运行时打印出类。在一个空项目中,代码仍然使用import java.io.*
编译,因此似乎使用了另一个类。如果使用Eclipse,可以查看文件的工具提示,查看它是哪个类
或者,您可以使用
System.out.println(File.class.toString())
它将在运行时打印出类。正如EJP对原始问题的评论一样
这是正确的。Import java.io.*为编译器提供了另一个查找不在当前包中的类的位置。Import java.io.File告诉编译器要使用哪个文件。寓意:不要重用JDK类名
正如EJP对原始问题的评论
这是正确的。Import java.io.*为编译器提供了另一个查找不在当前包中的类的位置。Import java.io.File告诉编译器要使用哪个文件。寓意:不要重用JDK类名
有没有办法查看在无头环境中使用了哪个类?当然有:写入文件。感谢@felix freiberger,这验证了我的假设,即肯定存在另一个类。我更新了我的问题,使之更加具体,并提供了更多细节。有没有办法查看在无头环境中使用的类?当然有:写入文件。感谢@felix freiberger,这验证了我的假设,即必须存在另一个类。我更新了我的问题,使之更加具体,并提供了更多的细节。io.File.separatorChar
将不起作用。答案完全不正确。对不起,这并不是一个完整的答案,而是对发生的事情的解释。你永远不可能比你现在的位置低1级,但这并没有传达出你的想法,即使传达了,这也不是答案。问题完全不同。*打开另一个包作用域进行搜索:File+将编译器定向到特定包作用域中的特定类。io.File.separatorChar
将不起作用。答案完全不正确。对不起,这并不是一个完整的答案,而是对发生的事情的解释。你永远不可能比你现在的位置低1级,但这并没有传达出你的想法,即使传达了,这也不是答案。问题完全不同。*打开另一个包作用域进行搜索:File+将编译器指向特定包作用域中的特定类。当前包中必须有另一个名为File的类。@EJP,这似乎是问题所在。JVM搜索类的方式肯定有一些细微的差别,因为使用import java.io.File时使用的是正确的类,而import java.io.*时使用的是不同的类。这是正确的。Import java.io.*为编译器提供了另一个查找不在当前包中的类的位置。Import java.io.File告诉编译器要使用哪个文件。寓意:不要重用JDK类名。当前包中必须有另一个名为File的类。@EJP,这似乎就是问题所在。JVM搜索类的方式肯定有一些细微的差别,因为使用import java.io.File时使用的是正确的类,而import java.io.*时使用的是不同的类。这是正确的。Import java.io.*为编译器提供了另一个查找不在当前包中的类的位置。Import java.io.File告诉编译器要使用哪个文件。寓意:不要重用JDK类名。