精华内容
下载资源
问答
  • 创建对象步骤

    2019-08-22 07:25:31
    创建对象步骤 开辟空间 初始化对象信息 返回对象的地址给引用

    创建对象三步骤

    1. 开辟空间
    2. 初始化对象信息
    3. 返回对象的地址给引用
    展开全文
  • 创建对象步骤和方法

    千次阅读 2018-05-21 16:10:34
    创建对象步骤①为对象分配内存空间,将对象的实例变量初始化为其变量类型的默认值②如果实例变量在声明时被显式的初始化则将初始化值赋给实例变量③调用构造方法④返回对象的引用创建对象的方式①类名 对象名=new ...

    创建对象的步骤

    ①为对象分配内存空间,将对象的实例变量初始化为其变量类型的默认值

    ②如果实例变量在声明时被显式的初始化则将初始化值赋给实例变量

    ③调用构造方法

    ④返回对象的引用

    创建对象的方式

    ①类名 对象名=new 类名();最常用方式,步骤①②③④

    ②运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法步骤①②③④

    ③调用对象的clone()方法步骤①②④

    ④运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法步骤①②④

    展开全文
  • 可以看完这个图就懵了,以下是创建对象的六个步骤: 1、判断是否能在常量池中能找到类符号引用,并检查是否已被加载、解析、初始化(即判断类元信息是否存在) 如果没有则在双亲委派模式下,使用当前类加载器以...


    要看的懂对象的创建过程,首先你得有对Java虚拟机和Java基础以及JUC很是熟悉,
    比如类的加载过程、CAS、多线程、JVM的GC等等

    首先来看一个图,我大概会根据图中的内容来分享这六个步骤(其实几个步骤不重要,只要包括的内容都在就行):

    在这里插入图片描述

    一、创建对象的六个步骤:

    1、判断是否能在常量池中能找到类符号引用,并检查是否已被加载、链接、初始化(即判断类元信息是否存在)

    如果没有则在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为Key进行查找对应的.class文件以此来完成类的加载进内存。在这个过程中,要是找不到要加载的类JVM就会抛出ClassNotFoundException异常,意思就是找不到该类进行加载。

    2、为对象分配内存空间

    首先计算对象占用空间大小,接着在堆中划分一块内存给新对象,如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节。文章结束附有Java八种基本数据类型的所占字节数,分配内存时根据堆中内存是否规整分为:

    内存规整—指针碰撞:如果是规整的,那么虚拟机将采用指针碰撞法来为对象分配内存。

    意思就是所有用过的内存在一边,空闲的内存在另一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲那一边挪动一段与对象大小相等的距离,以此来分配内存给对象。如果垃圾收集器选择的是Serial、ParNew这种基于标记 - 压缩算法的,也就是一般使用带有compact(整理)过程的收集器时,就会使用指针碰撞分配方法。

    另外:为什么内存就会是规整的呢?或者为什么内存有不规整的呢?我写了一篇我觉得十分完整的JVM垃圾回收篇

    内存不规整—空闲列表:如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用这种空闲列表法给对象分配内存。

    意思就是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表找到一块足够大的空间划分给对象实例,这种分配方式就是空闲列表(Free List)。

    3、处理并发问题
    为什么会有这个阶段呢?就是我们都知道堆空间是多个线程共享的,那么多个线程同时去操作堆空间数据时就会存在并发线程安全问题。

    两种方式去解决这种并发安全问题:
    采用CAS失败重试、区域加锁更新的原子性

    CAS算法是这样的:CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包(Java.Util.Concurrent)中的原子类都使用了CAS技术。

    CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。
    CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

    大白话:假如A线程要把共享变量sum的值从1修改为2,那么这时候A线程会先通过地址去获取一次sum的初始值1作为预期值,在修改之前会把之前获取的预期值与当前sum的值进行一次比较,假如两个值相同,那就将1修改为2,如果在A线程修改之前,B线程进入把sum的值提前修改为0了,那么A线程在用预期值去与当前的sum值0比较,显然两个值不相等,此时的A线程就不会修改,会继续去读取sum的值,直到sum为 1 时才进行修改操作。

    每个线程预先分配一块TLAB区域,可以通过-XX:+ /-UseTLAB参数来设定

    TLAB这一块区域是在堆当中Eden(伊甸园)区中的,大概占整个Eden区的1%左右,很小的一块区域,堆为每一个线程单独分配一块TLAB,以此来保证多线程共享数据时是线程安全的。

    4、初始化分配到的空间(对属性初始化,零值初始化)

    这一过程说白了就是:所有属性设置默认值,保证对象实例字段在不赋值时可以直接使用。基本数据类型默认初始化的值在文章下方表格里。

    5、设置对象的对象头

    将对象的所属类(即类的元数据信息)、对象的HashCode、对象的GC信息、锁信息等数据存储在对象头中。这个过程的具体设置方式取决于JVM实现。

    6、执行init方法进行初始化

    可以简单理解成调用构造函数进行显示的赋值,代码中和构造器中初始化。在Java程序的视角看来,初始化才正式开始,初始化成员变量,显示赋值,执行实例化代码块,调用类的构造器,并把堆内对象的首地址赋值给引用变量。

    一般来说(由字节码中是否跟随有invokspecial 指令所决定), new指令之后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。

    扩展:还有一个clinit方法,这个方法是加载时对类中static静态修饰的属性和静态代码块进行初始化(此过程是在链接阶段的准备阶段)。这是JVM相关的知识了。

    二、对象头的内部结构

    1、创建了Customer()实例 和 Account()实例
    在这里插入图片描述
    一个对象的内存结构包括:运行时元数据、类型指针、实例数据、对齐填充


    2、对象头里包括(64位机器占96位)运行时元数据(Mark Word)(占64位)、类型指针(Klass Point)(占32位)

    (1) 运行时元数据里又包括:哈希值(HashCode)、GC分代年龄、锁状态标志

    哈希值:31位的对象标识hashCode,采用延迟加载技术。调用方法System.identityHashCode()计算,并会将结果写到该对象头中。它是一个地址,用于栈对堆空间中对象的引用指向,不然栈是无法找到堆中对象的;

    GC分代年龄(占4位):记录幸存者区对象被GC之后的年龄age,一般age为15(阈值为15的原因是因为age只有4位最大就可以将阈值设置15)之后下一次GC就会直接进入老年代,要是还没有等到年龄为15,幸存者区就满了怎么办,那就下一次GC就将大对象或者年龄大者直接进入老年代。

    锁状态标志:记录一些加锁的信息(我们都是使用加锁的话,在底层是锁的对象,而不是锁的代码,锁对象的话,那会改变什么信息来表示这个对象被改变了呢?也就是怎么才算加锁了呢?

    答案就是改变这个对象的对象头的锁信息来标识已经加锁,下一个线程来获取是获取不到的,底层是通过比对当前的线程的那个值与它所期望的值是否相同,这时候一直自旋直到与期望值相同,相同就获取到锁,反之则进入到阻塞队列等待,这个机制叫做CAS,比较并交换。)
    在这里插入图片描述
    那么怎样查看对象的对象头的信息呢 ?

    第一步:导入第三方依赖

        <dependency>
          <groupId>org.openjdk.jol</groupId>
          <artifactId>jol-core</artifactId>
          <version>0.11</version>
        </dependency>
    

    第二步:打印信息

    System.out.println(ClassLayout.parseInstance(o).toPrintable());
    

    打印结果:

    在这里插入图片描述
    其中VALUE分析:
    在这里插入图片描述

    另外:锁的状态有两位数的空间标识,这样就可以实现用较少的空间去存储更多的信息,
    0 表示不可偏向,1 表示可偏向

    标志位锁状态
    01未锁定
    00轻量级
    10重量级(膨胀)
    01可偏向
    11GC标记

    (2)类型指针:是对方法区中类元信息的引用

    3、实例数据:真实记录一个对象包含的数据,比如说一个person对象,里面可能包含年龄、性别、身高等等,其中数据为字符串的,要引用到字符串常量池。

    想知道jdk8字符串常量池到底在那个地方存储的可以看这里。

    4、对齐填充:填充部分仅起到占位符的作用, 原因是HotSpot要求对象起始地址必须是8字节的整数,假如不是,就采用对齐填充的方式将其补齐8字节整数倍,那么为什么是8呢?原因是64位机器能被8整除的效率是最高的。
    在这里插入图片描述
    另外这个过程还会涉及到逃逸分析。我写了一篇逃逸分析的具体作用,感兴趣可以看看。

    基本数据类型所占字节数默认值包装类名称
    byte1(1字节=8位)0Byte
    short20Short
    int40Integer
    long80LLong
    double80.0dDouble
    float40.0fFloat
    char2‘\u0000’Character
    boolean1falseBoolean

    怎样快速记住这些类型的方法,请看这里。

    有用点个关注,手留余香!😐 😐 😐

    展开全文
  • 创建一个对象步骤

    千次阅读 2018-01-25 00:11:45
    创建一个对象步骤 A:画图演示 画图说明一个对象创建过程做了哪些事情? 示例代码: class Demo1_Student { public static void main(String[] args) { Student s = new Student(); s.show(); } } class...

    创建一个对象的步骤

    • A:画图演示
      画图说明一个对象的创建过程做了哪些事情?

      示例代码:
      class Demo1_Student {
          public static void main(String[] args) {
              Student s = new Student();
              s.show();
          }
      }
      
      class Student {
          private String name = "张三";
          private int age = 23;
      
          public Student() {
              name = "李四";
              age = 24;
          }
      
          public void show() {
              System.out.println(name + "..." + age);
          }
      }
      

    图示说明:
    创建一个对象的步骤

    • B:创建一个对象的步骤

      • 第一步:Student.class加载进内存。
      • 第二步:声明一个Student类型引用s。
      • 第三步:在堆内存中创建对象。
      • 第四步:给对象中属性默认初始化值。
      • 第五步:属性进行显示初始化。
      • 第六步:构造方法进栈,对对象中的属性赋值,构造方法弹栈。
      • 第七步:将对象的地址值赋值给s。

      注:构造方法不是手动调用的,他是在创建对象的时候系统帮我们调用的,用完即弹栈。

    展开全文
  • 老师说,先new了一个对象,在堆内存中开辟空间 然后就是赋默认值(没有静态代码块) 接着就是调用对应的构造函数进栈。 执行隐藏的步骤。 1:super() 2:对非静态变量进行赋显示值 3:执行构造代码块 最后执行构造...
  • Java创建对象详解:Java创建对象的几种方法

    万次阅读 多人点赞 2019-05-10 20:01:32
    Java 对象的生命周期包括创建、使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况。 显式创建对象 对象的显式创建方式有 4 种。 1. 使用 new 关键字创建对象 这是常用的创建...
  • Java中创建一个对象步骤

    千次阅读 2019-04-18 22:13:53
    3,在堆内存创建对象, 4,给对象中属性默认初始化值(基本数据类型为0,引用数据类型为null) 5,属性进行显示初始化 6,构造方法进栈,对对象中的属性赋值,构造方法弹栈 7,将对象的地址值赋值给s ...
  • JVM-JAVA对象创建的五个步骤

    千次阅读 2020-06-29 10:03:01
    对象创建的五个步骤 1、类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有...
  • ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说明对象是一组没有特定顺序... 创建自定义对象最简单的方式就是创建一个Object的实例,然后再为他添加属性和方
  • XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端,但并不会打断用户当前的操作。这是一个非常流行的做法,那么如何建立一个XMLhttpRequest对象呢? 1、建立...
  • JavaScript创建对象的4种方法

    千次阅读 2018-11-28 15:02:24
    JavaScript 创建对象的4种方法 所谓对象就是用来帮助你完成一些事情是,对象是有特征和行为的,是具体特指的某一个事物。使用对象可以使程序更加整洁 通过Object()方法来创建 Object()是JavaScript内部的对象...
  • 如何创建对象和使用对象

    千次阅读 2018-07-24 09:17:25
    1.使用对象步骤 类名 对象名 =new 类名(); 例子:Ren ren=new Ren(); 2.使用对象的属性和方法 对象名.属性; String name; int age; 对象名.方法(); 3.给定义变量赋值 ren.age=18; ren.name="帅哥...
  • 1) 创建对象 SpringIOC容器,是spring核心内容。 作用: 创建对象 & 处理对象的依赖关系   IOC容器创建对象创建对象, 有几种方式: 1) 调用无参数构造器 2) 带参数构造器 3) 工厂创建对象 工厂类,静态方法...
  • Java有哪些创建对象的方式? 1、用new关键字创建对象,需要使用构造器。 2、使用反射机制创建对象,用Class类或Constructor类的newInstance()方法。 3、通过object类的clone方法 4、使用反序列化
  • JS创建对象的几种方法

    千次阅读 2018-07-29 17:41:16
    自己认为目前能较好理解的创建对象方法,可能在某些方面不是最优的方法 // 1. 创建使用函数创建(工厂模式) function Person(age,name){ this.age = age || void 0; //void 0 相当于 undefined ,,自己设置好...
  • 内核就是程序中声明的一个函数。...内核对象中封装了程序中的某个__kernel函数以及执行此函数时所需的参数。 1、创建内核 cl_kernel clCreateKernel (cl_program program, const char *kerne
  • new创建对象的过程

    千次阅读 2018-07-16 08:21:31
    创建对象;var p= {};2. 设置新对象的__proto__属性指向构造函数的prototype对象;p.__proto__ = ClassA.prototype;3. 使用新对象调用函数,函数中的this被指向新实例对象: ClassA.call(p); //{}.构造函数(); ...
  • js创建对象的几种方式-转载

    千次阅读 2018-05-22 10:18:17
     2、构造函数模式 与工厂模式相比: 1、没有显式的创建对象 2、直接将属性和方法赋给了this对象 3、没有return语句 要创建person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤: 1...
  • java--创建对象三步

    千次阅读 2017-03-01 14:53:03
    创建对象 对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步: 声明:声明一个对象,包括对象名称和对象类型。实例化:使用关键字new来创建一个对象。初始化:使用new创建...
  • 今天在牛客网讨论区看到了一个题目:如何实现一个函数,可以使用new操作符创建对象,也可以直接使用创建对象? 当时有点懵,回头翻了翻《JS高程》,发现里面的工厂模式和寄生构造函数模式的代码不就是这个题目的...
  • Hibernate 创建session的步骤

    千次阅读 2017-11-21 10:05:07
    //获取配置对象 Configuration configuration = new Configuration().configure(); //获取注册服务对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration....
  • Spring 注解 new创建对象后失效

    千次阅读 2016-08-30 17:39:14
    遇到这么一个情况,想写一个Util工具类用于记录操作日志,在无法使用static关键字情况下,使用new来创建对象,随后运行一直报异常, java.lang.NullPointerException at ...
  • java通过反射创建对象的两种方式

    千次阅读 2019-03-07 15:44:05
    在java中,通过反射创建对象有两种方式 使用Class对象的newInstance()方法来创建对象; 具体步骤是 1、获取类的Class对象(有三种方式可以获取,可以自行百度一下) 2、通过调用所获取到的Class对象的newInstance...
  • linux下oracle创建用户步骤

    千次阅读 2015-10-26 16:37:27
    linux 下oracle用户创建
  • C#/AutoCAD 2018/ObjectArx/二次开发添加图形对象步骤和添加直线的例子(三)1、创建一个图形对象的步骤如下(1)得到创建对象的图形数据库;(2)在内存中创建实体类的一个对象;(3)定义一个指向当前数据库的事务...
  • JAVA对象创建过程

    千次阅读 2019-08-01 18:00:16
    在图中可以清楚的看到jvm在创建对象时候的执行流程,下面具体讨论一下每个步骤: 在程序进行加载的时候,他的类信息,常量,静态变量等数据就会存放在方法区(常量池)中。 在执行new操作的时候,就会去方法区去...
  • 动态创建对象

    千次阅读 2011-04-28 14:55:00
    1 静态存储区。全局对象所使用的内存在这里分配,这个存储空间在程序整个运行期间都存在。
  • JavaScript中创建对象的几种模式

    千次阅读 2016-04-18 17:30:32
    **JavaScript创建对象模式: 对象字面量 工厂模式 构造函数模式 原型模式 结合构造函数和原型模式 原型动态模式 ** 面向对象的语言大都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象。虽然从技术上...
  • Java创建对象的过程简介

    千次阅读 2016-12-02 11:17:42
    简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象的创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了虚拟机之后在作说明。
  • scala的创建类和对象

    千次阅读 2020-02-11 17:11:59
    使用new来创建对象 示例 创建一个Person类,并创建它的对象 步骤 创建一个scala项目,并创建一个Object 添加main方法 创建类和对象 实现 在IDEA中创建项目,并创建一个Object(main方法必须放在Objec...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 780,790
精华内容 312,316
关键字:

创建对象的步骤