java - 在java中导入的默认类

标签 java class import printstream

我有一个简单的代码:

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 类),那么反编译器为什么要导入它?

这是反编译后的输出: Check this image

最佳答案

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/

相关文章:

java - 有没有办法从 ViewGroup 中删除 View

java - 使用 GUI 从 jar 运行soapUI

java - 从多个不同类型的用户输入创建一个数组

java - 如何与另一个类的 GUI 通信

python - 将python文件导入到我的pycharm中,位于同一目录中

json - 如何使用aerospike查询语言导入json数据?

java - 同名类

java - 是否可以向 hibernate 生成的查询添加参数?

java - 在 CSS 中设置 JavaFX Anchor Pane 的 anchor

python - 更改导入的类变量