10、创建java对象各部分的执行顺序
2014-01-23 16:01
197 查看
------- <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.
静态成员方法直接访问其他的静态成员,省略的是类名.
创建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.
静态成员方法直接访问其他的静态成员,省略的是类名.
相关文章推荐
- java创建对象时代码执行顺序探讨
- Java中创建对象时代码执行顺序
- Java中创建对象的时候代码执行顺序
- java在创建对象时候 成员的执行顺序
- JAVA对象创建执行顺序实验
- java 对象创建时执行顺序
- Java中创建对象时,初始化成员变量的代码的执行顺序
- java创建对象时的执行顺序
- java对象实例化过程中的代码执行顺序
- C#创建对象时各种初始化属性、字段的方式的执行顺序
- 创建一个类的时候java的执行顺序
- Java创建对象的顺序
- Java创建对象的初始化顺序
- Java new一个子类对象时static和构造函数的执行顺序
- Java创建对象的初始化顺序(转载)
- 用JAVA语言编写程序:包含两个类,一个类Cricle中包含计算圆周长,面积的方法。在另一个类Compute中给出半径值为10,创建对象,并调用Cricle类中的方法,计算该对象的面积、周长并显示出结
- Java类中各部分的执行顺序
- java-----建立对象时代码执行顺序
- 再学Java 基础(3)类与对象【构造函数以及其执行顺序----经典讲解】重点!!!
- java加载类创建对象的过程以及静态代码段的执行时机