关于类的加载时的存放及加载一个类的的过程

原创 2012年03月29日 01:29:48
---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------


类所有内容加载顺序和内存中的存放位置:

根据语句来进行分析,第一句:Person p=new Person("zhangsan",20);
该句话所做的事情:
1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)被放在方法区的静态部分、静态方法放在方法区的静态部分、非静态方法(包括构造函数)放在方法区的非静态部分、
静态代码块放在方法区的静态部分、构造代码块放在方法区的静态部分


注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。

3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
4.开辟空间:在堆内存中开辟空间,分配内存地址。
5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
6.显示初始化:对属性进行显示初始化。
7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
8.构造函数初始化:对对象进行对应的构造函数初始化。
9.将内存地址赋值给栈内存中的变量p。


第二句语句:p.setName("lisi");

1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
3.将"lisi" 赋值给临时变量name。
4.将临时变量的值赋值给this的name。


第三句:Person.showCountry();

1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
2.Person指向方法区中Person类的静态方法区的地址。
3.调用静态方法区中的country,并输出。
  注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
  


综述:静态代码块、构造代码块和构造函数的区别:

静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。

构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。


 创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
 
//利用代码进行测试 例题:06--06:StaticCodeDemo.java
class Person
{
private String name;
private int age=0;
private static String country="cn";


Person(String name,int age)
{
this.name=name;
this.age=age;  
}
static
{
System.out.println("静态代码块被执行");


}
{ System.out.println(name+"..."+age);
}
public void setName(String name)
{
this.name=name;


}
public void speak()
{
System.out.println(this.name+"..."+this.age);


}
public static void showCountry()
{
System.out.println("country="+country);


}
}
class StaticDemo
{
static
{
System.out.println("StaticDemo 静态代码块1");


}
public static void main(String[] args)
{
Person p=new Person("zhangsan",100);
p.setName("lisi");
p.speak();
Person.showCountry();


}
static
{
System.out.println("StaticDemo 静态代码块2");



}
输出结果:
 StaticDemo 静态代码块1
 StaticDemo 静态代码块2
 静态代码块被执行
 null...0    //构造代码块
 lisi...100  //speak()

 country=cn  //showCountry()


---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

JAVA中类的加载过程

java中类的加载过程
  • sinat_19650093
  • sinat_19650093
  • 2016年03月20日 21:56
  • 4181

JVM如何加载一个类的过程

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制 从类被加载到虚拟机内存中开始,到卸载出内存为...
  • s646575997
  • s646575997
  • 2016年05月10日 11:15
  • 1419

Java中类加载过程和对象创建过程

类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加...
  • u014338577
  • u014338577
  • 2015年11月21日 21:47
  • 5269

类加载机制(类加载过程和类加载器)

一、为什么要使用类加载器? Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如: 1.编写一个面向接口的应用程...
  • Jintao_Ma
  • Jintao_Ma
  • 2016年05月09日 15:32
  • 10048

JVM中类的加载过程详解

介绍一下JVM将何时结束线程的生命 (1)程序执行System.exit() (2)程序正常结束 (3)程序抛出异常,一直向上抛出,没有try{}catch()finally{}处理。 (4)由于操作...
  • u011955252
  • u011955252
  • 2015年11月04日 21:23
  • 3703

Objective - C基础: 第四天 - 7.类的加载过程

在前面, 我们知道了类的本质其实也是一个对象, 是Class类型, 那么类的加载过程是如何的呢?? 其实类的加载过程非常简单, 先加载父类然后再加载子类, 而且每一个类就只会加载一次, 下面让我们来...
  • qq350116542
  • qq350116542
  • 2015年01月24日 14:08
  • 714

类的加载、连接与初始化过程的详细分析(上)

前面一个博客文章介绍过了类从加载到可以被使用经过了加载、连接、初始化三个过程,下面对每个过程所发生的事情做详细分析。 一、类加载阶段         1.类加载方式         类的加载指...
  • sunfeizhi
  • sunfeizhi
  • 2015年12月20日 22:40
  • 1488

JVM类生命周期概述:加载时机与加载过程

一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述的类的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到...
  • justloveyou_
  • justloveyou_
  • 2017年05月18日 13:48
  • 5225

类加载器和类加载机制

类加载器,类的加载机制,自定义类加载器。
  • cuizehui123
  • cuizehui123
  • 2016年07月07日 12:28
  • 2100

JAVA 类加载过程详细讲解 -jvm加载类机制CLass Loading

jvm加载类机制CLass Loading
  • tangdong3415
  • tangdong3415
  • 2016年12月20日 20:02
  • 4718
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于类的加载时的存放及加载一个类的的过程
举报原因:
原因补充:

(最多只允许输入30个字)