❶对象实例化过程

——————————————

        理解Java中对象实例化过程是很重要的,实例化过程主要步骤如下:

        第1步:在创建类之前,检查类是否加载(是将硬盘上的.class文件加载到内存中), 如果没有加载就加载这个类,在这个类加载之前要加载所有父类。

        Java运行时采用的策略:懒惰式加载(按需加载) :如果第一次用到就加载,只加载一次。通过CL ASSPATH指定的路径寻找类文件(.class), 加载以后是一个对象,类型是Class。

        第2步:在内存堆中分配对象空间。递归分配所有父类和子类属性空间。

        属性默认自动初始化。自动初始化为"0"值。

        第3步:进行属性的赋值。

        第4步:递归调用父类构造器。(默认调用父类无参数构造器! )

        第5步:调用本类构造器。

        第1步:检查并加载类首先检查内存中Koo有没有加载,如果Koo没有加载会加载Koo并加载父类Foo。

        第2步:在内存堆中分配对象空间先递归的分配父类型空间(Foo) : int a=0 (int类型空间, 默认值为0)再分配子类型空间(Koo) : int b= 0。

java 中的实例对象 java对象的实例化过程_加载

        第3步:进行属性的赋值。

java 中的实例对象 java对象的实例化过程_构造器_02

        第4步:递归调用父类构造器。

java 中的实例对象 java对象的实例化过程_构造器_03

        第5步:调用本类构造器。

java 中的实例对象 java对象的实例化过程_创建或实例化对象一般通过“_04

        new运算:创建对象实例(共3步)

        第1步根据类的属性在堆中分配对象空间,并且自动初始化实例变量。

java 中的实例对象 java对象的实例化过程_加载_05

        第2步根据参数类型调用构造器。

java 中的实例对象 java对象的实例化过程_创建或实例化对象一般通过“_06

java 中的实例对象 java对象的实例化过程_创建或实例化对象一般通过“_07

        注: this编译时不存在,运行时才出现。

        第3步new运算返回对象的引用地址。

java 中的实例对象 java对象的实例化过程_构造方法_08

        Java的内存管理与分配

        1、栈是一块Java使用内存区域,使用的方式: LIFO(后来者居上)。

        2、堆也是一块Java使用内存区域,使用方式:随机分配。

        局部变量与堆对象空间分配

        1、Java局部变量和方法参数在栈中分配,大小是按照变量的类型分配。

        2、对象在堆中分配,按照类中声明属性(实例变量)分配空间。

        变量类型与分配

        1、变量分为:基本类型和引用类型。

        2、基本类型变量的空间大小:就是基本类型的空间大小,值是基本类型的值。

        3、引用变量的值是一个对象的地址值,引用变量通过地址引用了一个堆对象。

        4、引用类型变量的占用空间大小和值管理是"透明的(不可看见)"由Java系统管理:变量占用空间以及值的管理,都是透明的。

——————————————

❶构造器的作用

——————————————

        构造器(构造方法)的作用

        构造器(构造方法)的作用:用来描述对象的创建过程的。

        举例说明:

java 中的实例对象 java对象的实例化过程_java 中的实例对象_09

        Java中的构造器

        构造方法(构造器)要点:

        1、Java中的构造器(构造方法)声明在类内部。

        2、方法名与类名一致的方法叫构造方法。

        3、构造方法不能声明返回值类型。

        4、构造方法可以包含参数,参数一般是创建对象实例必须依赖的条件(前提条件)。

        下面我们写了一个带参数的构造器(构造方法),如下所示:

public class Point2 {    int x;    int y;/***构造器* @param x* @param y*/    public Point2(int x, int y) {        this.x= x;        this.y=y;    }}

        注:常用写法,this的含义后续介绍。

——————————————

❶默认构造器

——————————————

        Java类一定有构造器。

        当使用new关键字时, JVM必定调用构造方法创建对象。

        如果类没有声明任何构造器,Javac自动提供一个。

/***默认构造器java类一定有构造器*/public class ConstructorDemo {      public static void main(String[] args) {          Foo foo = new Foo();      }}class Foo {  // public Foo(){}默认构造器}

        默认构造器,当class中不写构造器时,javac提供一 个无参数默认构造器。

        如果提供构造器声明,Javac将不再提供默认构造器。

        调用默认无参构造器时会出错,而调用自定义有参构造器没有问题。

/***默认构造器java类- 定有构造器*/public class ConstructorDemo2 {      public static void main(String[] args) {            Foo foo = new Foo(); //调用的是默认构造器            // Goo goo = new Goo();没有Goo            Goo goo = new Goo(2); //调用构造器Goo(int a)       }}class Foo {    // public Foo() {}默认构造器}class Goo {        int a;        public Goo(int a) {//如果提供了构造器,javac不提供默认构造器            this.a= a;        }}

——————————————

❶构造方法重载

——————————————

        构造方法重 载即写多个参数不一样的构造器。构造方法重载是为了实现构造方法的重用。

public class Point {    int x;    int y;    /**    *表示对角线上的点    */    public Point(int x) {        this.x = x;//调用本类的构造器,根据参数列表匹配    }    /**    *构造器    * @param x    * @param y    */    public Point(int x, int y) {        this.x= x;        this.y=y;    }}

注:

        1、方法签名=方法名+参数类型列表。

        2、方法重载有如下规则:

            a方法名一样。

            b方法参数不一样。

        3、重载方法也可以说是,方法名一样,方法签名不同的方法。