之前,我的代码是:
class Dog
{
public static int i=6;
}
public class Cat
{
public static void main(String[] arg)
{
System.out.println(Dog.i);
}
}
它执行得很好,但当我删除课程时#34; Dog"从我的代码中重新编译并运行,它给出了相同的答案:6。
所以,我的问题是:即使我的代码中没有Dog
类,变量Dog.i
来自哪里以及为什么?
答案 0 :(得分:0)
您没有删除Dog.class文件。否则编译是不可能的。
答案 1 :(得分:0)
javac
编译器做的少数优化之一是不断内联。这意味着可以在编译时将任何已知的原始常量插入到位。这意味着您的代码与
public class Cat
{
public static void main(String[] arg)
{
System.out.println(6 /*Dog.i*/);
}
}
您可以删除Dog.*
并提示您不要重新编译Cat
它将正确运行。注意:再次运行javac
并不意味着将重新编译所有内容,javac
会检查.class
文件是否永远不会是.java
文件。
此外,如果您删除Dog.java
,则不会删除Dog.class
,您只需要稍后重新编译此类。
答案 2 :(得分:-1)
如果从Dog.
行中删除System.out.println
,代码将不再编译。我假设你已离开extends Dog
班级的Cat
:
class Dog
{
public static int i=6;
}
public class Cat extends Dog // <===== Note
{
public static void main(String[] arg)
{
System.out.println(Dog.i);
}
}
如果是这样,i
解析的原因是Cat
是 Dog
,而Dog
内的代码位于Cat
1}}类或其子类,例如public
(对于protected
或Dog
成员),由<form (ngSubmit)="onSubmit(playlistForm)" #playlistForm="ngForm">
// Some code here...
</form>
定义的静态标识符在范围内。你不需要对它们进行限定(虽然这样做有助于清晰)。