在java中导入的默认类

时间:2015-08-20 18:34:20

标签: java class import printstream

我有一个简单的代码:

p.summonerRank = (string)JObject.Parse(data2).First.First[p.summonerId]["tier"];

我知道默认情况下会在每个java程序中导入public class Hello { public static void main(String[] args) { System.out.println("Hello World"); } } 类,但我想问一下,如果我们使用Object或{{PrintStream,我们也会默认导入print()类。 1}}函数?

由于println()类属于Object包而java.lang类属于PrintStream包,因此如果默认情况下未导入,那么我们如何使用java.io类的println()方法?

如果默认情况下没有导入(PrintStream class),那么反编译器为什么要导入它?

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

3 个答案:

答案 0 :(得分:1)

不需要在源代码级别导入Java程序中的中间表达式类型。仅当您将此类表达式的值赋给声明的变量时才必须将其类型设置为显式;在那一刻你必须添加导入(或使用限定名称)。

在你的情况下,System.out就是这样一个中间表达;它的类型确实是java.io.PrintStream,默认情况下导入,因为它不在java.lang中。如果你要修改你的课程

import java.io.PrintStream;
public class Hello {
    public static void main(String[] args)
    {
        PrintStream myOut = System.out;
        myOut.println("Hello World");
    }
}

您需要添加import语句,或使用

中的限定名称
public class Hello {
    public static void main(String[] args)
    {
        java.io.PrintStream myOut = System.out;
        myOut.println("Hello World");
    }
}

在字节码级别上,故事是不同的:因为需要加载所有依赖项以使JVM能够执行代码,所有这些依赖项都列在.class文件中,包括中间表达式的类型。显然,OP的屏幕截图中使用的反编译器并不聪明,以至于在源代码级别上不需要这样的导入,因此它只为.class文件中列出的所有依赖项创建import语句。

答案 1 :(得分:0)

  

我想问一下,如果我们使用print()或println()函数,是否也默认导入PrintStream类

不,from the JLS

  

编译单元自动访问其包中声明的所有类型,并自动导入预定义包java.lang中声明的所有公共类型。

因此System可以使用System.out

  

所以如果它没有默认导入,那么我们如何能够使用PrintStream类的println()方法?

由于System.out类型为it belongs to java.lang,因此您可以使用 Private Sub Label_DblClick(Cancel As Integer) Dim iID As Integer Dim SQL As String iID = [ID] SQL = "SELECT [ID], [Sign 1], [Sign 2], [Destination 1], [Destination 2], [Label], [Wire #] " & _ "FROM [WireMaster] WHERE [ID] = " & iID & " " & _ "INTO TempData (IN G:\OPS\ZShared\PrintData.accdb)" DoCmd.RunSQL SQL End Sub 的所有可见方法

答案 2 :(得分:0)

  

反编译器导入它的原因

看起来像您正在使用的反编译器中的错误。这里完全没必要导入。

您可以根本不使用导入进行编程,只需使用完全限定的类名,如下所示:

java.io.PrintStream out = System.out;

导入仅用于方便,因此您可以在代码中使用简单的类名。相同的简单名称可能出现在不同的包中(例如,java.awt.Listjava.util.List),因此要解决这种歧义,您必须使用完整的类名或导入您想要的名称(如果您想要使用它们,你仍然必须使用其中一个的全名)。正如您所正确提到的,默认情况下始终只导入java.lang中的类。同样,这样做是为了方便,因此您只能使用System代替java.lang.System(尽管java.lang.System.out.println()也有效)。

在您的示例中,由于您没有直接提及源中的PrintStream,因此无需导入它。进口与类加载没有任何共同之处(在运行时发生,而不是在编译期间)。