精华内容
下载资源
问答
  • java创建对象过程

    2013-12-15 21:45:45
    Java创建对象过程: 先创建静态成员变量——>再创建静态模块——> 1. 所有的类都是在对其第一次使用时,动态加载到JVM中。当首次创建类型为Dog的对象时,或者Dog类的静态方法,静态属性域首次被访问时,java解释器...

    Java创建对象过程:

    先创建静态成员变量——>再创建静态模块——>

    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)初始化父类,2)执行子类的静态方法和静态模块



    要注意的点:

    1)并非所有类都需要main方法,非public的类里可以有main方法

    2)类文件里只有一个public的类,非public外部类生命为default

    3)类里的私有变量,只要是本类的任何对象都可以访问

    4)protected在子类中可以用

    5)修饰类只有public和default。修饰成员变量(数据域和方法)有public和private。局部变量不可以用public和private,否则有编译出错

    一个对象在一个类中定义可以访问该类的任何成员变量,包括private修饰的


    如果一个类中的每个属性都存在它的一对公有的getset方法,并且这个类存在一个公有的无参构造方法,那么它就是一个Java Beanavabean是一种特殊的class,是一种JAVA语言写成的可重用组件,是按照一定的规范来写的class


    .javaJava的源文件后缀,编写的代码需要写在.java文件中。
    .class是字节码文件,是.java源文件通过javac命令编译后生成的文件。
    Java虚拟机就是去运行.class文件从而实现程序的运行。

    javac是java的编译器,将java转化 为字节码文件.class




    Java中重写指的是方法的重写,而不是属性的重写,还有多态也只是方法的多态 ,没有属性的多态。 属性是不能多态的,静态方法也不能多态。 内存中只看到子类的方法和父类的属性

    当父类和子类都出现相同名称的变量,子类的变量是不会被覆盖,子类的变量和父类的变量一同存在

    一个对象创建的过程分成4步: 
    1.分配空间 
    2.递归创建父类对象 
    3.调用本类构造方法  
    4.初始化本类属性;

    成员变量如果不赋值,系统会自动赋默认值。而局部变量不赋值是出现编译错误。



     this()与 super()其相似之处:

    (1)当构造方法有重载时,两者均会根据所给予的参数的类型与个数,正确地执行相对应的构造方法。

    (2)两者均必须编写在构造方法内的第一行,也正是这个原因,this()与 super()无法同时存在同一个构造方法内。


    展开全文
  • Java创建对象过程中,内存的分配

    千次阅读 2017-05-24 16:56:50
    那么,在创建对象过程中,内存是如何分配的呢? 类的本质是一种引用数据类型,这与数组是一样的。比如本文提供的简单例子程序中的Person类,它有两个属性,name和age,而属性是需要内存来存储的。我们以person对象...

    对象的内存分配

    我们都知道,要使用类,就一定要为其创建对象。那么,在创建对象过程中,内存是如何分配的呢?

    类的本质是一种引用数据类型,这与数组是一样的。比如本文提供的简单例子程序中的Person类,它有两个属性,name和age,而属性是需要内存来存储的。我们以person对象来讲解。执行Person person=null; 时,Java系统会在栈内存开辟一个空间给对象person,程序继续向下执行到person=new Person(); 时,Java系统会在堆内存开辟空间保存对象person属性(注意是属性)的内容。person变量本身存储的只是一个地址值,没有存储任何实际数据,但是它指向了Person类。所以当访问person对象的属性和方法时,实际上访问的是person所引用对象的属性和方法。

    堆内存中的变量可以有多个引用,但是它们实际引用的是同一个类,如果对其中一个对象进行修改,那么其他对象的属性也会发生变化,因为它们指向同一个类。

    可以这么说,对象的名称保存在栈内存中,而对象的属性保存在以new为关键字才能开辟的堆内存中。在Java中,当为类创建一个对象时,编译器会为对象的各个类型的成员变量进行初始化,无论是基本数据类型还是引用数据类型。

    注意:对象在使用前一定要实例化,如果对象没有实例化而直接使用,那么编译时就会出现空指针异常

    本文例程代码:

    public class hello {
     
        public static void main(String[] args) {
            Person person=null;
            person=new Person();
            person.say();
        }
     
     
    }
    class Person{
        String name="Ters";
        int age=18;
        public void say() {
            System.out.println(name+" "+age);
        }
    }


    匿名对象

    匿名对象是指没有栈空间的对象,即没有明确的名字给出对象。匿名对象使用的是堆内存,是通过关键字new进行开辟,因为没有对应的栈内存空间引用,所以对象只能使用一次。

    new Person().say();


    展开全文
  • JVM(二)JVM 创建对象过程分析

    千次阅读 2018-01-19 11:15:11
    在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?首先来看一下JVM创建对象时的流程图: Created...

    在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?首先来看一下JVM创建对象时的流程图:

    Created with Raphaël 2.1.2开始JVM 执行 new 指令类已加载?为新生对象分配内存内存规整?指针碰撞并发处理:同步或TLAB将分配到的内存空间初始化为零值JVM 对对象进行设置结束空闲列表执行类加载过程yesnoyesno

    接下来对上面的流程图进行一个大概的说明。

    一、类加载检查

    普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。

    二、分配内存

    分配内存时主要注意两个问题:1.如何分配空间。2.修改指针时如何实现线程安全。

    2.1 分配内存

    内存的分配存在两种实现方式:

    • 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。
    • 空闲列表:如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。选择哪种分配方
    2.2 线程安全

    保证修改指针时线程安全也存在两种实现方式:

    • 同步处理:对分配内存的空间动作进行同步处理(采用CAS配上失败重试的方式保证跟新操作的原子性);
    • 本地线程分配缓冲:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,叫本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),哪个线程需要分配内存,就在那个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。

    三、初始化和设置

    内存分配完成后,虚拟机将分配到的内存初始化为零值(除对象头外),如果使用TLAB分配,也可提前值TLAB分配时进行。

    接下来,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。

    在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从Java程序的视角来看,,对象创建才刚刚开始——<init>方法还没有执行,所有的字段都还为零。所以,一般来说执行new指令之后会接着执行<init>方法,把对象按照程序员的意愿进往初始化,这样一个真正可用的对象才算完全产生出来。

    展开全文
  • 在有static、final、extends修饰的类(包括属性和方法)的对象创建过程。因此约定下述引用声明和对象创建: Class A = new B(参数表); 1、在没有上述修饰词的情况下对象创建过程如下: 2、多态的创建 3、初始化...

    在有static、final、extends、implements修饰的类(包括属性和方法)的对象创建过程。因此约定下述引用声明和对象创建:

    匿名对象:没有声明引用的对象,一般是Has-a关系中的类创建的,直接在方法中赋值。

    Class A = new B(参数表);引用的声明都是在对象创建之前的(如果你不是创建的匿名对象的话)。

    1、通常情况下(在没有上述任何修饰词的情况下,只包含属性和方法的一般类)对象创建过程如下:

    1. 给对象分配内存空间(准确的说是属性),并且将属性值置为默认值0或者null或者false
    2. 实例变量初始化,将定义类时直接赋给属性的字面值
    3. 调用类的构造方法,将构造方法中的参数传给属性(如果有参数的话)

    2、多态的创建过程extend修饰:先声明父类引用在创建子类对象

    1. 给子类属性分配内存空间并将属性值置为默认值
    2. 递归构造父类对象:1)给父类属性分配内存空间(包括私有属性),并将属性置为默认值,如果父类还有父类,则此步完成后再次递归构造父类对象;2)父类实例变量初始化;3)调用父类的构造方法完成对象的初始化
    3. 子类实例变量初始化
    4. 调用子类的构造方法完成全部对象的初始化

    3、初始化代码块

    1. 给对象分配内存空间
    2. 调用初始化代码块(在每一次创建对象时都会调用一次,其内部的变量属于局部变量)
    3. 实例变量初始化
    4. 调用构造方法完成对象的创建
    5. 调用本类初始化代码块在递归构造父类对象以后

    4、静态初始化代码块和被static修饰的属性

    1. 在类加载时对象创建之前调用静态初始化代码块
    2. 静态修饰的部分从父类开始执行父类的静态初始化代码块->父类静态属性->子类静态初始化代码块->子类静态属性……静态方法在对象创建过程中不分配内存空间
    3. 创建对象

    5、final修饰

    1. final修饰的属性在实例变量初始化(1.2)时完成赋值,如果final修饰的属性赋值是在定义时给出而不是在构造方法中给出的。

    6、包含属性为类的类

    1. 属性为其他类时,它和本类其他的属性没有任何差别,如果在调用有参构造时不使用匿名对象方式赋值的话,需先行用此属性类创建一个对象,并给出引用
    2. 匿名对象方式赋值:在创建对象时,先行创建属性的类的对象,其创建对象和其他对象的创建过程是一致的

    7、构造方法带参数的创建过程

    1. 就是调用构造方法,不过带参数的构造方法一般都是给属性赋值,有时会在这里给final属性赋值。
    8、implements修饰

    1. implements是实现接口的关键字,也是多态的体现。接口的属性都是公开静态常量,因此他的属性都是在类加载的时候完成的初始化。接口没有构造方法。

    总结:

    因此整个创建对象的过程可以总结如此下:

    1. 所有接口属性的空间分配和赋值
    2. 递归调用静态初始化的成分,父类的静态初始化代码块,然后静态属性的空间分配和初始化
    3. 子类的静态初始化代码块,静态属性的空间分配和初始化
    4. 调用的构造方法中属性为类,需要创建匿名对象的,先行创建一个对象,然后再创建本类对象
    5. 利用本类对象的创建过程,给对象分配内存空间,并将属性值设为默认值
    6. 递归构造父类对象<就是重复5~9的过程>
    7. 调用本类的初始化代码块
    8. 实例变量初始化,final修饰的属性是直接赋值的话,在此步就会完成给属性的赋值,如果是在构造方法中给出则跳过初始化这一步
    9. 调用本类的构造方法,将构造方法的参数传给属性,完成对象的创建,

    展开全文
  • ,1.1、new String(“hello”)创建了几个对象   不考虑其他因素,String b = new String(&amp;amp;amp;amp;amp;quot;hello&amp;amp;amp;amp;amp;quot;);这行代码到底创建了几个对象?   情况一,创建...
  • 如果JVM的垃圾收集器采用标记-清除算法,那么堆中空闲区域和已使用区域交错,因此需要用一张“空闲列表”来记录堆中哪些区域是空闲区域,从而在创建对象的时候根据这张“空闲列表”找到空闲区域,并分配内存。...
  • java创建对象创建过程分析

    千次阅读 2017-11-27 21:10:45
    new Object();的过程
  • Java创建对象过程简介

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

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

    千次阅读 2019-02-15 15:03:55
    如果没有,那必须先执行相应的类加载过程。 分配内存: 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 ...
  • JAVA对象创建过程

    2018-01-21 18:19:27
    JVM对象创建过程  对于java程序员来说,我们无时无刻不在创建和使用对象。使用new关键字即可快速创建一个对象,其实在new的背后,JVM为我们完成了很多事情。  JVM的字节码解释器在读取到NEW的指令时,会先去常量...
  • java对象创建过程

    千次阅读 2016-03-28 09:27:04
    java对象创建过程,java的根本,如下图所示:
  • java对象创建过程

    2017-06-13 22:07:19
    1、对象创建的整个流程:step1: 当虚拟机遇到一个new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有,那么必须先执行...
  • java 对象创建过程

    千次阅读 2014-10-18 23:46:17
    JVM中对象创建过程 1. 拿到内存创建指令 当虚拟机遇到内存创建的指令的时候(new 类名),来到了方法区,找 根据new的参数在常量池中定位一个类的符号引用。 2. 检查符号引用 检查该符号引用有没有被加载、...
  • JVM对象创建过程

    2018-09-08 14:21:01
    问题:在语言层面,通过new一个关键字就可以创建一个对象,那么在底层jvm是如何进行一个对象的创的?? 1)首先程序计数器在收到这个new得到指令时候,先到方法区的常量池检查有没有这个类的符号引用,然后检查类...
  • new关键字创建对象过程

    千次阅读 2018-08-09 14:14:52
    题目解析 先看代码 var Func=function(){ ...1、创建一个空对象 var obj=new Object(); 2、设置原型链 obj.__proto__= Func.prototype; 3、让Func中的this指向obj,并执行Func的函数体。 var r...
  • 创建对象过程(临时对象)

    千次阅读 2019-03-14 20:20:59
    赋值运算符右侧隐式生成临时量,推演CGoods中有符合自身数据类型的构造函数,赋值运算符左侧是生成新对象则会产生优化,以生成临时对象的方式生辰新对象,故调用带一个参数的构造函数。(不需要调用赋值运算符重载...
  • OC对象创建过程

    千次阅读 2015-03-31 09:30:42
    在利用OC开发应用程序中,需要大量创建对象,那么它的过程是什么呢? 比如:NSArray *array = [[NSArray alloc] init]; 在说明之前,先把OC的Class描述一下: Class Objective-C类是由Class类型来表示的,它...
  • C++类对象创建过程

    2020-03-12 13:16:08
    创建C++类对象的第一步就是为其分配内存空间。对于全局对象,静态对象以及分配在栈区域内的对象,对它们的内存分配是在编译阶段就完成了,而对于分配在堆区域内的对象,它们的分配是在运行是动态进行的。内存空间的...
  • 文章目录面试题——new一个对象/创建对象过程第一步,类加载和初始化(第一次使用该类)1. 加载2. 验证3. 准备4. 解析5. 初始化(先父类,再子类)第二步,创建对象1. 在堆区为实例对象分配内存2. 对实例变量赋...
  • Java中创建对象过程

    2019-07-01 22:50:18
    我们来看如下的代码: ... * @description: 对象的生命周期 * @author: YangHang * @create: 2019-07-01 22:21 **/ public class ObjectLifeCycle { public static void main(String[] args) { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,436
精华内容 19,774
关键字:

创建对象过程