鱼C论坛

 找回密码
 立即注册
查看: 5663|回复: 11

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

[复制链接]
发表于 2014-9-10 18:20:55 | 显示全部楼层 |阅读模式
1鱼币
在一个类中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;
               
        }


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


最佳答案

查看完整内容

栈是存放变量的,堆是存放对象的,然后你声明ins为一个变量,在new的时候就是一个对象,存放在堆里面,但是找的时候把它当作一个变量去栈里面找,肯定找不到啊,因为存放在堆里面,我觉得用static修饰之后,它应该被扔到栈里面去存放了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-10 18:20:56 From FishC Mobile | 显示全部楼层
栈是存放变量的,堆是存放对象的,然后你声明ins为一个变量,在new的时候就是一个对象,存放在堆里面,但是找的时候把它当作一个变量去栈里面找,肯定找不到啊,因为存放在堆里面,我觉得用static修饰之后,它应该被扔到栈里面去存放了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,但是程序是不会找下面那个的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
               
        }


}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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了一个呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-11 08:48:46 | 显示全部楼层
百日维新 发表于 2014-9-10 23:04
栈是存放变量的,堆是存放对象的,然后你声明ins为一个变量,在new的时候就是一个对象,存放在堆里面,但是 ...

但是static关键字不是全局变量吗 还是不是很理解 为什么那个地方每一次都要new  难道在get方法之后 ins要被销毁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-11 13:24:11 From FishC Mobile | 显示全部楼层
ins默认是存放在栈了,new之后ins是对象存放在堆里面,去找的时候是去栈里面找的,所以找不到啊,所以又new了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-16 13:49:37 | 显示全部楼层
static修饰的静态变量必须初始化,而且程序启动的时候加载该类并且初始化静态变量,无论你创建多少个对象,它们用的都是同一个static对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-24 13:17:27 | 显示全部楼层
第一个程序永远都是判断为空,所以又new多一个对象返回。
第二个程序永远都是判断非空,所以只返回定义过的那个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-14 12:11:58 | 显示全部楼层
【第一个程序】,因为ins没有赋值【也就是没有初始化】为空,所以在调用getIns() {return ins == null ? new Test1() : ins;},每次判断都为空,所以每次都会new 一个新的对象!
【第二程序】,ins 被初始化了,在调用getIns() 时,每次判断ins都不为空,每次返回的都是ins所指的那个对象,所以结果都是一样的。

:sweat:我应该讲的挺清楚的了,再不懂我建议你去看看马士兵的视频,有一章说的内存解析,说的就是这类问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-3 01:10:06 | 显示全部楼层
你new了一个新的,但是没有把这个新的赋给你那个静态的ins变量啊,所以ins 就一直是空的........
你可以写  ins==null?(ins=new Test()):ins;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-5 16:33:20 | 显示全部楼层
static 表示这个变量是类的。第一段代码在声明static变量后,没有进行初始化,编译的时候就会默认给静态引用变量赋值为空,所以每次都会生成新的对象。第二次的话,因为初始化了,所以该变量指向一个具体的地址。所以每次返回值都一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表