Java中static为什么不能修饰局部变量?
问这样问题的人显然是学过c/c++的,因为在c/c++中static是可以修饰局部变量的
如果你对这个问题百思不得其解,怎么都想不明白,你还是不要想了,因为没有什么为什么。
不能就是不能,人为规定的规则罢了。
如果你非要知道个为什么?
我不介意在这误人子弟一下,,,,,,
首先让我们来看一下c语言中static的作用
1. 在函数外模块内表示此变量只能被本模块访问
2. 在函数内表示只能被此函数访问并且为此变量分配的空间不在栈上
3. 在函数前修饰函数做用同1
在来看下在c++中static的作用,c++是c的强化版,static在c++中基本与在c中相同,我们就来看下不同的
1. 在类中修饰成员变量说明此变量是属于类的
2. 在类中修饰成员函数说明调用此函数不需要this指针(即不需要先实例化对象),此函数只能访问属于类的变量
有如下c++代码
class A{
static int a;
void fun(){
++a;
}
};
int A::a=0;
class B{
void fun(){
static int b=0;
++b;
}
};
A中的a是属于类的而B中的b则是属于方法的,B完全可以这样定义来实现同一目的
class C{
int c;
void fun(){
++c;
}
}
在c语言中如果想让一个变量每次在函数执行时拥有上一次函数执行后的值,我们会有以下方法
1. 把此变量定义为全局变量
int a;
void fun(){++a;}
void main()
{
a=1;
fun();
}
2.把此变量定义为函数内static修饰的局部变量
void fun()
{
static int a=0;
++a;
}
void main()
{
fun();
}
3.把每次的值返回下次调用时再传入
int fun(int a)
{
return ++a;
}
void main()
{
int a=0;
a=fun(a);
}
4.通过指针去引用此变量
void fun(int *p)
{
++(*p);
}
void main()
{
int a=0;
fun(&a);
}
方法1,2是我们常用的方法,但是方法1会增加模块与模块间的耦合度
所以我们一般用方法2,因为方法2可以减少模块间的耦合度增加模块内的内聚性
类B用的是方法1,而类C用的是方法2
在B中完全可以把fun()放到类的外边去,不必成为它的成员函数,因为fun()和B有半毛钱的关系?没有,,,,,,
它和c中的一个普通函数没有什么区别
面向对象的语言中类是封装属性和操作属性的方法的一种抽象机制,通过类的封装来实现模块内的高内聚与模块间的低耦合,而B中的方法fun()有操作过B的属性?没有,这不符合面向对象的思想
c++之所以会支持局部变量可以被static修饰可能是为了兼容c语言,这也是人们会说c++不是纯面向对象的原因
在完全面向对象的Java中为什么要去兼容一个面向过程的c????
为什么要把一个java的类定义成
class D{
publicvoid fun()
{
static int d=0;
++d;
}
}?
有什么理由?