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
原创粉丝点击