一介白书生 发表于 2014-9-10 18:20:55

java的静态变量的小问题 求大侠解决

在一个类中public class Test1{       
        private static Test1 ins ;
       
        private Test1(){}
       

        public static Test1 getIns() {
                return ins == null ? new Test1() : ins;
               
        }
}
另一个类中
public class Test2 {
       
   public static void main(String[] args){
          int i = 5;
           while(i > 0){
                   System.out.println(Test1.getIns().toString());
                   i --;
           }
          
   }
}


打印结果为这样Test1@75da931b
Test1@60f00e0f
Test1@302b2c81
Test1@6276e1db
Test1@6ae6235d
如果在Test1中定义public class Test1{
       
        private static Test1 ins = new Test1();
       
        private Test1(){}
        //private String str;

        public static Test1 getIns() {
                return ins == null ? new Test1() : ins;
               
        }


}
每次打印的结果是一样的 为啥


百日维新 发表于 2014-9-10 18:20:56

栈是存放变量的,堆是存放对象的,然后你声明ins为一个变量,在new的时候就是一个对象,存放在堆里面,但是找的时候把它当作一个变量去栈里面找,肯定找不到啊,因为存放在堆里面,我觉得用static修饰之后,它应该被扔到栈里面去存放了

百日维新 发表于 2014-9-10 20:17:46

private static Test1 ins ;//声明
return ins == null ? new Test1() : ins;//每次都要new一个新的,肯定不一样
private static Test1 ins = new Test1();
你用static修饰,然后new,现在这个变量已经和线程捆绑在一起了,虽然下面还有new,但是程序是不会找下面那个的

百日维新 发表于 2014-9-10 20:19:49

这样写可能更加好理解,底层的东西我也不是和清楚啊

public class Test1{   
           private static Test1 ins ;
          
          private Test1(){}
          
    public static Test1 getIns() {
      return ins == null ? new Test1() : ins;//每次都要new一个新的,肯定不一样
      
}
}


public class Test1{
      
      private static Test1 ins = null;
      
      static {
              ins = new Test1();//把变量和线程捆绑在一起
      }
      
      private Test1(){}
      //private String str;

      public static Test1 getIns() {
                return ins == null ? new Test1() : ins;
               
      }


}

一介白书生 发表于 2014-9-10 21:13:38

百日维新 发表于 2014-9-10 20:17
private static Test1 ins ;//声明
return ins == null ? new Test1() : ins;//每次都要new一个新的,肯 ...

我可能说得不是很专业 static声明的变脸只会有一个内存空间(顺便问一下是堆内存上吗) 不管多少个类实例但这些类实例中的这个static变量会共享同一个内存空间 所以 在第一次循环的时候 不是已经初始化了吗 也就不为空了吗为啥到第二次循环的时候 又重新new了一个呢?

一介白书生 发表于 2014-9-11 08:48:46

百日维新 发表于 2014-9-10 23:04
栈是存放变量的,堆是存放对象的,然后你声明ins为一个变量,在new的时候就是一个对象,存放在堆里面,但是 ...

但是static关键字不是全局变量吗 还是不是很理解 为什么那个地方每一次都要new难道在get方法之后 ins要被销毁

百日维新 发表于 2014-9-11 13:24:11

ins默认是存放在栈了,new之后ins是对象存放在堆里面,去找的时候是去栈里面找的,所以找不到啊,所以又new了啊

Samples、懂么 发表于 2014-9-16 13:49:37

static修饰的静态变量必须初始化,而且程序启动的时候加载该类并且初始化静态变量,无论你创建多少个对象,它们用的都是同一个static对象。

谢家进 发表于 2014-9-24 13:17:27

第一个程序永远都是判断为空,所以又new多一个对象返回。
第二个程序永远都是判断非空,所以只返回定义过的那个。

没有 发表于 2015-4-14 12:11:58

【第一个程序】,因为ins没有赋值【也就是没有初始化】为空,所以在调用getIns() {return ins == null ? new Test1() : ins;},每次判断都为空,所以每次都会new 一个新的对象!
【第二程序】,ins 被初始化了,在调用getIns() 时,每次判断ins都不为空,每次返回的都是ins所指的那个对象,所以结果都是一样的。

:sweat:我应该讲的挺清楚的了,再不懂我建议你去看看马士兵的视频,有一章说的内存解析,说的就是这类问题。

qweqweqwe 发表于 2015-6-3 01:10:06

你new了一个新的,但是没有把这个新的赋给你那个静态的ins变量啊,所以ins 就一直是空的........
你可以写ins==null?(ins=new Test()):ins;

Drizzle 发表于 2015-8-5 16:33:20

static 表示这个变量是类的。第一段代码在声明static变量后,没有进行初始化,编译的时候就会默认给静态引用变量赋值为空,所以每次都会生成新的对象。第二次的话,因为初始化了,所以该变量指向一个具体的地址。所以每次返回值都一样
页: [1]
查看完整版本: java的静态变量的小问题 求大侠解决