有时,我们希望定义一个类成员(变量、方法),使它的使用完全独立于该类的任何对象。
我们知道,一般情况下,类成员的使用必须通过由该类实例化出来的对象访问才行,但是java允许在类中创建这样一类成员:它可以被该类自己使用,而不必引用特定的实例。
怎么创建呢?通过在成员的声明前面加上关键字static即可。
如果一个成员被声明为static,它就能够在类的任何对象创建之前被访问(一旦类被加载,所有的static语句都会被执行,如main(),程序在开始执行时必须调用main(),所以它被声明为static),而不必引用任何对象,可以将方法和变量都声明为static。
1) 声明为static的变量实质上就是全局变量。当声明多个对象时,每个对象共用一个static变量。
2) 声明为static的方法要注意:
(a) 他们仅能调用其他的static方法。
(b) 它只能访问static数据。
(c) 它们不能引用this或super。
另外,如果希望通过计算来初始化static变量,可以声明一个static块,static块仅在该类被加载时执行一次。
代码实例:
class StaticDemo{
static int b;
static int a=3;//static变量
static void meth(int x){//static方法
System.out.println("x="+x);
System.out.println("a="+a);
System.out.println("b="+b);
}
static{//static块
System.out.println("Static block initialized.");
b=a*4;
}
public static void main(String[] args){//主函数
meth(42);//调用StaticDemo类中的meth()方法
}
}
输出结果:
Static block initialized.
x=42
a=3
b=12
分析:
一旦StaticDemo类被加载,所有的static语句都会被执行。首先a被设置为3,接着static块执行(打印一条消息),最后,b被初始化为a*4或12。然后调用main(),main()调用meh()方法,把值42传递给x。3个println()语句引用两个static变量a和b,以及局部变量x。
在定义类的外面,static方法和变量都能独立任何对象被使用。访问static方法和变量只要用类名加点运算符(“classname.”)即可。例如,如果希望从类外面调用一个static方法,可以使用下面格式:
classname.method()
在这里,classname是类的名字,method为该类中定义的static方法。static变量可以通过同样的方式来访问——类名加点运算符。
代码实例:
class Static{
static int a=42;
static int b=99;//静态变量
static void callme(){//静态方法
System.out.println("a="+a);
}
}
class StaticByName{
public static void main(String[] args){
Static.callme();//直接通过“类名.方法”的方式来访问Static类中的静态方法“callme()”
System.out.println("b="+Static.b);//通过“类名.变量”来访问Static类中的静态变量“b”
}
}
输出结果:
a=42
b=99
参考文献:刘文杰 郑玉 刘志昊 《Java 7实用教程》