A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱皓 中级黑马   /  2012-2-23 15:26  /  4508 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果我声明了一个类
class  person
{
     static  string  str ="demo";
}

我想知道这个静态变量的生命周期是怎么样的,在听老毕的视频时
老是听他说尽量不要用静态变量,他的生命周期太长,为什么,求广大网友解答

8 个回复

倒序浏览
静态变量在子类会被继承,且不可以重新定义,所以周期很长,一旦定义,在子类继承后就无法修改了
回复 使用道具 举报
应为静态是随着类的加载而加载,随着类的消失而消失。也就是说,只要类在,被static所修饰的成员就在,所以,静态的生命周期很长。如果定义太多的话,时间长了,还是会消耗内存的资源。
回复 使用道具 举报
静态变量( static )是类相关的变量,所以他的生命周期是从这个类被声明,到这个类彻底被垃圾回收机制(gc)彻底回收才会被销毁。
实例变量是这个类的对象里的变量,它和静态变量不同,它只能由创建出的对象来调用,所以实例变量是从这个对象(其实就是实例)被创建开始,直到这个对象没有任何引用变量去引用它,最终被垃圾回收站回收,这时这个实例变量也跟着就消失了。
总而言之:静态变量生命周期就是类的开始和销毁,实例变量生命周期就是对象的开始和销毁。‘

说白了一点,用static,那他的生命周期就是整个程序,程序运行时无法被垃圾回收机制(gc)所回收,必须直到程序结束,才会释放内存。而这样占据的内存实在是太多了,所以要尽量少且static变量。
回复 使用道具 举报
静态变量在内存中只有一个,JAVA虚拟机加载类的时候为其分配内存,位于方法区,被类的所有实例共享,其生命周期取决于类的生命周期。。。当类被卸载。。。静态变量也被销毁
回复 使用道具 举报
我也听过这句话,本来不很理解,因为后来老毕讲课是清一色把函数定义成静态的。静态的生命周期确实长,因为只要类一加载它就存在,等类消亡了,它才消亡,对象虽然能调用静态成员,但是对象消失后静态成员也不消失。所以说它生命周期太长,用静态不合理。而后面讲课清一色把函数定义为静态的是因为主函数是静态的,他们都在一个类中,被调用,所以要定义成静态的。一同被加载。方便演示。
回复 使用道具 举报
静态变量在内存中只有一个,
JVM加载类的时候为其分配内存,
位于方法区,
被类的所有实例共享,
其生命周期取决于类的生命周期
当类执行完或被卸载时静态变量也被销毁
回复 使用道具 举报
按照毕向东老师的视频讲的话,static是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外还可以直接被类名调用,static有四个主要特点,一.随着类的加载而加载,随着类的消失而消失,它的生命周期最长,二.静态是先存在的对象是后存在的,三.它可以被所有的对象共享,四.可以直接被类名所调用。
回复 使用道具 举报
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。

static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马