在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。
任何人都可以清楚我的困惑吗?
答案 0 :(得分:0)
静态属性属于Class,而实例变量属于特定对象实例。您应该仔细阅读:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html