静态、三大代码块以及对象的创建过程
2015-01-20 21:03
183 查看
静态
static关键字
使用场景:如果对象调用的方法或者字段,不涉及该对象封装的任何数据,可以将方法或者字段用static 关键字修饰成静态成员;
因为对象就是用来封装数据的,对象调用的方法不用到封装的数据,对象的创建便没有意义;
静态方法使用原则:
一、静态方法不能访问非静态成员或者方法
非静态方法可以访问静态成员或静态方法
二、静态方法中不允许出现this,super关键字
为什么不行,原理揭秘:
一、静态方法随着类的加载而出现,随着类的消失而消失;
所以静态方法是先于对象出现的,也是先于非静态方法出现,不能用静态方法调用后出现的非静态方法。
二、静态优先于对象,被所有对象共享;
一般静态成员变量都是类中成员共有的属性或者方法;
三、因为静态先存在于内存,无法访问后来对象中的数据,所以静态无法访问非静态,也不能存在this,因为this代表当前对象,静态先于对象存在。
static修饰的方法是因为方法没有调用对象封装的数据,创建对象调用浪费内存。
static修饰变量是因为变量是该类所有对象共享的属性,例如求圆面积时,π可以定义为静态变量,因为π是圆的共有属性
静态变量和成员变量的异同:
一、所属范围不同
静态变量所属与类,也称为类变量
成员变量所属于对象,也称为实例变量
二、加载时间不同
静态变量随类的加载而加载
成员变量随对象的创建而加载
三、调用不同
静态变量可以由类和对象调用
成员变量只能被随对象
四、内存存储区域不同
静态变量被保存在方法区,随类的加载而加载
成员变量分配在堆内存,随对象的创建而加载
静态方法加载内存图解:
类和静态修饰符修饰的方法或者成员变量先加载到方法区当中,当创建对象时,会在堆内存中分配该对象的空间,main方法会先在方法区找,在静态代码块找到main方法后,在堆内存中开辟空间并且加载main方法。
静态代码在对象之前!
三大代码块
静态代码块
存放在类中,随着类的加载而执行,格式为:
构造代码块
存放构造方法的共性内容,对象创建时执行!
局部代码块
定义在方法中,主要是设置变量的作用域;
对象的创建过程
一、main方法所在类在方法区加载
二、main方法加载到静态代码区,在栈内存中加载main方法
三、main方法中创建的Person类中静态变量先默认初始化,再显示初始化
四、Person类中的静态代码块加载到方法区中的静态代码区
五、执行new Person()语句,Person类加载到方法区
六、在堆内存中分配内存并附初始地址值,成员变量隐式初始化
七、在栈内存中加载Person(){}构造方法,构造方法中有隐式super();
Person(){
1、super();
2、成员变量显示初始化;
3、构造代码块初始化;
}
八,对象初始化完毕后,将地址赋给person变量
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变量
相关文章推荐
- 类的加载、创建对象、静态变量static、构造函数、静态代码块、构造代码块、构造方法以及总结
- java加载类创建对象的过程以及静态代码段的执行时机
- 制作程序文档_主函数_静态代码块_对象的初始化过程_对象调用成员过程
- 面对对象2【static】【主函数】【静态应用】【Java帮助文档】【静态代码块】【对象初始化过程】
- 跨浏览器 创建xmlhttprequest 对象 以及和服务器交互的全过程
- java中类/对象的初始化顺序以及静态代码块的使用
- java--面向对象(static关键字、main、静态什么时候使用、静态代码块、对象的初始化过程)
- 执行顺序:(优先级从高到低)静态代码块>mian方法>构造代码块>构造方法。 其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
- day06static关键字,main函数,帮助文档的制作,静态代码块,对象的初始化过程,单例设计模式
- Java重修之路(七)面向对象之静态,主函数,Doc文档,静态代码块,对象初始化过程,单例设计模式
- java中类/对象的初始化顺序以及静态代码块的使用
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- C++转Java自学之路(四)文档注释、静态代码块与对象初始化过程
- java中类/对象的初始化顺序以及静态代码块的使用
- 从Java类到对象的创建过程都做了些啥以及内存中的对象是啥样的
- 给静态代码块里的类创建对象
- Java中初始化对象的顺序,静态代码块的用法以及Static的用法详解
- 代码块的解释,构造代码块,静态代码块,静态常量和常量以及静态成员变量和对象成员变量的区别
- java中类/对象的初始化顺序以及静态代码块的使用
- 会话对象session的创建,保存以及与客户端之间会话原理,过程