首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JAVA new一个对象过程

new一个对象过程中发生了什么? 1.确认类元信息是否存在。当 JVM 接收到 new 指令时,首先在 metaspace 内检查需要创建类元信息是否存在。...如果没有找到文件,则抛出 ClassNotFoundException 异常 , 如果找到,则进行类加载(加载 - 验证 - 准备 - 解析 - 初始化),并生成对应 Class 类对象。...成员变量值都需要设定为默认值, 即各种不同形式零值。 4.设置对象头。设置新对象哈希码、 GC 信息、锁信息、对象所属类元信息等。这个过程具体设置方式取决于 JVM 实现。...初始化成员变量,执行实例化代码块,调用类构造方法,并把堆内对象首地址赋值给引用变量。...在类加载过程中,只有内部变量创建完,才会去执行这个类构造方法。 在类加载过程中,静态成员类对象,会优先加载;而普通成员类对象则是使用时候才回去加载。

82230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java之new一个对象是怎样过程

    作为一名java码农,在语言层面上,如何创建一个对象,想必大家意识就是new关键字使用了,在虚拟机中,对象创建又是一个怎样过程呢?...虚拟机遇到一条new指令时,首先将去检查这个指令参数是否能在常量池中定位到一个符号引用,并且检查这个符号引用代表类是否已被加载,解析和初始化过,若没有,必须先执行相应类加载过程。...类加载过程在这篇文章中先不进行说明,简单地说下,类加载过程就是将我们java源代码编译后class字节码文件加载进内存过程,先说到这吧,后面会单独写一篇文章,大家一起交流交流。...接下来动作就是虚拟机要对对象进行必要设置了,一般一个对象是属于某个类实例中一个,如何才能找到类元数据信息,对象哈希码就是hashCode了,对象GC分代年龄等信息,这些信息是存在对象对象头之中...,当上面的工作完成了之后,从虚拟机角度来看,一个对象已经产生,但是从Java程序角度来看,对象创建才刚刚开始,一般来说,执行new执行之后会接着执行方法,把对象按照程序设计人员思维进行初始化

    2.2K30

    java new一个对象过程中发生了什么

    java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。...一、类加载过程(第一次使用该类)   java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)...1、加载      由类加载器负责根据一个全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证...所谓虚方法表,就是在类加载时候,为每个类创建一个表,这个表包括该类对象所有动态绑定方法及其地址,包括父类方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类

    58220

    Java:new一个对象过程中发生了什么?

    来源:www.cnblogs.com/JackPn/p/9386182.html ---- java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载...加载并初始化类完成后,再进行对象创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)收到了类加载请求...初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法 4、如果有类似于Child c = new Child()形式c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象地址赋值给它...所谓虚方法表,就是在类加载时候,为每个类创建一个表,这个表包括该类对象所有动态绑定方法及其地址,包括父类方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类

    1K20

    Java new一个对象过程中发生了什么?

    作者:沉默哥 cnblogs.com/JackPn/p/9386182.html java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。...加载并初始化类完成后,再进行对象创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)收到了类加载请求...初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法 4、如果有类似于Child c = new Child()形式c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象地址赋值给它...所谓虚方法表,就是在类加载时候,为每个类创建一个表,这个表包括该类对象所有动态绑定方法及其地址,包括父类方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类

    61510

    java new一个对象过程中发生了什么

    java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader...初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法 4、如果有类似于Child c = new Child()形式c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象地址赋值给它...所谓虚方法表,就是在类加载时候,为每个类创建一个表,这个表包括该类对象所有动态绑定方法及其地址,包括父类方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类

    2.6K21

    面试官:new一个对象有哪两个过程

    Java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)收到了类加载请求...初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法 4、如果有类似于Child c = new Child()形式c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象地址赋值给它...所谓虚方法表,就是在类加载时候,为每个类创建一个表,这个表包括该类对象所有动态绑定方法及其地址,包括父类方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类

    1.9K31

    对象new一个呗😝

    引言--在JavaScript中,new一个非常重要关键字,它用于创建对象实例。虽然new看起来很简单,但它背后隐藏着一些复杂原理和机制。...当使用new关键字调用一个函数时,它会执行以下操作:创建一个简单 JavaScript 对象(即  {} );为步骤 1 新创建对象添加属性  __proto__ ,将该属性链接至构造函数原型对象...arguments 一个用于被 constructor 调用参数列表。创建一个用户自定义对象需要两步:通过编写函数来定义对象类型。通过 new 来创建对象实例。...通过使用new关键字调用这两个构造函数,我们可以分别创建一个名为john男朋友对象一个名为lisa女朋友对象。最后,我们打印出这两个对象实例,可以看到它们分别具有相应属性值。...通过对new关键字详细解析,我们可以更好地理解JavaScript中对象实例创建过程,从而更加灵活地运用new关键字来构建复杂应用程序。

    21330

    涨姿势,Java中New一个对象是个怎么样过程

    在语言层面创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(普通Java对象,不包括数组和Class对象等)创建时一个怎么样过程?...一、对象创建 当虚拟机遇到一条new指令时候,首先去检查这个指令参数是否能在常量池中能否定位到一个符号引用,并且检查这个符号引用代表类是否已被加载、解析和初始化过。...如果没有,那必须先执行相应类加载过程。 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。...堆内存是绝对规整,所有用过内存都放一边,空闲内存放在另一边,中间放着一个指针作为分界点指示器,那所分配内存就仅仅把那个指针向空闲空间那边挪动一段与对象大小相等距离。...做完以上以后,从虚拟机视角来看,一个对象已经产生了,但是Java程序视角来看,执行new操作后会接着执行方法,把对象按照程序员意愿进行初始化,这样一个真正对象就产生了。

    55120

    JS面向对象二:this原型链new原理

    JS面向对象二:this/原型链/new原理 阮一峰JavaScript教程:面向对象编程 阮一峰JavaScript教程:实例对象new 命令 阮一峰JavaScript教程:this 关键字 也可以看看这篇文章周大侠啊...所有的对象都有__proto__属性,他们就像被链子连接在了一起,所以就称之为原型链 而复制过程一个机器来完成.这个机器(比如可以说是Object())使用方法就是:按照模板实例对象new()一个对象...既然这样,那么我们可以把制造士兵过程写成一个函数. ? 然后调用即可 ?...这种方法省内存且好用. new()就是刚刚所有过程 ? 灰色代码就是new()做封装,不需要你做事情 共有属性被new()统一叫做prototype ? new其实就是语法糖!...new使用,new过程就是生产机器按照模板原型对象造出来对象过程!

    2K30

    C#new一个对象

    问:当我们new一个对象时,会发生什么事? 答:调用该类型构造函数。 问题看似简单,不过事实上,CLR做比这要多。。。 要准确回答这个问题,还要分情况来说。...所谓类型指针,你可以这样来理解:每个对象都是一个类型实例,而每个类型本身都有一个Type类型实例来表示,对象类型指针就是指向该类型Type实例指针。...而对于类型指针,则将其指向一个实实在在对象——即该类型类型对象实例。 再然后,就是调用类型构造函数了。...完成了上述步骤,一个引用类型对象实例就做好了,new操作符只要返回这个实例引用就算完成任务了。 new一个值类型 首先,也是要计算需要分配多少内存。...所以,new操作符无需返回值类型实例地址。 现在我们知道每new一个对象时CLR所需要做工作了。可以看出,CLR任务并不轻松。若是考虑到new一个对象之后还要垃圾回收该对象,那CLR就更辛苦了。

    67331

    【JavaScript】对象 ④ ( 构造函数与对象联系 | new 操作符执行过程分析 )

    ; 构造函数 抽象了 对象公共部分 , 将 属性 和 方法 封装到了 构造函数中 , 可以理解为 面向对象 类 ; 对象 指的是 某一个特定实例化值 ; 二、new 操作符执行过程分析 1、...使用 new 操作符调用构造函数,创建对象 var person = new Person('Tom', 18); 2、new 操作符执行过程 new 操作符 主要作用就是 创建一个对象实例 ,...这个 对象实例 会继承构造函数 prototype 对象 , 并 执行 构造函数 中代码 , 来初始化新对象属性和方法 , 下面详细分析 new 操作符 执行过程 ; new 操作符 创建对象...执行过程 如下 : 首先 , 创建空对象 , 使用 new 操作符 调用 构造函数 , 可以 在 内存空间 中 , 创建一个对象 ; 然后 , this 指针指向对象 , 将 构造函数 中 this...不需要 return 语句 ; 如果构造函数 没有 显式地 返回一个对象 , new 操作符 会自动返回新创建对象 ; 如果构造函数 确实 显式地 返回了一个 返回值 , 那么这个返回值会被 new

    10010

    【说站】jsnew关键字使用过程

    jsnew关键字使用过程 说明 1、new构建函数,在内存中创建一个对象。 2、this指向刚刚创建对象,在构造函数中执行代码,并为空对象添加属性和方法。 3、返回到这个对象。... age, sex) {      this.name = name      this.age = age      this.sex = sex      // return 1  //如果返回了一个基本数据类型数据...,下方person会生成一个对象      // return {} //如果返回了一个非基本数据类型数据,下方person为{}  }  var person = new Foo('小明', '18...', '男')  consloe.log(person)  console.log(person.name)  //小明 以上就是jsnew关键字使用过程,希望对大家有所帮助。

    85830

    讲讲new对象流程

    对象怎么创建,这个太熟悉了,new一下(其实还有很多途径,比如反射、反序列化、clone等,这里拿最简单new来讲): Dog dog = new Dog(); 我们总是习惯于固定语句执行,却对于背后实现过程缺乏认知...在看这篇文章之前,啰嗦一句:如果你死记硬背下面所说流程等于白看,就算现在记住了,一个礼拜后呢,一个月后你又能记得多少,因为对象创建过程这个知识点平常工作中基本不会涉及到,太底层了,背熟知识点不经常加以运用容易遗忘...(GC),创建一个对象放入堆内同时也会在栈中创建一个指向该对象堆内存中地址引用变量,下面说对象就是存在该内存中 下面我们就按照对象生成过程来一一讲解参与其中过程各个概念。...还有一点需要注意,不管以哪种方式创建对象,对应Class对象都是同一个 Dog dog1 = new Dog("旺财"); Dog dog2 = new Dog("小黑"); Class c = Class.forName...本文不指望你能使劲弄懂java虚拟机底层加载创建对象过程(其实有些步骤我都懒得讲了,因为说出来也都非常理论化,没多大意思),是想让你知道对象诞生过程有哪几个重要概念参与了,弄懂这些概念比起单单知道对象创建过程有意义

    51530

    理解jsnew

    new 操作符 在有上面的基础概念介绍之后,在加上new操作符,我们就能完成传统面向对象class + new方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassical...基于上面的例子,我们执行如下代码 var obj = new Base(); 这样代码结果是什么,我们在Javascript引擎中看到对象模型是: ? new操作符具体干了什么呢?...__proto__ = Base.prototype; Base.call(obj); 第一行,我们创建了一个对象obj 第二行,我们将这个空对象__proto__成员指向了Base函数对象prototype...成员对象 第三行,我们将Base函数对象this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量值是”base”,关于call函数用法,请参看陈皓...例如代码如下: Base.prototype.toString = function() {     return this.id; } 那么当我们使用new创建一个对象时候,根据__proto

    3.4K40

    类和对象创建过程(元类,__new__,__init__,__call__)

    三、 __init__,__new__,__call__三个特殊方法 __new__: 对象创建,是一个静态方法,第一个参数是cls。...__init__ : 对象初始化, 是一个实例方法,第一个参数是self,该self参数就是__new__()返回实例,__init__()在__new__()基础上可以完成一些其它初始化动作,...__new__方法在类定义中不是必须写,如果没定义,默认会调用object.__new__去创建一个对象。如果定义了,就是会覆盖,使用自定义,这样就可以自定制创建对象行为。  ...以上面的代码为例,我们实例化一个对象obj=Foo()时,会先执行Foo类__new__方法,没写时,用父类__new__方法,创建一个对象,并返回,然后执行__init__方法(自己有就用自己,...__new__函数来创建对象(该函数需要返回一个对象(指类)实例),然后再调用该元类__init__初始化该对象(此处对象是指类,因为是元类创建对象),最终返回该类 1.对象是类创建,创建对象时候类

    1.2K50

    js new一个function都发生了什么

    2019-04-10 03:08:56 在ES5当中其实是没有类这个概念,我们使用jsOOP编程其实是用function模拟了类实现。...一个对象 proto 属性和自己内部属性[[Prototype]]指向一个相同值 (通常称这个值为原型),原型值可以是一个对象值也可以是null(比如说Object.prototype.proto...如果需要访问一个对象原型,应该使用方法Object.getPrototypeOf. firefox、chrome等浏览器把对象内部属性[[Prototype]]用 proto 形式暴露了出来....(老版本IE并不支持 proto ,IE11中已经加上了 proto 属性) 其实我们只需要记住: proto 是原型,prototype是函数默认一个属性,它指向一个对象,这个对象constructor...[[Prototype]] = Foo.prototype; Foo.call(o); 上面我们说过了,一个对象内部属性[[Prototype]]和proto指向一个值,所以说在new时候我们可以理解为

    1.8K30
    领券