一、JAVA中用static关键字修饰变量--静态变量:
在一个类中,通常会编写描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。
有时我们希望无论是否产生了对象或产生了多少对象情况下,某些特定的数据在内存空间里只有一份;
只需要在变量前加上static关键字即可,我们称这种变量是静态成员变量;我们可以直接使用类名来访问这个变量,同时也可以再类的非静态成员方法中像访问其他非静态成员变量一样去访问这个静态成员变量。
用static修饰的变量,它们在类被载入时创建,只要类存在,static变量就存在;
需要注意的问题:
1.如果静态变量不是私有的那么可以在类的外部进行访问,此时不需要类的实力对象,只需要类名就可以引用;
2.不能在任何方法体内的变量声明为静态;
eg:设计一个程序统计一共产生了多少个某个类的实例对象?可以用下面的方法统计:
class A{
private static int count = 0;
public A(){
count = count + 1;
}
}
二、static关键字修饰方法--静态方法
我们希望不必创建对象就可以调用某个方法,可以用静态成员方法。可以用类名直接访问静态成员方法,也可以用类的实例对象来访问静态成员方法,还可以在类的非静态成员方法中像访问其他非静态方法一样去访问这个静态方法。
使用类的静态方法时,需要注意以下几点:
(1)在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类的非静态成员。这是因为,对于非静态成员,必须先创建类的实例对象之后才可以使用,而静态方法在使用前不用创建任何对象;
(2)静态方法不能以任何方式引用this和super关键字。道理与上面一样,此时this所引用的对象更本没有产生;
(3)main()方法是静态的,因此在JVM执行main方法时不创建main方法所在类的实例对象,因此,main()方法中不能直接访问该类的非静态成员;
三、静态代码块
当类被载入时,静态代码块被执行,且只执行一次,静态块经常用来进行类属性的初始化。如下面一段程序:
public class ZuiGong {
static {
System.out.println("test ```");
}
public static void main(String[] args) {
System.out.println("begin```");
new StaticCode();
new StaticCode();
new StaticCode();
new StaticCode();
}
}
class StaticCode{
static String country;
static
{
country = "china";
System.out.println("static code```");
}
}
输出结果:
test ```
begin```
static code```
类StaticCode中静态代码块被自动执行,尽管产生了类StaticCode的四个实例对象但静态代码块只被执行一次。
当程序用到了一个类才会去装载那个类。这里给出
类什么时候被加载/类加载时机:
第一:生成该类对象的时候,会加载该类及该类的所有父类;
第二:访问该类的静态成员的时候;
第三:class.forName("类名");
四、单态设计模式
需求:要让类在一个虚拟机中只能产生一个对象,首先必须将类的构造方法的访问权限设置为private,这样就不能用new操作符在类的外部产生类的对象,只能调用该类的某个静态方法以返回内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义为静态的;
单态类程序:
public class TestSingle{
private static final TestSingle onlyone = new TestSingle();
public static TestSingle getTestSingle(){
return only;
}
private TestSingle(){}
}
这样在外面,我们只能通过调用TestSingle()方法获得TestSingle的对象;