我有一个简单的代码:
public class Hello
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}
我知道 Object
类在每个 java 程序中默认导入,但我想问一下 PrintStream
类是否也默认导入,如果我们使用 print()
或 println()
函数?
因为Object
类属于java.lang
包,而PrintStream
类属于java.io
包,所以如果它不是默认导入的,那么我们如何使用 PrintStream
类的 println()
方法呢?
如果默认情况下不导入它(PrintStream
类),那么反编译器为什么要导入它?
最佳答案
Java 程序中的中间表达式类型不需要在源代码级别导入。只有当您将此类表达式的值分配给声明的变量时,您才必须明确其类型;那时你必须添加导入(或使用限定名称)。
在您的例子中,System.out
就是这样一个中间表达式;它的类型确实是 java.io.PrintStream
,默认情况下 不 导入它,因为它不在 java.lang
中。如果您将类(class)修改为
import java.io.PrintStream;
public class Hello {
public static void main(String[] args)
{
PrintStream myOut = System.out;
myOut.println("Hello World");
}
}
您需要添加导入语句,或使用限定名称,如
public class Hello {
public static void main(String[] args)
{
java.io.PrintStream myOut = System.out;
myOut.println("Hello World");
}
}
在字节码层面,情况有所不同:由于 JVM 需要加载所有依赖项才能执行代码,因此所有依赖项都列在 .class
文件中,包括中间表达式的类型。显然,OP 屏幕截图中使用的反编译器不够聪明,无法意识到这种导入在源代码级别是不必要的,因此它只是为 .class
中列出的所有依赖项创建导入语句文件。
关于java - 在java中导入的默认类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125801/