java中static什么时候使用,知道static是static定义静态变量量

博客分类:
比较有意思的一段代码,可以先运行看效果再将注释取消后看运行效果,上代码
* 每个对象实例化的时候,都要路过static方法
* 但是编译器会保证static快的执行是原子的,即便是多线程过来也要一个个执行
* 只不过,只有第一个实例动作的时候static快内的代码被执行
* 其他实例只是“路过”
* 即,每个实例都要走到static块,但是static块只会执行一次,
* 是通过调用该类的 client方法导致的,该方法只在类被加载的时候JVM调用
* @author liuinsect
public class StaticBlockTest
implements Runnable{
System.out.println("test");
while(true){
public void run() {
System.out.println("run");
* @author liuinsect
* @param args
public static void main(String[] args) {
StaticBlockTest s = new StaticBlockTest();
StaticBlockTest s1 = new StaticBlockTest();
StaticBlockTest s2 = new StaticBlockTest();
StaticBlockTest s3 = new StaticBlockTest();
StaticBlockTest s4 = new StaticBlockTest();
StaticBlockTest s5 = new StaticBlockTest();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s1);
t1.start();
t2.start();
在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,有JVM保证其只执行一次
* 初始化:
* 初始化过程是执行类构造器clinit()方法的过程
* 1. clinit里面的内容是合并static块与static变量组成,static块只能访问在它之前定义的static变量
* 2. 虚拟机保证父类的clinit会先于子类clinit执行,最先执行的clinit肯定是java.lang.Object的
* 3. 父类static字段会先赋值,这个2
* 4. 如果没有static块或节段,不会生成clinit
* 5. 对于接口,只有在子接口中使用到父接口中变量时,父接口才会初始化,接口实现类初始化时不会执行接口的clinit
* 6. 虚拟机保证多线程下只有一个线程能执行类的clinit,会被加锁与同步
不错,抄书抄得还可以
要过年啦.也没啥人了..哈哈..先预祝新年快乐顺便说下这个代码我的看法,你把几个概念弄混淆了..static语句块,不是在实例化的时候被执行的,而是在jvm进行类加载的时候 被执行的..和你特意在main方法中实例化的两个对象没有任何关系.也和你特意开的线程没有任何关系..我说的理由如下package zhenghui.
public class StaticBlockTest
implements Runnable{
System.out.println("test");
while(true){
public void run() {
System.out.println("run");
* @author liuinsect
* @param args
public static void main(String[] args) {
StaticBlockTest s = new StaticBlockTest();
StaticBlockTest s1 = new StaticBlockTest();
StaticBlockTest s2 = new StaticBlockTest();
StaticBlockTest s3 = new StaticBlockTest();
StaticBlockTest s4 = new StaticBlockTest();
StaticBlockTest s5 = new StaticBlockTest();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s1);
t1.start();
t2.start();
直接运行,还是会打印 test..虽然没有创建任何这个对象..
while(true){
}这段代码会在执行static语句块的时候进入死循环.其他没任何用..同祝新年快乐, 我明白你的意思,不知是不是我没有表述清楚,再说明下,static语句块确实是在类加载器加载该类的时候初始化的,确切的说,实在类加载器的第四个步骤:初始化 阶段执行的,所以和new 这个对象的关系是,当我在main函数中new这个对象的时候JVM去找这个类,加载进来执行到类加载器的最后一个步骤:初始化的时候执行的static里的语句,而你这里注释掉mian中的代码还会有test打印的原因在于,你main函数正好就是在当前的这个类中,你要执行main函数当然需要类加载器加载该类,当然也有就有static块的执行。至于我用while循环,我想表达的意思是: 第一个线程还在static块中的时候,第二线程不能进入static块,从而,第二个线程里的所有其他方法也不能执行。不知道我的描述有没有说清楚?欢迎讨论~~~谢谢
浏览: 96462 次
楼主有没有测试过,没有发你说什么锁不成功,都不知道你想表达什么 ...
Prototype creates a brand new i ...
请问倒数第2个线程栈的调用顺序的图是用什么画的啊 ,还是ecl ...
其实没有必要这么麻烦,只要ThreadLocal是static ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'先谈static
static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其它static方法和static域
—摘抄自《Java编程思想》第四版86页#5.4.2 static的含义
无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本数据类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的默认初始化的值就是null。
—摘抄自《Java编程思想》第四版95页#5.7.2 静态数据的初始化
由上面我可以总结出几点:
static成员是所有类对象公共的
static成员可以直接用类名调用,无需创建对象
static方法中不能使用this关键字
那么还是不知道静态成员何时才会被初始化,虽然上面摘抄的第二段解释中说了静态数据的初始化,然而并没有说何时会进行初始化,那么倒底何时初始化?
在谈static成员何时初始化
遇到这种问题,我们可以反过来推,那么怎么推?根据什么推?
相信大家都做过数学的求证题,那么这种题目都有一个特征,那么就是会提供至少一个或多个已知条件。好,那么我们来找找我们需要的已知条件
条件:static成员可以直接用类名调用,无需创建对象
从上面的条件中我们可以得知哪些信息了?
可以直接用类名调用
不需要创建任何对象就可以调用
我们在试想,当我们直接用类名去调用一个静态成员的时候,这个静态成员肯定必须要在我们调用之前就要被初始化好,那么也就是说在类被加载的时候就会被初始化好,因为在类被装载到jvm虚拟机后,如果不初始化static修饰的成员,那么就不能正确的使用类名去调用静态成员了{}
一句话:类中的静态成员会随着类的加载而加载
本文已收录于以下专栏:
相关文章推荐
一、Static修饰符
S//成员变量,实例(对象)变量。
Static S//静态的成员变量,类变量。
用于修饰成员(变量,函数)
当每个对象都有...
main()方法为啥必须要public static void类型的??java中的静态成员 1.main()方法  在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的...
1.main()方法
  在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名...
1、static 成员在类外初始化2、const 成员(及引用成员)在类的构造函数初始化列表中初始化3、static const /const static 成员可以在类中初始化(实际上是申明)也可以...
------- android培训、java培训、期待与您交流! ----------
一、面向对象(static关键字)
static:用于修饰成员(成员变量,成员函数)
当成员被静态关键字...
java:for循环删除集合元素的陷阱|浮点数相减少引起的误差|误用八进制|死循环|初始化静态成员变量的陷阱
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Android--慎用static静态变量
Android是用Java开发,其静态变量的生命周期遵守Java的设计。静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。那么在Android中呢?用的Dalvik
vm也是一样的。不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收、内存泄漏这些问题有关,有必要加深研究和理解。
一、静态变量在类被加载的时候分配内存。
类在什么时候被加载?
当我们启动一个app的时候,系统会创建一个进程,此进程会加载一个Dalvik
VM的实例,然后代码就运行在DVM之上,类的加载和卸载,垃圾回收等事情都由DVM负责。也就是说在进程启动的时候,类被加载,静态变量被分配内存。
二、静态变量在类被卸载的时候销毁。
类在什么时候被卸载?
在进程结束的时候。
说明:一般情况下,所有的类都是默认的ClassLoader加载的,只要ClassLoader存在,类就不会被卸载,而默认的ClassLoader生命周期是与进程一致的,本文讨论一般情况。
三、Android中的进程什么时候结束
这个是Android对进程和内存管理不同于PC的核心——如果资源足够,Android不会杀掉任何进程,另一个意思就是进程随时可能会被杀掉。而Android会在资源够的时候,重启被杀掉的进程。也就是说静态变量的值,如果不做处理,是不可靠的,可以说内存中的一切都不可靠。如果要可靠,还是得保存到Nand或SD卡中去,在重启的时候恢复回来。
另一种情况就是不能把退出所有Activity等同于进程的退出,所以在用户点击图标启动应用的时候,以前存放于静态变量中的值,有可能还存在,因此要视具体情况给予清空操作。
四、Application也是一样不可靠
Application其实是一个单例对象,也是放在内存中的,当进程被杀掉,就全清空了,只不过Android系统会帮重建Application,而我们存放在Application的数据自然就没有了,还是得自己处理。
五、静态引用的对象不会被垃圾回收
只要静态变量没有被销毁也没有置null,其对象一直被保持引用,也即引用计数不可能是0,因此不会被垃圾回收。因此,单例对象在运行时不会被回收。
原文地址:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢
作者:用户
浏览:960 次
java中static变量和static方法以及普通方法在那个内存中存储呢?请高手指点,谢谢栈内存:局部变量和对象的引用变量;堆内存:对象;以上是我所知道的,那么static变量和static方法以及
java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢
栈内存:局部变量和对象的引用变量;
堆内存:对象;
以上是我所知道的,那么static变量和static方法以及普通方法在那个内存中存储呢?
请高手指点,谢谢
static和普通方法都存在堆内存中,堆内存有个永久区permgen,这里面会存类信息。
所以不断的加载类或jar包可能出现permgen oome的错误。
static是在堆内存的数据区。
解决方案二:
解决方案三:
这个问题你得先了解JVM中内存回收机制,现在用的是分代回收机制,分为新生代,老年代和终生代,声明为static的属性和方法是放在终生代的,存放在此区的数据GC是不会去回收的
解决方案四:
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
栈内存:基本类型数据和对象的引用变量;
堆内存:new的对象和数组;
解决方案五:
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
栈内存:基本类型数据和对象的引用变量;
堆内存:new的对象和数组;
解决方案六:
自己声明的在堆中,系统声明的在栈中
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供

我要回帖

更多关于 静态变量static的作用 的文章

 

随机推荐