Static是静态修饰符,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。
1、修饰成员方法
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制)
未声明为static
class ClassA{
int m;
public void method1(){
......
}
}
class ClassB{
void method2{
int i;
ClassA classa = new ClassA();
i = class_a.n; 这里通过对象引用访问成员变量m
classa.method1; 这里通过对象引用访问成员函数method1
}
}
声明为static
class ClassA{
static int m;
static void method1(){
......
}
}
class ClassB{
void ex2{
int i;
i = ClassA.m; 这里通过类名直接访问成员变量m
ClassA.method1; 这里通过类名直接访问成员函数method1
}
}
通过以上两种比较,就可以知道static用来修饰类成员的主要作用了,在java类库当中有很多类成员都声明为static,可以让用户不需要实例化对象就可以引用成员,最基本的有Integer.parseInt(),Float.parseFloat()等等用来把对象转换为所需要的基本数据类型。这样的变量和方法我们又叫做类变量和类方法。
2、修饰成员变量
给变量加上static关键字后,此变量变为全局变量,在编译时由内存分配一块内存空间,直到程序停止运行才会释放,无论哪一个方法修改了此变量,此变量就会改变,那么就是说该类的所有对象都会共享这块内存空间。
并且,当再次new该类的对象时,static修饰的类成员不会被再次初始化,在程序运行过程中,static只会在第一次new时被初始化
class TextStatic{
static int i;
public TextStatic(){
i = 4;
}
public TextStatic(int j){
i = j;
}
public static void main(String args[]){
TextStatic t = new TextStatic(5); //声明对象引用,并实例化
TextStatic tt = new TextStatic(); //声明对象引用,并实例化
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
这段代码里面TextStatic类有一个static的int变量i,有两个构造函数,第一个用于初始化i为4,第二个用于初始化i为传进函数的
值,在main中所传的值是5,程序首先声明对象的引用t,然后调用带参数的构造函数实例化对象,此时对象t的成员变量I的值为
5,接着声明对象tt,调用无参数的构造函数,那么就把对象tt的成员变量i的值初始化为4了,注意了,在这里i是static,那就是说
该类的所有对象都共享该内存,那也就是说在实例化对象tt的时候改变了i的值,那么实际上对象t的i值也变了,因为实际上他们引
用的是同一个成员变量。最后打印的结果是三个4。
3、静态代码块:
当new一个类对象时,static修饰的成员变量首先被初始化,随后是普通成员,最后调用Person类的构造方法完成初始化。也就是说,在创建对象时,static修饰的成员会首先被初始化
并且,当再次new该类的对象时,static修饰的类成员不会被再次初始化,在程序运行过程中,static只会在第一次new时被初始化
4、静态导包:
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
5、代码块:
代码块分为两种种:普通代码块,静态代码块。他们和构造函数的运行顺序如下所示:
静态块总是最先执行的,第二执行的是普通代码块,第三执行的是构造方法。并且构造块和构造方法在每次new的时候都会创建新的,static方法只会在第一次new时运行
https://blog.csdn.net/u010931123/article/details/60772423
https://blog.csdn.net/chaoshenzhaoxichao/article/details/80402768