一.静态的用途
- 修饰类的成员变量,称为静态变量。
- 静态变量是属于类的变量,可以使用” 类名.变量名”访问,在类的内部可以省略类名。
- 静态变量只有一份,可以被全体对象共享!软件中只有一份的数据应该使用static修饰
- 静态变量在类加载期间,随着类在方法区中初始化,只有一份属于类。
- 什么时候使用静态?
如果某个成员变量是被所有对象共享的,就应该被定义为静态变量
二.static关键字的特点
a>随着类的加载而加载
b>优先于对象二存在
c>被类的所有对象所共享
d>可以通过类名.调用,不用被实例化可以直接使用
三.static的注意事项
1.在静态方法中是没有this关键字的
- 静态是随着类的加载而加载,this是随着对象的创建而存在的,静态优先于对象存在
2.静态方法只能访问静态的成员变量和静态的成员方法
- 还是因为静态方法优先于对象而存在,只能访问已经存在的变量和方法
3.静态变量也叫类变量,成员变量也叫对象变量
- A:所属不同:
静态变量属于类
成员变量属于对象- B:内存中位置不同:
静态变量存储于方法区
成员变量存储与堆内存- C:内存出现时间不同:
静态变量随着类的加载而加载,随着类的消失而消失;
成员变量随着对象的创建而存在,随着对象的消失而消失- D:调用不同:
静态变量可以使用类名调用,也可以使用对象调用
成员变量只能通过对象调用
四.静态代码块
1.形式:static {…}
2.特点:
- 静态代码块中的代码在类进内存时,就会执行,并且只执行一次
- 只能访问static修饰的静态变量和静态方法
- 不能写this或者对象,静态代码块在对象初始化之前执行
- 执行顺序:静态代码块–>构造代码块–>构造方法
面试题
//看程序写结果
public class staticDemo1 {
public static void main(String[] args) {
Zi z = new Zi();
}
}
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
分析:1.jvm调用main方法进栈
2.遇到Zi z = new Zi();会现将Fu.class和Zi.class分别加载进内存,
再创建对象时,当Fu.class加载进内存时,父类的静态代码块会随着Fu.class一起加载,
当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
第一个输出 静态代码块Fu, 第二个输出 静态代码块Zi
3.走子类的构造方法.因为java中式分层初始化的,先初始化父类,再初始化子类.
所以先走的是父类构造,但是在执行父类构造时,发现父类有构造代码块,由于构造代码块优先于构造方法执行,
第三个输出 构造代码块Fu,第四个输出 构造方法Fu
4.父类初始化结束,子类初始化
第五个输出 构造代码块Zi,第六个输出 构造方法Zi