1.static 关键字:
1)static修饰的变量(类变量)会被该对象所有的实例共享(包括子类)。在某个对象的所有实例的整个生命周期都只实例化一次,换句话说,静态变量是属于类,而不是属于对象(类的实例)。如果该关键字修饰的变量可见性为Public,则他的子类也共享该变量并可以对该变量进行更改,所以一般我都吧static变量设为private,如果要让其成为真正的全局变量可以用public 修饰。上节中如果改成public final double PI=3.14,则所有实例都可以共享该常量,且不能进行修改。即应用程序常量。
代码:
class Ball {
privatestatic int count = 0;
publicstatic int getCount (){
returncount ;
}
publicBall(){
count++;
}
}
class Test {
public static voidmain(String[] args) {
for (int i = 0;i < 10000;i++ ) {
int number=(int)(Math.random()*10);
if (number==7) {
new Ball();
}
System.out.println("created:->"+Ball.getCount());
}
}
}
2)static修饰的方法,执行某个静态方法不需要实例化该类,可以直接使用类名.静态方法名访问该方法。
A.静态方法的限制:由于静态方法在被调用时不需要类的实例,所以调用静态方法时不存在类的实例变量和方法,所以使用静态方法不能引用类的实例变量和方法,静态方法可以访问静态成员和方法,故在静态方法中也不能使用super和this关键字。由于静态方法在类进行实例化时就已经写到固定类存中,所以也不能被子类重写。
3)静态块(静态初始化器):在类加载时自动执行,目的在于初始化和分配整个生命周期类的资源(单例模式,属于类不属于任何一个实例,在类的实例化之前就已经初始化了静态成员(不包括非静态成员),这也是与构造函数不一样的地方)
A. 静态块没有名字:因为没有必要在类的定义外引用。
B. 静态块没有参数:因为静态块是在类加载时自动执行的,不需要参数。
C. 静态块没有返回类型:像构造函数一样,不需要返回值,所以最后写出的静态块样子类似如此 static{…………}
D. 如果不想让类加载时就执行该静态块但又不想让其他实例引用可以变换成一个私有静态方法,如: private static int initBall(){…………}.
E. 注意:JVM默认将静态块的大学限制为64K,因此不要再静态块中放入太多代码;不能从静态块中抛出被检查的异常,即不能使用try-catch块,这也是一个相对来说的缺点,(解决方法三种种,一是选择记录异常,并抛出RuntimeException的异常来终止当前线程;另一种是选择电泳System.exit()方法,然后这在托管环境中却行不通,这种选择通常在java程序中,另一种是设置标志来标识失败,在类的构造函数中裤检查标志的状态);测试静态块中的代码通常比较难。【static 块的应用环境常见的是在java程序中加载数据库驱动】。