您的位置:首页 > 编程语言

静态、三大代码块以及对象的创建过程

2015-01-20 21:03 183 查看
静态
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变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