1. 静态变量和静态代码块是在JVM加载类的时候执行的(静态变量被赋值,以后再new时不会重新赋值),执行且只执行一次
2. 独立于该类的任何对象,不依赖于特定的实例,被类的所有实例(对象)所共享
3. 可以通过类名调用 比如:Student.age;
4. 静态是随类的加载而加载,this是随对象的创建而存在(静态比对象优先)
因此,静态方法中没有this关键字,即静态方法中不能使用非静态变量
举例:class Student{ public int num = 0; public static void method(){System.out.println(num)} //NG无法从静态上下文中引用非静态变量num }
5. 静态方法只能访问静态的成员变量和静态的成员方法 6. 静态发法和普通方法一样,当使用时被调用,不同的是一开始系统为其分配内存空间。
举例1:
public class Student{ public static void main(String[] args) { method2(); //调用静态方法 new Student().method1(); //调用非静态方法 } public void method1{System.out.println("XXX")} public static void method2{System.out.println("XXX")} } 举例2: class Student{ private Student(){} //把构造方法私有化,外界就不能创建对象了 public static void method1{System.out.println("XXX")} public static void method2{System.out.println("XXX")} } 使用:Student.method1(); Student st = new Student();ss.method1(); //NG 用途:工具类,都是静态方法,直接通过类名调用方法
7. 父类静态代码块 >> 子类静态代码块 >> 父类构造方法 >> 子类构造方法
class Code{
// 静态代码块 >> 构造代码块 >> 构造方法
// 静态代码块随着类的加载而加载因此优先执行
// 静态代码块,最优先执行,一般对类进行初始化,只执行一次(第一次)
① static {
System.out.println("XXX")
}
// 构造代码块,每次构造函数执行之前执行
// 可以把多个构造方法中共同代码放在一起,对对象初始化
{
System.out.println("XXX");
}
public Code(){}
{
System.out.println("xxx");
}
// ①比main方法先执行
public static void main(String[]){
{
int XXX= 1;
// 局部代码块,限定变量生命周期,及早释放,提高内存利用率
System.out.println("XXX");
}
}
}
8. 举例数据库缓存
public class CacheDemo {
即使new了一个新对象,map里数据还是保存的。
栈是用完就没了,堆是赋值为null/结束是才会被jvm回收。
static Map<String, User> cacheMap = new HashMap<String, User>();
public User getUser(String id){
String key = User.class.getName() + id;
User user = cacheMap.get(key));
if(user != null){
return user;
}
user = QueryDB();
cacheMap.put(key, user);
return user;
}
public User updateUser(User user){
updateDB(user);
String key = User.class.getName() + user.id;
cacheMap.remove(key);
}
}
9.静态代码块static{},静态方法static void method{}
一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;
需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的.
静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口。
两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的.