当前位置:编程学习 > JAVA >>

Java static关键字为什么不能应用于局部变量?

static成员变量属于类,而不是对象,这个清楚。但不能解释static为什么不能应用于方法内的局部变量,我只想这个局部变量作中间值或其他,那编译器为什么会有这个限制?
是不是多个对象同时调用这个方法时,这个局部static变量不好控制?因为static变量只占用一分存储区域。
哪位老大解释下,谢谢! --------------------编程问答-------------------- 按照LZ对static局部变量的理解,这个与类变量有何区别? --------------------编程问答-------------------- 人生自古谁无死, 惭愧. --------------------编程问答-------------------- 局部变量最好不要设成静态变量,局变变量是有生命周期的,用完后JAVA很快就回收资源了。
如果设成静态变量,那JAVA怎么回收被其占用的内存。 --------------------编程问答-------------------- 建议楼主贴个代码
楼主是要在方法内部定义static变量吗?
public void test(){
    static int a = 1;
} --------------------编程问答-------------------- 例子就是4楼所示,为什么java不允许?c/c++都可以这么用。 --------------------编程问答--------------------
引用 5 楼 lixiaofeng1 的回复:
例子就是4楼所示,为什么java不允许?c/c++都可以这么用。


就是不支持被~~~有啥可以不可以的。~没有不是一样写了很多Java代码吗? --------------------编程问答--------------------
引用 6 楼 healer_kx 的回复:
引用 5 楼 lixiaofeng1 的回复:

例子就是4楼所示,为什么java不允许?c/c++都可以这么用。


就是不支持被~~~有啥可以不可以的。~没有不是一样写了很多Java代码吗?


+1

语法结构就这样 --------------------编程问答-------------------- 楼主你没喝酒吧?static本来就只能修饰静态变量、全局变量你干吗非得强迫他修饰局部变量呢?

你这问题就相当于“为什么男人不能用于生孩子???????????”......... --------------------编程问答-------------------- static 变量是给类用的。这样类初始化的时候,就会给static进行初始化
如果你在方法里面定义一个static。这时候编译器就不知道你这个变量怎么初始化了

这个是和java的设计相关的。java全是面向对象设计的,单独一个方法不能持有一块空间。 --------------------编程问答-------------------- 这就是规定!
为什么杀人要偿命,欠债要还钱?这就是规定! --------------------编程问答-------------------- static是静态方法 --------------------编程问答-------------------- 真不明白楼主为什么非要定义局部的static变量,这样的定义有任何意义吗??没必要啊…… --------------------编程问答-------------------- 这个和加载顺序有关,在类加载的时候首先是加载的静态的变量,静态的代码段,然后加载静态方法。当你将你的静态变量写在静态方法中的时候,很明显违反了加载的顺序。 --------------------编程问答-------------------- 再进一步,为什么java不支持方法里的static变量,答案是因为不!需!要!
你所能想到的类似C/C++里需要使用方法内部static变量的场合java里通过类成员变量都可以实现 --------------------编程问答-------------------- 英语有动词的时态变化(过去式、过去分词),法语、德语变化种类更多的离谱。
汉语需要吗?? --------------------编程问答-------------------- 你既然清楚static的变量是类的,哪就应该知道为什么啊,
你在方法里面定义的变量是局部变量,就是说他有一定的作用范围和生命周期,就只能在方法里面使用而不能将其扩展到别的地方,这个变量在方法结束后就会被回收器回收,就不再存在了,而你要强制将其加上static就是要把它的作用范围扩展到整个类,这就与你开始定义这个变量时违背了,这是语法上的错误。
建议深刻理解这句话
static成员变量属于类,而不是对象 --------------------编程问答-------------------- static能修饰局部变量和全局变量 --------------------编程问答-------------------- C/C++和java的区别呗,适应了就好。
类的静态变量一样可以满足你的需求。 --------------------编程问答-------------------- 各位老大别激动阿,我滴酒不沾。
举个例子吧:static成员方法不能操作非static成员变量(当然,你把对象作为参数传入,再操作成员变量是可以)。语法是这样规定的。为什么这样规定?因为static成员方法不关联某个对象(没有this指针/引用),如果操作成员变量肯定会修改某个对象的状态的,直接操作成员变量肯定是不行的,编译器才会禁止这么做。
男人不能生孩子不是上帝规定的吧?总有理由可以解释吧?
如果需要多次调用包含static局部变量的方法,且需要用到static局部变量上一次的值,这么做也是合理的阿。
static成员变量也可以实现上面说到的功能,如果说编译器为了简单易行,就是不允许static应用于方法内局部变量,那也是原因阿。
各位别激动阿,我当语法规定记着就好。 --------------------编程问答-------------------- static 可以看做全局变量 --------------------编程问答--------------------
引用 19 楼 lixiaofeng1 的回复:
各位老大别激动阿,我滴酒不沾。
举个例子吧:static成员方法不能操作非static成员变量(当然,你把对象作为参数传入,再操作成员变量是可以)。语法是这样规定的。为什么这样规定?因为static成员方法不关联某个对象(没有this指针/引用),如果操作成员变量肯定会修改某个对象的状态的,直接操作成员变量肯定是不行的,编译器才会禁止这么做。
男人不能生孩子不是上帝规定的吧?总有理由可以解释吧……

