静态常量与非静态常量的区别
今天用Eclipse的一个FindBug插件来扫描工程,提示了好多这样的问题:
就是建议把
private final int ABC = 1;
替换成
private static final int ABC = 1;
我们都知道,静态类型只需要初始化一次,但是这样就常驻内存了不是吗,我的问题就是为什么常量要声明称静态的呢?
请各位大侠指教!
------最佳解决方案--------------------常驻内存只有在加载了当前类的时侯才会发生;
------其他解决方案--------------------减小内存开销,static,保证了你的ABC变量在内存中只有一个,而且唯一
------其他解决方案--------------------什么叫常量?一般来说就是不会变的量
静态与非静态:
静态:对于该类的对象来说,都只有一个,叫类变量
非静态:每个该类的对象都各有一个,叫成员变量.
因为是常量,不会变的,所有的对象都是一样的,所以就只需要一个就够了.
工商银行卡类:他们有一个静态的银行卡名称叫:工商银行卡-->静态
每个卡又月自己的卡号-->非静态.
在创建对象的时候,需要每个成员变量(非静态)开辟内存空间,类变量(静态变量)则是在类加载的时候就创建好了.
------其他解决方案--------------------楼上的强大
------其他解决方案--------------------
很详细 楼主看了这个就可以不看别的了
------其他解决方案--------------------static 是确定生命周期的
------其他解决方案--------------------private final int ABC = 1;该类的每个实例都持有一个abc变量
private static final int ABC = 1;整个应用中只存在一个abc变量
------其他解决方案--------------------static是代表所有的对象共用的资源
------其他解决方案--------------------可以把static final 看做类变量 一个类中只有唯一的一个 final看做对象变量 每个对象里面只有唯一一个 但是各个对象的final变量可以不一样
------其他解决方案--------------------static 的 内存只能存在一个。非static的 可以有N个 一个对象就有一个!·
------其他解决方案--------------------用static修饰过的常量会存到常量池里面。存入的方式是:先到常量池里面寻找,看是否该常量已经存在,如果存在返回该常量的引用,不存在就在常量池里面新建一个常量,返回引用。如果没有修饰,就属于对象的属性,绝大多是对象是存在堆中,也就是如果多个对象存在同样一个常量,在堆中会为每一个对象的该常量分配存储空间。由此可以看出,static修饰后的作用就是减少内存的消耗,常量的存储位置发生了变化。