Static
变量被 static 修饰
- static 修饰的变量在类中只有一份,可以称为类变量,其他变量称为实例变量
- 在方法区加载类的时候,会检查类中是否存在静态变量,如果存在则会在堆内存区域开辟一块空间用于存储静态变量。方法区中的静态变量存放堆内存中的地址
- 每个类的对象都会存放类在方法区的地址。
- 可以通过类名或者对象访问类变量。访问原理是通过对象中存放的类地址找到类变量
统计对象创建个数
public class User {
public static int userNumber;
public User(){
++userNumber;
}
}
方法被 static 修饰
- static 修饰的方法称为类方法,在内存中只有一份。其他方法称为实例方法
- 类方法可以通过类名访问(推荐),对象访问也行(但不推荐)
- 类方法常用于在工具类中实现。在项目中多次调用,但只有一份内存占用。
- 工具类构造函数私有化可以防止对象创建
static void printLog(){
System.out.println("This is Student Class");
}
使用的注意事项
- static 方法只能访问 static 成员,不能访问实例成员。
- static 变量只有一份,通过类找到。实例成员可能有多份,由对象存放。类方法无法确定当前的成员变量是哪个对象的,所以无法访问
- 实例方法既可以访问实例变量,也可以访问类变量
- 实例方法可以获取 this 指针,但类方法不能获取 this 指针
代码块
- 静态代码块:
static {}
- 类加载的时候自动执行。由于类只会加载一次,所以静态代码也只会执行一次
- 作用:可以完成类的初始化。例如对类变量的初始化
- 实例代码块:
{}
- 创建对象时执行实例代码块,且在构造函数前执行
- 作用:完成对象的初始化。例如,用于对实例变量赋值(所有实例都是这个值)
static String school;
static {
school = "SDU";
System.out.println("static block code run");
}
{
System.out.println("Student Object Creat!" + this);
}
单例设计模式
- 一个类只有一个对象,获取类的对象时,对象已经提前创建好了
- 构造函数私有
- 一个 private 的 static 变量保存一个类的对象
- 一个 public 的 static 方法返回保存的类对象
public class SingleInstance {
int a;
private static SingleInstance oneObject = new SingleInstance();
private SingleInstance(){
a = 100;
}
public static SingleInstance getObject(){
return oneObject;
}
}
// 使用:
SingleInstance obj1 = SingleInstance.getObject();
System.out.println(obj1.a);
如何在拿对象的时候(使用这个类的对象时候)才创建对象,且对象唯一?
(懒汉单例设计模式)
仅创建一个空指针,而不赋值。当有人获取对象时,判断类变量是否为null再决定是否创建
public class LazySingleInstance {
private static LazySingleInstance oneObject;
public static LazySingleInstance getObject(){
return oneObject = oneObject == null ? new LazySingleInstance() : oneObject;
}
}