?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以Ş成静态static代码块,但是Java语言中没有全局变量的概c?/strong>
被static修饰的成员变量和成员Ҏ独立于该cȝM对象。也是_它不依赖cȝ定的实例Q被cȝ所有实例共享?/p>
只要q个c被加蝲QJava虚拟?/a>pҎcd在运行时数据区的Ҏ区内定找C们。因此,static对象可以在它的Q何对象创Z前访问,无需引用M对象?/p> 用public修饰的static成员变量和成员方法本质是全局变量和全局ҎQ当声明它类的对象市Q不生成static变量的副本,而是cȝ所有实例共享同一个static变量?/p> static变量前可以有private修饰Q表C个变量可以在cȝ静态代码块中,或者类的其他静态成员方法中使用Q当然也可以在非静态成员方法中使用--废话Q,但是不能在其他类中通过cd来直接引用,q一点很重要。实际上你需要搞明白Qprivate是访问权限限定,static表示不要实例化就可以使用Q这样就Ҏ理解多了。static前面加上其它讉K权限关键字的效果也以此类推?/p> static修饰的成员变量和成员Ҏ习惯上称为静态变量和静态方法,可以直接通过cd来访问,讉K语法为: 用static修饰的代码块表示静态代码块Q当Java虚拟机(JVMQ加载类Ӟ׃执行该代码块?/strong> 1、static变量 两者的区别是: 所以一般在需要实C下两个功能时使用静态变量: 例如Z方便Ҏ的调用,Java API中的MathcM所有的Ҏ都是静态的Q而一般类内部的staticҎ也是方便其它cd该方法的调用?/p> 静态方法是cd部的一cȝD方法,只有在需要时才将对应的方法声明成静态的Q一个类内部的方法一般都是非静态的 3、static代码?/strong> static代码块也叫静态代码块Q是在类中独立于cL员的static语句块,可以有多个,位置可以随便放,它不在Q何的Ҏ体内QJVM加蝲cL会执行这些静态的代码块,如果static代码块有多个QJVM按照它们在cM出现的先后顺序依ơ执行它们,每个代码块只会被执行一ơ。例如: public class Test5 { static{ q行l果Q?br style="margin: 0px; padding: 0px;"/>3 利用静态代码块可以对一些static变量q行赋|最后再看一D些例子,都一个static的mainҎQ这样JVM在运行mainҎ的时候可以直接调用而不用创建实例?/p> 4、static和final一块用表示什?/strong> 有时你希望定义一个类成员Q它的使用完全独立于该cȝM对象。通常情况下,cL员必通过它的cȝ对象讉KQ但是可以创样一个成员,它能够被它自׃用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)p创徏q样的成员。如果一个成员被声明为staticQ它p够在它的cȝM对象创徏之前被访问,而不必引用Q何对象。你可以方法和变量都声明ؓstatic。static 成员的最常见的例子是main( ) 。因为在E序开始执行时必须调用main() Q所以它被声明ؓstatic?/p> 声明为static的变量实质上是全局变量。当声明一个对象时Qƈ不生static变量的拷贝,而是该类所有的实例变量q同一个static变量。声明ؓstatic的方法有以下几条限制Q?br style="margin: 0px; padding: 0px;"/>?br style="margin: 0px; padding: 0px;"/>它们仅能调用其他的static Ҏ?br style="margin: 0px; padding: 0px;"/>?br style="margin: 0px; padding: 0px;"/>它们只能讉Kstatic数据?br style="margin: 0px; padding: 0px;"/>?br style="margin: 0px; padding: 0px;"/>它们不能以Q何方式引用this 或superQ关键字super 与承有养I在下一章中描述Q?br style="margin: 0px; padding: 0px;"/>如果你需要通过计算来初始化你的static变量Q你可以声明一个static块,Static 块仅在该c被加蝲时执行一ơ。下面的例子昄的类有一个staticҎQ一些static变量Q以及一个static 初始化块Q?br style="margin: 0px; padding: 0px;"/>// Demonstrate static variablesQmethodsQand blocks. class UseStatic { static void meth(int x) { static { public static void main(String args[]) { 一旦UseStatic c被装蝲Q所有的static语句被运行。首先,a被设|ؓ3Q接着static 块执?打印一条消?Q最后,b被初始化为a*4 ?2。然后调用main()Qmain() 调用meth() Q把?2传递给x?个println ( ) 语句引用两个static变量a和bQ以及局部变量x ?/p> 注意Q在一个static Ҏ中引用Q何实例变量都是非法的?/p> 下面是该E序的输出: Static block initialized. classname.method( ) q里Qclassname 是类的名字,在该cM定义staticҎ。可以看刎ͼq种格式与通过对象引用变量调用非staticҎ的格式类伹{一个static变量可以以同L格式来访问——类名加点号q算W。这是Java 如何实现全局功能和全局变量的一个控制版本?/p> 下面是一个例子。在main() 中,staticҎcallme() 和static 变量b在它们的cM外被讉K?/p> class StaticDemo { System.out.println("a = " + a); class StaticByName { public static void main(String args[]) { 下面是该E序的输出: a = 42 static成员是不能被其所在class创徏的实例访问的?/p> 如果不加static修饰的成员是对象成员Q也是归每个对象所有的?/p> 加static修饰的成员是cL员,是可以׃个类直接调用Qؓ所有对象共有的
cd.静态方法名(参数列表...)
cd.静态变量名
按照是否静态的对类成员变量q行分类可分两种Q一U是被static修饰的变量,叫静态变量或cd量;另一U是没有被static修饰的变量,叫实例变量?/p>
对于静态变量在内存中只有一个拷贝(节省内存Q,JVM只ؓ静态分配一ơ内存,在加载类的过E中完成静态变量的内存分配Q可用类名直接访问(方便Q,当然也可以通过对象来访问(但是q是不推荐的Q?br style="margin: 0px; padding: 0px;"/> 对于实例变量Q没创徏一个实例,׃为实例变量分配一ơ内存,实例变量可以在内存中有多个拷贝,互不影响Q灵z)?/p>
?nbsp; 在对象之间共享值时
?nbsp; 方便讉K变量?/p>
2、静态方?/strong>
静态方法可以直接通过cd调用QQ何的实例也都可以调用Q?br style="margin: 0px; padding: 0px;"/>因此静态方法中不能用this和super关键字,不能直接讉K所属类的实例变量和实例Ҏ(是不带static的成员变量和成员成员Ҏ)Q只能访问所属类的静态成员变量和成员Ҏ?br style="margin: 0px; padding: 0px;"/>因ؓ实例成员与特定的对象兌Q这个需要去理解Q想明白其中的道理,不是记忆Q!Q?br style="margin: 0px; padding: 0px;"/>因ؓstaticҎ独立于Q何实例,因此staticҎ必须被实玎ͼ而不能是抽象的abstract?/p>
private static int a;
private int b;
Test5.a=3;
System.out.println(a);
Test5 t=new Test5();
t.f();
t.b=1000;
System.out.println(t.b);
}
static{
Test5.a=4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自动生成Ҏ存根
}
static{
Test5.a=5;
System.out.println(a);
}
public void f(){
System.out.println("hhahhahah");
}
}
hhahhahah
1000
4
5
static final用来修饰成员变量和成员方法,可简单理解ؓ“全局帔R”!
对于变量Q表CZ旦给值就不可修改Qƈ且通过cd可以讉K?br style="margin: 0px; padding: 0px;"/>对于ҎQ表CZ可覆盖,q且可以通过cd直接讉K?/p>
static int a = 3;
static int b;
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
System.out.println("Static block initialized.");
b = a * 4;
}
meth(42);
}
}
x = 42
a = 3
b = 12
在定义它们的cȝ外面Qstatic Ҏ和变量能独立于Q何对象而被使用。这P你只要在cȝ名字后面加点可符卛_。例如,如果你希望从cd面调用一个staticҎQ你可以使用下面通用的格式:
static int a = 42;
static int b = 99;
static void callme() {
}
}
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
}
}
b = 99