java类中各成分的加载顺序跟内存中的存放位置-----转载

  1 参加一个笔试,有一个关于类的静态代码块、构造代码块、构造函数的执行顺序的问题。不太清楚,网上百度了一下。在这里记录一下。
  2
  3 一、什么时候会加载类?
  4 使用到类中的内容时加载:有三种情况
  5 1.创建对象:new StaticCode();
  6 2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show();
  7 3.在命令行中运行:java StaticCodeDemo
  8
  9 二、类所有内容加载顺序和内存中的存放位置:
 10 利用语句进行分析。
 11 1.Person p=new Person("zhangsan",20);
 12 该句话所做的事情:
 13 1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
 14 2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
 15 加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
 16 记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
 17 静态成员变量(类变量)  ----->方法区的静态部分
 18 静态方法              ----->方法区的静态部分
 19 非静态方法(包括构造函数)  ----->方法区的非静态部分
 20 静态代码块 ----->方法区的静态部分
 21 构造代码块 ----->方法区的静态部分
 22
 23 注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
 24 ,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
 25 所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
 26
 27
 28 3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
 29 4.开辟空间:在堆内存中开辟空间,分配内存地址。
 30 5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
 31 6.显示初始化:对属性进行显示初始化。
 32 7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
 33 8.构造函数初始化:对对象进行对应的构造函数初始化。
 34 9.将内存地址赋值给栈内存中的变量p。
 35 2.p.setName("lisi");
 36 1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
 37 2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
 38 3.将"lisi" 赋值给临时变量name。
 39 4.将临时变量的值赋值给this的name。
 40 3.Person.showCountry();
 41 1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
 42 2.Person指向方法区中Person类的静态方法区的地址。
 43 3.调用静态方法区中的country,并输出。
 44   注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
 45
 46 三、静态代码块、构造代码块和构造函数的区别
 47 静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
 48 构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
 49 构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。
 50  创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
 51
 52 //利用代码进行测试 例题:06--06:StaticCodeDemo.java
 53 [java] view plain copy
 54 class Person
 55 {
 56 private String name;
 57 private int age=0;
 58 private static String country="cn";
 59 Person(String name,int age)
 60 {
 61 this.name=name;
 62 this.age=age;
 63 }
 64 static
 65 {
 66 System.out.println("静态代码块被执行");
 67 }
 68 { System.out.println(name+"..."+age);}
 69 public void setName(String name)
 70 {
 71 this.name=name;
 72 }
 73 public void speak()
 74 {
 75 System.out.println(this.name+"..."+this.age);
 76 }
 77 public static void showCountry()
 78 {
 79 System.out.println("country="+country);
 80 }
 81 }
 82 class StaticDemo
 83 {
 84 static
 85 {
 86 System.out.println("StaticDemo 静态代码块1");
 87 }
 88 public static void main(String[] args)
 89 {
 90 Person p=new Person("zhangsan",100);
 91 p.setName("lisi");
 92 p.speak();
 93 Person.showCountry();
 94 }
 95 static
 96 {
 97 System.out.println("StaticDemo 静态代码块2");
 98 }
 99 }
100
101
102 输出结果:
103  StaticDemo 静态代码块1
104  StaticDemo 静态代码块2
105  静态代码块被执行
106  null...0    //构造代码块
107  lisi...100  //speak()
108  country=cn  //showCountry()
时间: 2024-11-03 22:28:40

java类中各成分的加载顺序跟内存中的存放位置-----转载的相关文章

Java 类中各成分加载顺序 和 内存中的存放位置

参加一个笔试,有一个关于类的静态代码块.构造代码块.构造函数的执行顺序的问题.不太清楚,网上百度了一下.在这里记录一下. 一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new StaticCode();2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show();3.在命令行中运行:java StaticCodeDemo 二.类所有内容加载顺序和内存中的存放位置:利用语句进行分析.1.Person p=new Person("zhang

jsp页面中的代码执行加载顺序介绍(转)

原文出处:http://www.3lian.com/edu/2014/01-10/123053.html 本篇文章主要是对jsp页面中的代码执行加载顺序进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. js在jsp中的加载顺序 页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加

Django中App的teemplates加载顺序

背景 ??Python版本:3.7 ??Django版本:1.8 做了一个简略的备忘概述,推荐阅读参考链接. 加载顺序 在Django中,App首先访问的templates是在setting中设置的DIRS. 如果DIRS文件夹中找不到模板的话,那么就会去App中去查找模板(不用自己设置是默认的). 但是如果在app的views中设置如下(指定文件夹),那么去查找的就是一个在settings中设置的DIRS文件夹下的test.html,如若找不到,会直接报错.而不会再去APP中去寻找test.h

类中各模块的加载顺序

一.引言 说实话,此部分知识是在当初学C#基础的时候学到的,起初就记得有这么回事,后来学Java的时候对于基础跳过去很多,最近项目上遇到了一个问题,最终问题当然解决了,解决后想到了类中各模块加载顺序这个知识点,当结果与理论此时相互印证一番后,对此知识豁然开朗,也更清晰. 二.问题由来 一个类Test交给Spring进行管理,但是此类通过XML的形式进行配置的,在Test类中利用@Autowired注入了使用@Service注解的Call,private Call call,我在Test类的构造函

jsp页面中的代码执行加载顺序介绍

1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. js在jsp中的加载顺序 页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加载.所以js加载的顺序也就是页面中<script>标签出 现的顺序.<script>标签里面的或者是引入的外部js文件的执行顺序都是其语句出现的顺序,其中js执行的过程也是页面装载的一部分.

【转】查看java类是从哪个包加载

Java的类装载器使用的是优先策略,加载类的时候先找到哪个就加载哪个.有时候我们做一个系统,当类库非常庞大的时候,类可能会出现冲突,也就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻烦,我们可能修改了类,但由于类加载器却使用的是另外一个未被更新的类,这个时候就会丈二和尚摸不着头脑,一度使调试过程误入歧途. 那么怎么来确定我当前所加载的类是位于哪个路径或者存在于哪个jar包当中呢?Java语言给我们的解决方案如下代码所示: import java.security.CodeSou

table 中 thead tbody tfoot 加载顺序问题

这几个标记主要是用于提高table标签的加载以及显示的,说白了,就是分布加载.在传统的浏览器,在加载 时,是当所有的标签中元素都被下载后才会显示,当然这样的用户体验是不好的.再加入了这几个t打头的标签后,table就会分布的加载table中的元素,顺序依据写在table中的标签顺序进行. 为了让大表格(table)在下载的时候可以分段的显示,就是说在浏览器解析HTML时,table是作为一个整体解释的,使用TBODY可以优化显示.如果表格很长,用tbody分段,可以一部分一部分地显示,不用等整个

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

原文地址: http://blog.csdn.net/justloveyou_/article/details/72466105 JVM类加载机制主要包括两个问题:类加载的时机与步骤 和 类加载的方式.本文主要阐述了第一个问题,关于类加载的方式等方面的内容,包括JVM预定义的类加载器.双亲委派模型等知识点, 一个Java对象的创建过程往往包括两个阶段:类初始化阶段 和 类实例化阶段. 注意,本文内容是以HotSpot虚拟机为基准的. 一.类加载机制概述 我们知道,一个.java文件在编译后会形成

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

一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周期,并结合典型案例重点介绍了类的初始化过程,进而了解JVM类加载机制. 一.类加载机制概述 我们知道,一个.java文件在编译后会形成相应的一个