一、static的作用
static可以修饰变量、方法、成员属性。作为全局属性。
- 修饰成员变量和成员方法
- 静态代码块
- 修饰类(只能修饰内部类)
- 静态导包(用来导入类中的静态资源,1.5之后的新特性)
被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。
被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。
修饰属性属性、对象时引用可变。
public class StaticTest {
static User user = new User(1,"momoc");
public static void main(String[] args) {
System.out.println("User:" + user);
User user2 = new User(2,"momoc2");
//id name 字段
User t = user;
user = user2;
user2 = t;
user.setId(3);
System.out.println("User:" + user + " id" + user.getId());
System.out.println();
System.out.println("User2:" + user2);}
}
执行结果:
User:User@4554617c
User:User@74a14482 id3
User2:User@4554617c
可知static静态变量修饰对象时可以改变引用,作为一个全局的对象,内容和引用可变。
修饰基本类型时,值(内容)也可以发生改变。
静态代码块:程序运行时进行初始化。
static变量和普通成员变量主要有以下4点区别:
- 区别1:所属不同。static变量属于类,不单属于任何对象;普通成员变量属于某个对象
- 区别2:存储区域不同。static变量位于方法区;普通成员变量位于堆区。
- 区别3:生命周期不同。static变量生命周期与类的生命周期相同;普通成员变量和其所属的对象的生命周期相同。
- 区别4:在对象序列化时(Serializable),static变量会被排除在外(因为static变量是属于类的,不属于对象)
二、final
先说结论。
修饰类–类不可变,不可继承
方法—-不可重写
变量(基本数据类型)—–值不可改变
引用—–引用不可变,引用的值可变。