Java static关键字和构造函数执行顺序

来源:互联网 发布:兼职网络维护 编辑:程序博客网 时间:2024/06/05 14:07

static修饰的有变量 有方法。
**

static修饰变量

**
**一、静态方法随着类的加载而出现,随着类的消失而消失;
所以静态方法是先于对象出现的,也是先于非静态方法出现,不能用静态方法调用后出现的非静态方法。
二、静态优先于对象,被所有对象共享;
一般静态成员变量都是类中成员共有的属性或者方法;
三、因为静态先存在于内存,无法访问后来对象中的数据,所以静态无法访问非静态,也不能存在this,因为this代表当前对象,静态先于对象存在。**
当static修饰变量时候,表示这个变量储存在方法区中是一个类变量,static修饰的变量是对象的共性。
比如一个person类 中有一个属性叫country 内容都是中国。那么就可以把这个变量修饰成static 这样就不用等创建对象的时候在堆中给每个对象都创建一个country属性的内存,这样节省内存,而且这样的话也不用
new person.country ,可以直接用类名调用。person.country
static 修饰的是一个对象的共性,以后就不用再赋值了,生命周期最长可以直接存储在方法区中。

static修饰方法

什么时候用static修饰方法
当这个方法中没有引用对象中的非静态方法的时候可以用static修饰方法
因为static修饰的方法存在方法区中跟static修饰的变量一样,当对象在堆中创建之前就存在方法区中了 这样如果静态方法调用非静态变量,那时候非静态变量还没有创建(非静态变量是对象创建之后,在堆中创建的)

静态代码块

static{system.out.print("啊啊啊啊啊啊")}

随着类的加载而执行 而且只执行一次 ,如果有两个不同的静态代码块也是只执行一个

因为有了static 所以执行顺序有些变化

比如一个 person p= new person();这个对象创建经历了什么?
1.因为new 用到了person.class 所以会先找到person.class文件,并加载到内存中
2.执行该类中的静态代码块 如果有的话给person.class初始化。
3.在堆内存中分配内存,分配地址空间。
4.在堆内存中建立对象特有属性,并进行默认初始化(就是String赋值null,int类型赋值0)
5.对属性进行显示初始化
6.对对象进行相应的构造代码块初始化
7.对对象进行构造函数初始化
8.把对象的内存地址赋值给栈内存的p变量

原创粉丝点击