静态
static关键字
使用场景:如果对象调用的方法或者字段,
不涉及该对象封装的任何数据,可以将方法或者字段用static 关键字修饰成静态成员;
因为对象就是用来封装数据的,对象调用的方法不用到封装的数据,对象的创建便没有意义;
静态方法使用原则:
一、静态方法不能访问非静态成员或者方法
非静态方法可以访问静态成员或静态方法
二、静态方法中不允许出现this,super关键字
一、静态方法随着类的加载而出现,随着类的消失而消失;
所以静态方法是先于对象出现的,也是先于非静态方法出现,不能用静态方法调用后出现的非静态方法。
二、静态优先于对象,被所有对象共享;
一般静态成员变量都是类中成员共有的属性或者方法;
三、因为静态先存在于内存,无法访问后来对象中的数据,所以静态无法访问非静态,也不能存在this,因为this代表当前对象,静态先于对象存在。
static修饰的方法是因为
方法没有调用对象封装的数据,创建对象调用浪费内存
。
static修饰变量是因为变
量是该类所有对象共享的属性
,例如求圆面积时,π可以定义为静态变量,因为π是圆的共有属性
一、所属范围不同
静态变量所属与类,也称为类变量
成员变量所属于对象,也称为实例变量
二、加载时间不同
静态变量随类的加载而加载
成员变量随对象的创建而加载
三、调用不同
静态变量可以由类和对象调用
成员变量只能被随对象
四、内存存储区域不同
静态变量被保存在方法区,随类的加载而加载
成员变量分配在堆内存,随对象的创建而加载
静态方法加载内存图解:
类和静态修饰符修饰的方法或者成员变量先加载到方法区当中,当创建对象时,会在堆内存中分配该对象的空间,main方法会先在方法区找,在静态代码块找到main方法后,在堆内存中开辟空间并且加载main方法。
静态代码在对象之前!
三大代码块
静态代码块
存放在类中,随着类的加载而执行,格式为:
1
2
3
4
5
|
static
int
i=
5
;
static
{
//静态代码块执行在静态变量显示初始化之后
System.out.println(
"static代码块"
+i);
}
|
存放构造方法的共性内容,对象创建时执行!
1
2
3
|
{
//构造代码块存放构造方法的共性代码
System.out.println(
"构造代码块"
);
}
|
定义在方法中,主要是设置变量的作用域;
1
2
3
4
|
{
//存放在方法中,只要是控制内存,设置变量作用域
int
x=
5
;
System.out.println(
"x="
+x);
}
|
对象的创建过程
一、main方法所在类在方法区加载
二、main方法加载到静态代码区,在栈内存中加载main方法
三、main方法中创建的Person类中静态变量先默认初始化,再显示初始化
四、Person类中的静态代码块加载到方法区中的静态代码区
五、执行new Person()语句,Person类加载到方法区
六、在堆内存中分配内存并附初始地址值,成员变量隐式初始化
七、在栈内存中加载Person(){}构造方法,构造方法中有隐式super();
Person(){
1、super();
2、成员变量显示初始化;
3、构造代码块初始化;
}
八,对象初始化完毕后,将地址赋给person变量