呵呵 --------------------编程问答-------------------- 知道 this是干嘛的不? 知道this 了 在想static --------------------编程问答-------------------- 是不是可以这样解释
普通的局部变量他的生命周期只存在与方法中,他不是对象级的更不是类级的,我们需要他是因为我们需要每次调用这个方法时他都会被初始化,这不同于全局变量(创建对象时被初始化),更不同于全局静态变量(类初始化时被初始化)

但如果是一个局部静态变量,如果寄存他的方法是静态方法则他的生命周期等同于类的声明周期(等同于全局静态变量),反之如果寄存他的方法是非静态方法,那他的生命周期是不是等同于对象的生命周期(等同于普通全局变量),如果是这样他的存在可以被其他变量所取代,不支持他并不会对程序产生影响,所以java不支持他 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 19 楼 lixiaofeng1 的回复:
各位老大别激动阿,我滴酒不沾。
举个例子吧:static成员方法不能操作非static成员变量(当然,你把对象作为参数传入,再操作成员变量是可以)。语法是这样规定的。为什么这样规定?因为static成员方法不关联某个对象(没有this指针/引用),如果操作成员变量肯定会修改某个对象的状态的,直接操作成员变量肯定是不行的,编译器才会禁止这么做。
男人不能生孩子不是上帝规定的吧?总有理由可以解释……

其实男人是可以生孩子的,至少在国外已经实现了..
Static成员变量不能操作static成员变量的原因是生命周期的问题,static成员方法存在这个类被加载的整个生命周期内,而非static成员变量属于某个对象,它的值可以轻易的被改变,如果static成员方法调用的话会被它的改变值影响到,所以编译器是不会让你调用非static成员变量的... --------------------编程问答-------------------- 顶起~
引用 16 楼 brilliantenginer 的回复:
你既然清楚static的变量是类的,哪就应该知道为什么啊,
你在方法里面定义的变量是局部变量,就是说他有一定的作用范围和生命周期,就只能在方法里面使用而不能将其扩展到别的地方,这个变量在方法结束后就会被回收器回收,就不再存在了,而你要强制将其加上static就是要把它的作用范围扩展到整个类,这就与你开始定义这个变量时违背了,这是语法上的错误。
建议深刻理解这句话
static成员变量属于类,……
--------------------编程问答-------------------- 用static修饰后的变量不就充当了全局变量了。 --------------------编程问答-------------------- ...你清楚是局部变量也就应该明白只有当前函数能够使用这个变量

static属性(类属性)与对象属性都是全局变量 所以可以加这些修饰符 --------------------编程问答-------------------- 蛋疼的问题!
这就是java规则,想玩,就得按照规则玩。

假如让你声明一个局部静态变量,按照你的意思,那所有的方法都可以对该属性进行操作(否则你提的问题没有任何意义),那难道别的方法想操作该变量的时候还要调用初始化局部静态变量的方法? --------------------编程问答-------------------- 甲鱼的臀部 --------------------编程问答-------------------- sun公司不让呗
--------------------编程问答-------------------- static在程序初始化之前已经初始化好了。你把局部变量写出static,但是局部变量一般是在方法里。方法都没有调用,你就实例化里面的变量。这样做岂不是多此一举。LZ在钻牛角尖 --------------------编程问答-------------------- 有些东西,搞不懂,记住就好了!何必纠结! --------------------编程问答-------------------- 看来就是语法规定,但不见得高明到哪里,当然c++也视局部静态变量为有作用域的类共享,蛋疼ing。某些javaer不要混淆了静态和全局的概念,这是两码事。 --------------------编程问答-------------------- 首先这个是规定,设计者定的,其次,这个规定没什么问题 --------------------编程问答--------------------
引用 3 楼 gardner2010 的回复:
局部变量最好不要设成静态变量,局变变量是有生命周期的,用完后JAVA很快就回收资源了。
如果设成静态变量,那JAVA怎么回收被其占用的内存。



