我有一个简单的代码:
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),那么反编译器为什么要导入它?
答案 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.List
和java.util.List
),因此要解决这种歧义,您必须使用完整的类名或导入您想要的名称(如果您想要使用它们,你仍然必须使用其中一个的全名)。正如您所正确提到的,默认情况下始终只导入java.lang
中的类。同样,这样做是为了方便,因此您只能使用System
代替java.lang.System
(尽管java.lang.System.out.println()
也有效)。
在您的示例中,由于您没有直接提及源中的PrintStream
,因此无需导入它。进口与类加载没有任何共同之处(在运行时发生,而不是在编译期间)。