JAVA中的static关键字:静态变量,静态方法,静态代码块和单例模式
目录
JAVA中的static关键字:静态变量,静态方法,静态代码块和单例模式
1、静态变量
有时候,我们希望某些特定数据在内存中只有一份,而且能够被一类的所有实例对象所共享。这种成员数据就称为类的静态变量(关键词static只可以修饰成员变量,不可以修饰局部变量)。例如一个班级的所有学生共享一个班级名称。此时,完全不必在每个学生对象所占用的内存空间中都定义一个表示班级名称。而可以在对象以外的空间定义一个表示班级名称的变量让所有对象来共享,并不仅可以通过实例对象访问静态变量,也可以使用“类名.变量名”的形式来访问。内存分配情况如下:
2、静态方法
有时我们希望在不创建对象的情况下就可以调用某个方法,换句话说也就是使改方法不必和对象绑定在一起。要实现这样的效果,只需在类中定义的方法前加上static关键字即可。这种方法就是静态方法。和静态变量一样,静态方法也可以通过“类名.方法名”的方式访问,也可以通过类的实例对象来访问。
3、静态代码块
Java中,使用一对大括号包围起来的若干行代码,即为代码块。Static 修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
注意:静态代码块与构造函数不同。静态代码块只有当类被加载时才会执行,所以只会加载一次。而构造函数在每次创建函数时,都会执行一次。另外,也可以看出(完成代码在下面),静态代码块是在构造函数之前执行的。
4、单例模式
单例模式是java的一种设计模式,它是指在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。就好比我们的世界只有一个中国,假设设计一个类表示中国,该类只有一个实例对象否则就违背了事实。
如上实现了单例模式,特点如下:
- 类的构造方法使用了private修饰,这样就不能在类的外部使用new创建实例对象了。
- 在类的内部创建一个该类的实例对象,并使用静态变量singleClass引用该对象,由于变量应该禁止外界直接访问,因此使用private修饰。
- 为了让类的外部可以获得类的实例对象,需要定义静态方法,获得静态变量。因为静态方法,可以通过“类名.方法名”的方式访问
测试代码如下:
返回结果:
5、完整代码
package exam1008;
/**
* static 关键字设计的java知识,静态变量,静态方法,静态代码块和单例模式
* 静态变量和静态方法:既可以通过“类.变量(方法名)”的方式访问。
* 静态代码块:只会在类加载时执行,因此只会执行一次,先于构造函数。
* 单例模式:通过一定方法,实现仅有一个实例对象的设计模式,
* @author Zhaidf
*
*/
class Student{
static String className;
private int age;
private String name;
public Student() {
System.out.println("构造函数:student class is loading");
}
static {
System.out.println("静态代码块:static code block just load one time" );
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class FunctionStatic{
public static void sayHello() {
System.out.println("hello!");
}
}
class Single{
private static String name;
private static Single singleClass = new Single();
private Single() {
name = "中国人民共和国";
} //私有构造函数,无法在类的外部通过new关键字创建对象
public static Single getSingleClass() { //返回该对象的静态方法
return singleClass;
}
public static String getName() {
return name;
}
}
public class LearnStaticWord {
static {
System.out.println("静态代码块:Test class is loading");
}
public static void main(String[] args) {
Student stu1 = new Student();
stu1.setAge(17);
stu1.setName("stu1");
Student stu2 = new Student();
stu2.setAge(18);
stu2.setName("stu2");
Student.className = "computer class two";
System.out.println("静态变量");
//可以通过对象访问对象,也可以通过类访问对象
System.out.println(stu1.getAge()+"岁的"+stu1.getName()+"的班级是"+stu1.className);
System.out.println(stu2.getAge()+"岁的"+stu2.getName()+"的班级是"+Student.className);
System.out.println("静态方法");
FunctionStatic.sayHello();
System.out.println("单例模式");
Single s1 = Single.getSingleClass();
Single s2 = Single.getSingleClass();
System.out.println("s1是否等于s2:"+(s1==s2));
System.out.println("中国:"+s1.getName());
}
}