无法理解Java中静态和非静态变量之间的区别。有人可以帮忙吗?

时间:2017-10-20 18:14:04

标签: java

在java中,我试图理解静态和非静态对象与这样的变量之间的区别。

包含静态对象的代码:

包abc;

public class StaticUsage {

public static StaticUsage propfile;

public static void main(String[] args) {

    checkifPropertiesFileisnull();
    checkifPropertiesFileisnull();
    checkifPropertiesFileisnotnull();
    /*stu.checkifPropertiesFileisnull();*/
}

private static void checkifPropertiesFileisnotnull() {
    if(propfile==null) {
        System.out.println("Propfile is " + propfile);
        propfile = new StaticUsage();
    }
    else {
        System.out.println("Propfile value is " + propfile);
    }
}


private static void checkifPropertiesFileisnull() {
    if(propfile==null) {
        System.out.println("Propfile is " + propfile);
        propfile = new StaticUsage();
    }
    else {
        System.out.println("Propfile value is " + propfile);
    }

}

}

包含非静态对象的代码:

包abc;

public class StaticUsage {

public StaticUsage propfile;

public static void main(String[] args) {

    StaticUsage stu = new StaticUsage();
    stu.checkifPropertiesFileisnull();
    stu.checkifPropertiesFileisnull();
    stu.checkifPropertiesFileisnotnull();
    /*stu.checkifPropertiesFileisnull();*/
}

private void checkifPropertiesFileisnotnull() {
    if(propfile==null) {
        System.out.println("Propfile is " + propfile);
        propfile = new StaticUsage();
    }
    else {
        System.out.println("Propfile value is " + propfile);
    }
}


private void checkifPropertiesFileisnull() {
    if(propfile==null) {
        System.out.println("Propfile is " + propfile);
        propfile = new StaticUsage();
    }
    else {
        System.out.println("Propfile value is " + propfile);
    }

}

}

然而,在这两种情况下,我都得到如下输出:

Propfile为null Propfile值为abc.StaticUsage@15db9742 Propfile值为abc.StaticUsage@15db9742

我听说过静态对象,它在整个类的实例中共享。所以,我第一次得到的值为null,其余的不是null。但是,那么为什么非静态对象,我得到相同的价值?根据我的说法,第一个方法调用的值应该转到堆,然后在调用第二个方法时,它应该再次显示为null。

任何人都可以清楚我的困惑吗?

1 个答案:

答案 0 :(得分:0)

静态属性属于Class,而实例变量属于特定对象实例。您应该仔细阅读:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html