java中static关键字的确切行为

时间:2016-10-01 11:13:16

标签: java

之前,我的代码是:

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来自哪里以及为什么?

3 个答案:

答案 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(对于protectedDog成员),由<form (ngSubmit)="onSubmit(playlistForm)" #playlistForm="ngForm"> // Some code here... </form> 定义的静态标识符在范围内。你不需要对它们进行限定(虽然这样做有助于清晰)。