10、创建java对象各部分的执行顺序
来源:互联网 发布:cf手游官网体验数据 编辑:程序博客网 时间:2024/04/27 16:17
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
创建java对象各部分的执行顺序
1 检测这个类是否存在
2 加载这个类进入内存
2.1 加载静态变量定义,不含初始化化
2.2 加载静态方法;
2.3 执行静态代码块,有先后顺序;
2.4 加载实例变量定义,不含初始化;
2.5 加载实例方法
2.6 加载实例代码块;
2,6加载构造方法
3 创建对象
3.1 由jvm分配内存空间,按照类的实例变量区域结构
3.2 执行实例代码块 ,有先后顺序
3.3执行构造方法
1. 对象初始化的过程
class Person{
private String name;
private int age =20;
private static String country="cn";
Person(Stringname, int age){
this.name =name;
this.age =age;
}
public void speak(){
System.out.println(this.name +"..."+ this.age);
}
public void setName(String name){
this.name =name;
}
public static void showCountry(){
System.out.println("country ="+ country);
method();
}
public static void method(){
System.out.println("static method is running");
}
}
class Test{
public static void main(String[] args) {
Personp =new Person("Benjamin", 28);
p.setName("ZXM");
Person.showCountry();
}
}
在测试类的main中,创建两个Person类的对象。
{
public static void main(String[] args) {
Personp =new Person("Benjamin", 28);
Person p1 =new Person("ZXM", 28);
}
}
【结论】
在调用一个类的构造方法进行对象的创建的时候,进行的动作如下:
【step 1】. 该类中静态成员默认初始化(执行一次,当类加载到内存时)[option]
【step 2】. 该类中静态成员显式初始化(执行一次,当类加载到内存时) [option]
【step 3】. 执行该类的静态代码块为类初始化(执行一次,当类加载到内存时) [option]
【step 4】. 实例变量默认初始化 (堆内存中的成员具有默认值)
【step 5】. 实例变量显式初始化 [实际上就是直接为这个成员变量赋值]
【step 6】. 构造代码块为该对象进行公共初始化
【step 7】. 构造函数为该对象进行特定初始化
注意:其中,前三步是可选的,如果这个类中存在静态变量和静态代码块,才执行前面三步。但是,仅仅执行一次!!
【总结】Person p =new Person("Benjamin", 28);这句话一执行,都做了什么事情?
<1>. 因为new的时候用到了Person类的构造方法,所以类文件Person.class会被加载到内存中。此时静态成员变量在方法区中开辟了内存空间。
<2>. 为静态成员country进行默认初始化,初始化值为null
<3>. 为静态成员country进行显式初始化,初始化值为cn
<4>. 执行Person类的静态代码块,并输出Staic Block.... country: cn
<5>. OS在堆内存中开辟空间,为Person类的对象分配内存地址
<6>. 在堆内存中建立成员变量,并进行默认初始化
这里面,name默认初始化为null,age默认初始化为0
<7>. 为堆内存中的成员变量进行显式初始化。age显式初始化为20
<8>. 为该对象进行构造代码块初始化。此处打印出:
Construction Block....name=null...age =20
<9>. 为该对象进行指定构造函数初始化。name和age分别显式初始化为Benjamin和28
并且打印出:Construction Function....name=Benjamin...age =28
<10>. 将对象在堆内存中的地址赋值给栈内存中的Person类的引用变量p。
注意:非静态成员方法直接访问其他的非静态成员,省略的是this.
静态成员方法直接访问其他的静态成员,省略的是类名.
0 0
- 10、创建java对象各部分的执行顺序
- Java类中各部分的执行顺序
- java创建对象时的执行顺序
- SQL查询语句各部分的执行顺序
- for循环各部分的执行顺序
- Java中创建对象的时候代码执行顺序
- java在创建对象时候 成员的执行顺序
- JAVA对象创建执行顺序实验
- java 对象创建时执行顺序
- Unity3D各部分执行顺序图
- Spring创建对象时的执行顺序
- Java创建对象的顺序
- java所有对象初始化的执行顺序
- Java中创建对象时代码执行顺序
- java创建对象时代码执行顺序探讨
- 基层sql语句各部分执行顺序
- 父子类继承时候各部分执行顺序
- Java中代码块介绍以及加载类和创建对象的执行顺序
- Java容器类常用方法总结
- UIView Animation(二)
- oracle的DBMS_OUTPUT
- MySQL Slave数据重新复制一例
- 如何方便地给Python环境注册新类库
- 10、创建java对象各部分的执行顺序
- 2013:Linux的黄金之年-十大杰出成就
- 《Objective-C开发经典教程》
- AGPS和GPS介绍及各种解决方案,辅助GPS定位
- WINCE6.0下RIL中多路虚拟串口的实现解读
- 揭密Java安全规则对Aurigma Upload Suite的影响
- DIV+CSS解决IE6,IE7,IE8,FF兼容问题
- 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……
- iOS-CocoaPods