精华内容
下载资源
问答
  • 静态代码块时是在类加载的时候自动执行的代码,非静态代码块是在创建对象时自动执行的代码块,不创建对象不执行该类的非静态代码块。 加载过程: 1、jvm会先去方法区中找有没有相应类的.class存在。如果有,就直接...

    首先,jvm在执行时,遇到一个新的类,挥刀内存中的方法区去找class的信息,如果找到就直接拿来用,如果没有找到,就会去将类文件加载到方法区,在类加载时,静态成员变量加载到方法区的静态区域,非静态变量加载到方法区的非静态区域。

    静态代码块时是在类加载的时候自动执行的代码,非静态代码块是在创建对象时自动执行的代码块,不创建对象不执行该类的非静态代码块。

    加载过程:

    1、jvm会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

    2、在.class加载到方法区时,先加载父类再加载子类;先加载静态内容,再加载非静态内容

    3、加载静态内容:

    把.class中的所有静态内容加载到方法区的静态区域内

    静态内容加载完成后,对所有的静态变量进行默认初始化

    所有的静态变量默认初始化完成后,再显式初始化

    当静态区域下的所有静态变量显式初始化完成后,执行静态代码块

     

    4、加载非静态内容:把.class中的所有非静态变量及非静态代码块加载到方法区下的非静态区域

    5、执行完之后,整个类的加载就完成了

    对鱼静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时时不会执行的,主要在于静态方法可以通过类名直接调用,而非静态方法只能先实例化对象后才能调用

     

    二、对象的创建过程

    1、new一个对象时,在堆内存中开辟一块空间

    2、给开辟的空间分配一个地址

    3、把对象的所有非静态成员加载到所开辟的空间下

    4、所有的非静态成员加载完成之后,对所有的非静态成员变量进行默认初始化

    5、所有非静态成员变量默认初始化之后,调用构造函数

    6、在构造函数入栈执行时,分为两个部分,先执行构造函数中的隐式三步

    执行super()

    对开辟空间下的所有非静态成员变量进行显式初始化

    执行构造代码块===即构造函数中书写的代码

     

    展开全文
  • 当首次创建类型为Dog的对象时,或者Dog类的静态方法,静态属性域首次访问时,java解释器查找classPath,定位到Dog.class文件 2. 载入Dog.class文件,生成一个Class类型对象,所有有关的静态初始化动作都会执行,...

    类的加载时机

    Class只有在必须要使用的时候才会被装载,虚拟机不会无条件的装载Class类型。Java虚拟机规定,一个类或接口在初次主动使用前,必须要进行初始化。主动使用有以下几种情况:

    1. 当创建一个类的实例时,new,或反射,克隆,反序列化

    2. 当调用类的静态方法时,

    3. 当调用类的静态字段时(final常量除外,在编译时,直接存放到常量池中)

    4. 当使用java.lang.reflect包中的方法反射类的方法时

    5. 当初始化子类时,要求先初始化父类。

    6. 作为启动虚拟机,含有main方法的那个类。

    类的加载过程

    加载:属于类装载的第一个阶段,通过类的全名,获取类的二进制数据流(利用ClassLoader类加载器)。创建java.lang.Class的类的实例,表示该类型。
    验证:类加载到系统后,开始连接操作,验证是连接操作的第一步,验证字节码的合法性等。
    准备:为类分配相应的内存空间,并设置初始默认值,如果存在常量字段,也会被赋值,是虚拟机的行为,不会有任何Java代码被执行。
    解析:将类,接口,字段和方法的符号引用转为直接引用。也就是得到类或者字段,方法在内存中的指针或者偏移量。如果直接引用存在,那么可以肯定系统中存在该类,方法或者字段,但只存在符号引用,不能确定系统中一定存在该对象。字符串常量指向常量池中的常量,通过String.intern()得到常量在常量池中的位置。
    初始化:类的初始化是类加载的最后一个阶段。如果前面没有问题,那么就可以顺利的装载到系统中,此时开始执行java字节码,先执行类的初始化方法clinit,该方法由编译器自动生成,初始化静态代码块(优先执行父类),如果一个类没有赋值语句和static块,则不生成clinit函数,只有final(在准备阶段已经完成)也不会生成。当有多个线程试图初始化一个类时,只有一个线程可以进入clinit函数,其他线程必须等待,如果成功加载,则等待的线程则没有机会执行clinit函数了,但需要使用时,虚拟机直接返回给它已经准备好的信息。
    总结:
    加载->验证->准备->解析->初始化

    对象的创建过程

    1.所有的类都是在对其第一次使用时,动态加载到JVM中。当首次创建类型为Dog的对象时,或者Dog类的静态方法,静态属性域首次被访问时,java解释器查找classPath,定位到Dog.class文件
    2. 载入Dog.class文件,生成一个Class类型对象,所有有关的静态初始化动作都会执行,静态代码块,静态成员属性。 并且这种初始化动作只在Class对象首次加载时候进行一次。
    3. 当用new Dog()创建对象时,首先JVM在堆heap上为Dog对象分配足够的存储空间
    4. 存储空间清空,自动将Dog对象中的所有基本类型数据都设置成了默认值,对象引用被设置为null
    5. 执行所有在字段定义处的一些初始化操作
    6. 调用构造器方法。(没有继承)
    如此一来,便创建了这个对象.

    总结:1第一次使用类时动态加载到JVM,找到class文件->2生成Class类型的对象,执行静态初始化动作(只在Class对象首次加载时进行一次)->3new 创建对象时,在堆上分配内存空间->4将对象中的字段设置默认值,对象为null->5执行字段定义处初始化操作->6调用构造方法

    注:第一次使用类或创建对象时,当存在继承关系时,从父类到子类依次执行,静态初始化工作,从父类到子类依次执行构造方法。

    展开全文
  • 原因是,每一个对象在创建之时,就已经决定了它所占用的内存空间,所以在创建对象前必须要先确认加载完成,不然无法预留出确定的对象空间.另外的,分配对象空间时,会涉及到分配空间方式的问题.目前主要有两种,一...

    在new对象的时候,jvm中的具体执行过程如下:

    1. 类加载检查.在创建对象前,jvm会检查该类是否已经被加载在虚拟机中,如果没有的话就会去执行类加载;待类加载完成后才会在内存中创建这个对象的空间.原因是,每一个对象在创建之时,就已经决定了它所占用的内存空间,所以在创建对象前必须要先确认类加载完成,不然无法预留出确定的对象空间.另外的,在分配对象空间时,会涉及到分配空间方式的问题.目前主要有两种,一个是指针碰撞,另一个是本地线程缓冲,也就是TLAB(Thread Local Allocation Buffer).指针碰撞是将内存空间分为两部分,一部分是已经分配的对象空间,一部分是剩余的堆内存.每一个对象生成时,指针都会向右偏移一个对象的空间,但在多线程环境下,指针碰撞采用CAS锁失败重试的模式;而TLAB则是在堆内创建额外的空间用来标记线程的私有空间,以空间换时间.
    2. 内存分配后,虚拟机将分配到的空间都置为零值(不包括对象头),如果使用TLAB,这一过程也可以提前至TLAB分配时进行.这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值.也就是给对象分配初始值的操作.
    3. 接下来虚拟机要对对象进行必要的设置,这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的GC分代年龄等信息.

    对象内存中的存储的布局可以分为三个区域:对象头、实例数据和对齐填充.

    1. 对象头:分为两部分信息,第一部分用于存储对象运行时的数据(如果是对象数组,在头信息还要加上对象数组的长度),Mark Word在32位虚拟机和64位虚拟机的长度分别为32位和64位.在Mark Word中有2bit用于存储锁标志位,对应的锁的转换关系为:可偏向锁 -> 轻量级锁定 -> 膨胀(重量级锁).可偏向是当没有线程争抢该对象时的锁,而轻量级锁是有两个或多个线程争抢该资源时才会转变为轻量级锁.轻量级锁时,为自旋锁,等待占有资源的线程释放资源,而当自旋到一定程度时,会从轻量级锁转为重量级锁.重量级锁时,争抢资源的线程不会再自旋争抢,会转为阻塞态等待被唤醒.
    2. 实例数据:实例数据部分是对象真正存储的有效信息.
    3. 对齐填充:为了让这个对象占据一定的空间,也就是为了让对象占有完整的8字节的整数倍空间而存在的.本身没有什么意义.
    展开全文
  • 统计对象被创建次数

    千次阅读 2018-12-04 17:38:16
    被创建的对象个数很多的时候,我们需要知道这些对象个数. 做法是:在类的构造方法里面,写一个静态变量的count++,后面每创建一个对象时,均会自加一次. public class Student{ int name; static count = 0; public ...

    在被创建的对象个数很多的时候,我们需要知道这些对象个数.
    做法是:在类的构造方法里面,写一个静态变量的count++,后面每创建一个对象时,均会自加一次.

    public class Student{
    	int name;
    	static count = 0;
    	public Student(){
    		count++;
    	}
    }
    public class Test{
    	public static void main(String[] args){
    		Student s1 = new Student();
    		Student s2 = new Student();
    		Student s3 = new Student();
    		System.out.println(s3.count);	//s1调用也可
    	}
    }
    
    展开全文
  • 创建对象

    2017-10-19 14:04:00
    1.设计思想 因为静态变量所有的对象所...所以在类中声明一个静态变量a=0,但是当类中每创建一个对象时,它就在构造函数中加1,最后输出的a的值就是类的对象的个数。 2.程序流程图 3.程序源代码 public class...
  • 这个特殊的日子将要来临的时候,我们说说关于JavaScript对象相关的内容. JavaScript对象介绍 下面叙述的所有演示代码均**与OC类似,正所谓万物皆对象,JavaScript所有事物都是对象.JavaScript对象是包含着属性...
  • 对象的创建过程

    2017-03-28 17:34:48
    载入.class文件,有关静态初始化的所有动作都会执行(静态初始化只在对象首次加载的时候进行一次) 当用new创建对象的时候堆上为对象分配足够的空间 存储空间将会初始化,自动为对象的所有基本数据类型设置成...
  • 当JVM遇到一个new指令的时候,首先将去检查这个指令的参数能否在常量池中找到 一个类的符号引用,并且检查这个符号引用所代表的类是否已经加载、解析、初始化过。如果没有,将先进行类加载的过程。在类加载检查...
  • javanew一个对象的时候,会先查看对象所属的类有没有加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象创建工作。 分为加载并初始化类和创建对象 2.加载并初始化类 ...
  • 当虚拟机遇到一条new指令时,会去检查方法区检查是否已经此类数据(已经加载解析和初始化),不存在则 加载数据。然后再堆上创建对象。这时,对象的创建一定会有多线程问题,因为我们不知道某块内存地址...
  • Java对象的创建过程

    2018-09-10 17:28:58
    当首次创建类型为Dog的对象时,或者Dog类的static方法/static字段/static域首次访问时,Java解释器必须查找类路径(事先设好的类路径里搜索),以定位Dog.class文件。 载入Dog.class,有关静态初始化的所有动作...
  • 先看下面一段代码 person { person() { //无参构造函数 ...构造函数,就是函数被创建一个对象的时候会调用它构造方法,只会调用一次并且是其中一种的构造方法; 1:调用无参构造 栈中创建: person per...
  • 对象的创建和使用

    2020-02-16 12:01:40
    方法区内存,在类加载的时候,class字节码代码片段加载到内存空间中 栈内存(局部变量):方法代码片段之执行的时候,会给该方法分配内存空间,在栈内存中压栈 堆内存:new对象在堆内存存储 student 是一个引用...
  • 当我们new了一个对象的时候,JVM是如何操作,使这个对象可用的呢? 也就是类的加载流程, 加载检查 虚拟机遇到一条new指令时,首先去检查这个参数是否能再常量池中定位到一个类的符号引用,并且检查这个符号引用...
  • 构造函数决定了对象“被初始化的方式”,在创建的时候被调用。 析构函数: 析构函数据定了对象“被删除的方式”,在对象被销毁前调用。 其他的东西因为比较基础,就不想多说了,之所以这里会谈到构造函数以及...
  • # 在创建实例的时候调用,self代表本身 def __init__(self,name,age): self.__name=name#属性私有化 sekf.__age=age # 可以被类对象调用,cls代表本身,只能操作中的公有方法 ...
  • 当类加载完成后,接下来就要为对象分配内存,所需内存大小在类加载完成之后就可以完全确定下来,所以只需在 java 堆中划分出足够大小内存给该对象即可,这其中涉及到 java 堆内存是否规整(也就是说没有使用...
  • 信息放在了方法区中(jdk1.8之后元空间) 加载过程 什么是加载 java编译器会将java源码编译成.class文件,将.class文件加载到JVM中,变成JVM认识内容过程就是加载过程。这个过程由加载器完成。...
  • Java 对象的创建过程

    2019-02-01 16:48:47
    以名为Dog的类为例子: ...2、当找到Dog.class时加载Dog.class,此时Dog.class里所有static初始化模块都会运行,因此static只会初始化一次,就是在类加载的时候; 3、进行new Dog(),Dog对象的...
  • JVM:对象的创建

    2018-09-05 16:19:19
    1.当虚拟机遇到一个new指令的时候,首先将去检查这个指令的参数是否能常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已加载、解析和初始化过。如果没有必须先执行相应的类加载过程; (类加载...
  • java中对象的创建过程

    2018-03-06 18:14:00
    1,因为构造器实质上是静态方法,当首次创建A类的对象时(即执行了A类的静态方法),或者A类的静态方法/静态域首次访问时,java解释器必须查找类路径,以定位A.class文件。 2,载入A.class文件,有关静态初始化的...
  • 类与Class对象 类是程序的一部分,每个类都有一个Class对象,即每当编写并且编译一个新类的时候就会产生一个...所以java程序运行之前并没有完全加载,各个类只需要的时候才将该类的Class对象载入内存,...
  • java对象的创建过程

    2016-03-08 14:21:06
    虚拟机遇到new 关键字的时候,首先去常量池中寻找有没有这个类的符号引用,并且检查该引用的类是否已经加载,解析,和初始化过,如果没有则会先执行该类的加载过程, 通过检查后,虚拟机为该新生对象分配内存。...
  • spring的对象创建时机

    2020-10-21 17:38:16
    这是我们创建好的一个实现Someservices接口的实现,我们其中创建了一个构造方法,我们知道当一个类被调用的时候,本中的构造方法一定会执行。那么接下来我们来调用这个。 2. 使用一个test方法来测试...
  • Java程序运行是,无时无刻都有许多对象被创建,当虚拟机遇上 new 关键字的时候,首先去检查这个指令的参数是否能常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析、和初始化过...
  • 定义类  在C#中使用class关键字,一个名称,一对大括号来定义一... 在定义类的时候可以在类的前面加上访问修饰符,类的修饰符用于控制访问的范围,默认情况下,类的修饰符为internal  我们可以看到我们在类前面
  • Java是一个面向对象的语言,程序运行中时时刻刻都有对象被创建,创建对象通常只是一个new关键字,当虚拟机遇到new 的指令的时候,首先会去检查这个这个指令的参数能否常量池中对应到一个类的符号引用,并且检查...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,654
精华内容 1,861
关键字:

在类的对象被创建的时候