static修饰成员变量
成员变量分类
类的成员变量按照有无static修饰分为两种:类变量和实例变量(对象的变量)
- 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享
- 实例变量:无static修饰,属于每个对象,每个实例化对象互不影响
/*
作者:絮纸为花
*/
public class Student{
//类变量,所有实例化对象都用这一个
static String name;
//实例变量,每个实例化对象都有自己的,互不影响
int age;
}
- 类名.类变量(使用这种调用方式,可以明显知道这个变量是类变量,因为实例变量只能用:对象.实例变量,来访问。实例方法同样。)
- 对象.类变量(易混淆)
成员变量的执行原理
栈,堆,方法区,我们将内存看为这三份。
在执行main函数时,写好的类会被放在方法区执行,包含main函数这个类也会放在方法区执行,我们写好的这个类中的变量也一同在方法区,
如果有类变量则这个类变量会被放在堆区。
接下来执行main函数主体,我们创建的实例化对象会被放在栈区执行。
修改类变量
如果我们通过实例化对象来改变类变量,顺序是,
栈(实例化对象)->堆(有,但是实例化不能找到)->方法区(实例化对象报告在方法区的上级,上级有类变量在堆区的地址,找到,并修改)
如果通过类名来修改,则直接从方法区开始。
修改实例变量
栈(实例化对象)->堆(有,直接修改)
应用场景
某个数据只要一份,可共享,访问,修改,使用类变量
每个实例化对象都要有,使用实例变量。
static修饰成员方法
同样的,跟static修饰成员变量几乎一样。
不一样的就是类方法并不会放在堆区,而是和类一起放在方法区,方法区嘛,顾名思义,存放方法的内存分区。
故而通过实例对象来访问类方法的时候只用到方法区就可以找到。
细心一点就可以发现main方法也是类方法,运行时
java 类名——》类名.main来运行
main方法也是可以接受参数的,在cmd,编译后,运行时,java 类名 参数 ,此时这个参数就会传给main,你可以遍历那个String数组来访问你传的参数。
类方法应用场景:作为工具类(提前写好的方法,如某些算法,数据结构)
工具类:提高复用性,节约内存。
如果你写了一个工具类,你要把你的工具类构造器私有化,避免误操作创建对象。
static注意事项
- 类方法可以直接访问类成员,不可以直接访问实例成员
- 实例方法中既可以直接访问类成员,也可以直接访问实例成员
- 实例方法中可以使用this关键字,类方法中不可以使用this关键字
主要思想:类是模版,实例是产品,先有模版后有产品
产品使用模版和自己,而模版不能使用产品,模版只能使用模版自己。
代码块
代码块是类的五大成分之一(成员变量,构造器,方法,代码块,内部类)
代码块分为两种:
静态代码块:
- 格式:static{ }
- 特点:类加载时自动执行,由于类只加载一次,故而静态代码块也执行一次
- 作用:完成类的初始化,官方工具类初始化多用
实例代码块:
- 格式:static{ }
- 特点:每次创建对象时,执行实例代码块,并且在构造器前执行
- 作用:和构造器作用一样,完成类的初始化,