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

静态
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变量

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值