对呀  局部变量定义成static的话 第一次被调用到包含局部static变量的方法后被初始了,就一直存在内存里面了,不好回收吧? --------------------编程问答-------------------- 静态全局,好好理解吧 --------------------编程问答-------------------- c/c++都可以这么用。还有面向过程的成分,,, --------------------编程问答-------------------- java中就这么规定的吧 --------------------编程问答-------------------- 规定呵 --------------------编程问答-------------------- 反正法好证明
加入可以使用static修饰局部变量,那么在其他方法里如何访问该变量(访问不到),既然访问不到就和没有一样

用编程思想证明
static变量是类的成员,比如班里面的人数,而方法是类的行为,里面没有定义static 变量的需要

从内存管理考虑
static 变量会长期存储到内存里,而方法里的static 变量是否长期存到内存中呢?
如果存的话,内存开销太大 --------------------编程问答--------------------
引用 16 楼 brilliantenginer 的回复:
你既然清楚static的变量是类的,哪就应该知道为什么啊,
你在方法里面定义的变量是局部变量,就是说他有一定的作用范围和生命周期,就只能在方法里面使用而不能将其扩展到别的地方,这个变量在方法结束后就会被回收器回收,就不再存在了,而你要强制将其加上static就是要把它的作用范围扩展到整个类,这就与你开始定义这个变量时违背了,这是语法上的错误。
建议深刻理解这句话
static成员变量属于类……

+1 --------------------编程问答-------------------- 额  这个要扯很远的  

还有类变量之分 

他们存放的地方都不一样,类变量和class对象一起存放在了方法区,而局部变量存放在栈中,一个线程对应一个栈,局部变量是有生命周期的随着线程的消亡或者方法的执行结束就消亡了,而类变量不会.....

(额,我不多说了,要扯真的可以扯很多的)他们根本不是一个概念 --------------------编程问答-------------------- 这个问题有必要讨论吗?
自己写编译器,你想怎么规定就怎么规定,常量能修改也不是不可能的,对吧。 --------------------编程问答--------------------


1.static 是全局的,或者说是公共的,可修饰变量,方法。 占用一块内存区。置于多次调用,值就是最后一次赋的值。
2.不能被类中非static 方法调用。static 方法可以调用非static方法。因为static 方法是公共的,而非static方法是属于对象调用的。 --------------------编程问答-------------------- 有些默认的东西记住就行,不行就看原码。 --------------------编程问答-------------------- 当河上已经有了桥的时候,就不需要再修个隧道了。
C/C++中的静态局部变量的概念,Java中完全可以用类成员和访问权限修饰符一起实现。 --------------------编程问答-------------------- 3L正解?! --------------------编程问答-------------------- 因为java的内存回收机制决定的,静态变量和临时变量占用的内存区块是不一样的,如果按照你的那个把局部变量也可以static的话,那java是没办法回收的,而且假如局部变量在方法内部,多线程的时候调用频繁,那这个值怎么控制?,且线程结束无法释放,很容易内存溢出,百害而无一利。 --------------------编程问答--------------------
引用 16 楼  的回复:
你既然清楚static的变量是类的,哪就应该知道为什么啊,
你在方法里面定义的变量是局部变量,就是说他有一定的作用范围和生命周期,就只能在方法里面使用而不能将其扩展到别的地方,这个变量在方法结束后就会被回收器回收,就不再存在了,而你要强制将其加上static就是要把它的作用范围扩展到整个类,这就与你开始定义这个变量时违背了,这是语法上的错误。
建议深刻理解这句话
static成员变量属于类……

说的好 --------------------编程问答-------------------- 回归正题吧,为什么男人不可以生孩子呢? ... --------------------编程问答-------------------- 就我觉得吧,那些牛逼哄哄的说####是规定的人,都是二B。。。。。。 --------------------编程问答-------------------- 局部变量都是方法调用完了 资源就释放了  当然不能用static修饰 --------------------编程问答-------------------- 在成员函数前面加static不就达到lz想要的效果了么 --------------------编程问答-------------------- 静态局部变量是C++的东西,在JAVA里类的成员变量,可以实现相同的功能 --------------------编程问答-------------------- 这。。够激烈,让我知道了static的用法!!哈哈 --------------------编程问答-------------------- 9楼正解,你了解一下java代码在内存中的分配情况吧,static是有专门的存放区的,你写在局部里面,编译的时候玩不了啊 --------------------编程问答-------------------- static是特指,既然是特指,那就不能是局部的,比如国家主席,你能够说他是那个省的主席吗 --------------------编程问答--------------------
引用 51 楼 ling376962380 的回复:
回归正题吧,为什么男人不可以生孩子呢? ...

1、男人可以生孩子,不论是用现代技术还是自然选择,只不过几率比较小。
2、正题不是男人是否可以生孩子,而是这个孩子是谁的?
3、这孩子肯定不是你和我的,嗯

PS:LZ是否应该先解释一下为什么一定要在局部声明静态变量?事先在全局声明好了不是可以一样用在局部么...
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,