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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wlt 中级黑马   /  2013-4-18 20:45  /  1897 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

设置一个静态变量和普通变量有什么区别呢? 谢谢啦  详解下  我理解的  还不透彻

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 黑马-张明 于 2013-4-18 20:58 编辑

静态变量是在堆分配的,而普通变量是在栈上分配的,栈上分配的变量是动态的,可以实现重用,而堆上分配的变量是不能实现重用。还有普通变量可以实现多次初始化,而静态变量只能初始化一次。
java静态变量存放区静态的意思:只有一份!不存在拷贝!
虚拟机内存分为四个区:stack segment,heap segment,data segment,code segment;
stack 区存放函数参数和局部变量;
heap  区存放对象;
data  区存放static 的变量或者字符串常量;
code  区存放类中的方法;
所以,静态变量是存放在data区的
静态变量属于类的属性。至于他放在那里?有人说的是静态区。我不知道到底有没有这个翻译。但是 深入jvm里是是翻译为方法区的。虚拟机的体系结构:堆,方法区,本地方法栈,pc寄存器。而方法区保存的就是一个类的模板,堆是放类的实例的。栈是一般来用来函数计算的。随便找本计算机底层的书都知道了。栈里的数据,函数执行完就不会存储了。这就是为什么局部变量每一次都是一样的。就算给他加一后,下次执行函数的时候还是原来的样子。

全局变量和静态变量的区别在于,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关,说细一点:
class Demo {
public static String a;
public String b;
public static void main(String[] args)
{   Demo d = new Demo();  
d.a; // 警告,虽然可以通过编译,但没有意义  
d.b; // 正确   Demo.a; // 对static变量的正确引用  
Demo.b; // 错误}
3.内存分配方式不同。static字段对每个类来说都只有一份,无论你创建多少对象,该static区域都只有一份,它对于这些对象来说是共享的;而非static字段,因为其从属于对象,因此每有一个对象,就会为该变量申请一个存储空间;
4.生命周期不同。从程序运行开始,static域就已经确定下来,因此在没有创建对象之前,就可以引用该区域变量及函数,而非static域的变量及函数,必须等实例化之后才可以通过对象来调用。
5.理解了this之后,更能体会到static的含义。static方法就是没有this的方法,这也就是为什么在static方法中不能引用非static变量,因为该方法内没有隐含的this,编译器无从知道这个变量是属于哪一个类的。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
静态变量前要加static关键字,而实例变量前则不加

实例变量属于某个对象的属性,必须创建了实例对象,才能使用这个实例变量。

静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了

——————————————————————————————————

我记得毕老师的视频里讲过

实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
普通变量分为成员变量和局部变量,成员变量的作用域是整个类,成员变量的作用域是语句或者函数中还有他们的存放的位置不同,局部变量是存放再堆内存中,语句执行完就释放,而成员就是在对象调用玩之后消失,而静态变量的话存放位置我就不是很清楚,是不是有一个是静态区?不过静态的话是共享的,可以直接调用。是对象一调用就存在了,生命周期比成员的长

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;

静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马