静态变量的梳理[整理版]
静态变量的梳理
1静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜.
(5)静态变量分为全局静态变量和局部变量。
2
java中static什么时候使用,知道static是静态变量,但是不怎么清楚,到底
浏览次数:209次悬赏分:5|解决时间:2011-9-3 10:18|提问者:
wkunzhi
知道static是静态变量,但是不怎么清楚,到底是什么时候要使用static 什么时候不使用。
请各位舒服教导一下,越详细越好
问题补充:
我就是分布大清楚什么时候该用 什么时候不该用
最佳
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
有以下几条限制:
?它们仅能调用其他的static 方法。 ?它们只能访问static数据。
?它们不能以任何方式引用this 或super
0
回答时间:2011-8-24 10:55|我来评论
向TA求助
回答者:tongwen1990310 |一级
擅长领域:电脑装机硬件程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
参加的活动:暂时没有参加的活动
相关内容
2007-11-4java中静态函数中为什么不能定义static变量?7
2011-4-20java中抽象类 为什么不能定义为static型 在静态方法中为什么不能直接访...2
2009-5-8Java静态变量static 的问题。2 2010-9-26在java中main函数前有static修饰,为什么还能使用非静态的构造函数1
2011-4-20小弟想问一下,Java中静态方法的适用场景是什么呢,也就是说在哪些场景...
更多关于Java的静态变量在什么情况下使用的问题>>
等待您来回答
0回答20Microsoft Visual C++6.0下载地址. 0回答visual studio 2010安装缺少组件怎么办. 1回答一个做好的javascript脚本(日历程序)怎么样运用在java Swing界面的....
0回答急急急~y = 3E-111e^0.1319xreturn countTable[v]急急急~y = 3E-111....
0回答只有configuration tools可以实现数据库建立不,完整的sql server2005....
0回答10求个Visual Basic 6.0工程版 不要说没有 是有的 发我邮箱530993901@qq....
0回答visual studio 2005之前安装过,但不小心把某些相关的文件删了,想重....
0回答跪求java swing视频插件,及具体方法,万分感谢~~~~~.
更多等待您来回答的问题>>
其他回答共9条
所有对象公共的变量考虑用,如全局变量;不需要创建对象的时候考虑用,如某些常量。
回答者: 热心网友 |2011-8-24 10:48
static 除非必要的时候 不建议使用, 因为static是程序刚启动的时候 就加加载static进内存。这样就算你的业务代码没使用这个static对象,这个static对象也已经在内存里了。而且知道你程序退出,虚拟机才会销毁他,这意味着static是必须占用系统资源。
什么时候用的话,这个根据上面那段话就很容易理解了。因为他是再
程序刚启动的时候就加载进内存里了,那么就是说不管你程序执行到哪,或有没有实例化这个static对象所在类,你都可以调用到这个对象。
代码写法:所在类名.static对象(或方法) 例如:
class a{
public static String userName="admin";
public a(){
System.out.println("实例化a类");
}
}
要在b类里使用这个 static 修饰的 userName 对象
class b{
public b(){
System.out.println("实例化b类");
b.userName = "admin123";
System.out.println(b.userName);
}
}
这样 调用和修改,执行b类后 打印结果 不会打印a类构造器的那句话。你想一下就应该能明白什么时候该应了。 提醒一下 static 一般定义一些公共的变量 或者 公共方法。
回答者:128兆 | 四级|2011-8-24 11:10
一定要看:static 是静态 你不要理解为静态变量因为他不仅仅可
以修饰变量还可以修饰 方法 例如:private static void test(){}
分不清的话我告诉你 那东西并不常用。举例:比如 现在有个persion类 类里面有name属性 和 country=“cn”属性 里面有个show方法 这时候你要用这个类 那你自然要new 他 Persion p1 = new
Persoion(); Persion p2 = new Pesion()你想让show 方法打印出p1 p2的 名字和国家 这时候就new出来了这两个对象 但是呢你会发现 country=“cn”是不变的 但是你new 了两个对象这样就第二个对象 new出来的这个country变量就占用了一点的空间 这时候你为了节省这一点的空间你就 把这个 country 静态就可以了 静态变量属于类 ,他随着类的加载就加载了 他只会加载一次(这里是重点他只加载一次) 因为这里只加载了一次 ,就比你上面加载了两次 节省了 那一丁点的空间。。他就这用处 。。。。。 但是现在的内存已经很大了根本没人注意到这点 你这个问题了。。所以 人们渐渐的不了解他了。。不过这东西确实很少用
回答者:ddixc | 五级|2011-8-24 11:29
懒人模式 不想NEW了 就写STATIC
回答者:调和若 | 五级|2011-8-24 11:55
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如
果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
?
它们仅能调用其他的static 方法。 ?
它们只能访问static数据。
?
它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a); System.out.println("b = " + b);
}
static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) { meth(42);
}
}
一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。
注意:在一个static 方法中引用任何实例变量都是非法的。
下面是该程序的输出:
Static block initialized.
x = 42
a = 3
b = 12
在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:
classname.method( )
这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。
类名加点号运算符。一个static变量可以以同样的格式来访问——
这就是Java 如何实现全局功能和全局变量的一个控制版本。
下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。
class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a = " + a); }
}
class StaticByName {
public static void main(String args[]) { StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
}
}
下面是该程序的输出:
a = 42
b = 99
回答者:vnnvgyflhz | 二级|2011-8-24 21:38
static可以说是一种节省内存的一种方法或者是技巧,它不会影响程序的运行但是实际上它已经在默默的占用了一步的内存,只是我们看不到 注意不到 影响不大。
static 是静态 你不要理解为静态变量因为他不仅仅可以修饰变量还可以修饰 方法 例如:private static void test(){} 分不清的话我告诉你 那东西并不常用。举例:比如 现在有个persion类 类里面有name属性 和 country=“cn”属性 里面有个show方法 这时候你要用这个类 那你自然要new 他 Persion p1 = new Persoion();
Persion p2 = new Pesion()你想让show 方法打印出p1 p2的 名字和国家 这时候就new出来了这两个对象 但是呢你会发现
country=“cn”是不变的 但是你new 了两个对象这样就第二个对象 new出来的这个country变量就占用了一点的空间 这时候你为了节省这一点的空间你就 把这个 country 静态就可以了 静态变量属于类 ,他随着类的加载就加载了 他只会加载一次(这里是重点他只加载一次) 因为这里只加载了一次 ,就比你上面加载了两次 节省了 那有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量
实例方法和类方法
类方法时属于类的.类变量也属于类
方法声明中用关键字static修饰的成为类方法或者静态方法.不用static修饰的为实例方法.实例方法可以调用实例方法或者类方法.类方法只能调用该类的类方法,不能调用实例方法.
实例方法可以操作成员变量,无论是实例变量还是类变量;类方法只能操作类变量.不能操作实例变量.
类方法的几条限制:
1)它们仅能调用其他的static 方法
2)它们只能访问static数据。
3)它们不能以任何方式引用this 或super
实例方法必须通过对象调用的原因: 当类的字节码文件被加载到内存时,类的实例不会被分配入口地址,只有当该类创建对象后,类中的实例方法才分配入口地址.当使用new和构造方法创建对象时,首
同时实例方法分配入口地址.然后执行构先分配成员变量给该对象,
造方法中的语句.完成必要的初始化.当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址时被所有对象共享.
类方法可以通过类名直接调用原因: 对于类中的类方法,再该类被加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类名调用方法(也可以通过对象调用).类方法中出现的成员变量必须时被所有共享的变量(类变量).
类方法不能操作实例变量的原因: 再类创建对象以前,实例方法也没有入口地址.无论类方法或者实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存.
例如:
public class ClassModle {
static double x=56.84,y=34.10;//类变量
static double max(double a,double b){ //类方法
return a>b?a:b;
}
public double min(){ //实例方法
return x+y; //方法操作类变量
}
public static void main(String args[]){
double max=ClassModle.max(12, 34); //通过类名调用类方法
System.out.println(max);
System.out.println(ClassModle.x=23); //直接通过类名调用类变量
System.out.println(ClassModle.y=52);
ClassModle mode=new ClassModle();
System.out.println(mode.max(12, 78)); //通过对象调用类方法
System.out.println(mode.min()); //通过对象调用实例方法
}
}
结果为:
34.0
23.0
52.0
78.0