Java基础之数组的初始化过程

 更新时间:2024年10月21日 11:00:45   作者:john_heping  
Java数组分为静态和动态初始化,静态初始化中,程序员设定元素初始值,系统决定长度;动态初始化中,程序员设定长度,系统提供初始值,数组初始化后长度固定,存储在堆内存中,数组变量在栈内存指向堆内存数组对象,基本类型数组存储数据值,引用类型数组存储对象引用

Java基础总结

一、数组初始化

1、数组初始化概念

Java是静态语言,因此Java的数组也是静态的。就是说数组在被初始化后数组的长度是不可改变的。而Java的数组初始化就是给数组对象分配内存空间并且给每个数组元素给予初始值。

数组的几种初始化方式:

静态初始化:程序员决定数组元素的初始值,系统决定长度。

String[] names = new String[]{"张三","李四","王五"};
String[] books = {"射雕英雄传","天龙八部","笑傲江湖"};

动态初始化:程序员只决定数组元素的长度,系统分配元素初始值(通常为null,0等)。

String[] strAll = new String[5];

数组对象的长度初始化后长度就不可改变了,他们在堆内存中已经开辟了对应大小的内存空间。

数组变量是一个引用类型的变量,数组变量在栈内存中指向存放在堆内存中的数组对象。内存分配如下图所示:

2、基本类型数组和引用类型的数组初始化的不同

2.1、基本类型数组初始化

对于基本类型的数组,他们的初始化就是在堆内存中开辟一个固定长度和大小的空间用于存储基本类型数据。

比如int(初始值为0),float(初始值为0.0),char(初始值为‘\u0000’),boolean(初始值为false)等。

对应数组类型只能存储对应的数据,并且可以替换,但唯一不变的是数组的长度大小不会变。

我们看看下面这个方法

public static void main(String[] args){
    //动态初始化int数组nums,长度为5
    int[] nums = [5];
    //给nums数组设置元素
    for(i=0;i<5;i++){
        nums[i]=i;
    }
}

根据这段代码,我们可以得出它在内存中的变化是怎么样,看下图:

从这个图可以看出,基本类型的数组元素都是存在数组开辟的内存空间中并且长度不变,元素可以替换。相当于一个瓶子里可以装可乐也可以装雪碧,只要你是液体的就行,瓶子只有那么大只能装那么多。

2.1、引用类型数组初始化

引用类型的数组,它初始化完成后数组长度也是固定的,和基本类型数组不同的地方就是数组对象元素。

基本类型数组元素是存放对应基本类型的元素具体值,而引用类型数组对象元素存放的是引用,这个引用指向堆内存中另一块内存空间。

看例子:

public class Cat{
    //体重
    public double weight;
    //年龄
    public int age;
}

public class Test{
    public static void main(String[] args){
        //定义一个数组变量cats,类型是Cat{}
        Cat[] cats;
        //执行动态初始化数组,长度为2
		cats = new Cat[2];
        //创建两个Cat类型的对象
      	Cat cat1 = new Cat{}
        Cat cat2 = new Cat{}
        //赋值给对象的属性
        cat1.weight=45.2;
        cat1.age=2;
        cat2.weight=35.5;
        cat2.age=1;
        //把对象存入数组元素
        cats[0] = cat1;
        cat2[1] = cat2;
    }
   
}

根据代码,我们可以知道。我们创建了Cat类型的引用类型数组cats,所以,数组cats中的元素,应该存放Cat对象的引用。

所以我们把对象引用变量cat1,cat2作为cats数组的元素存入数组。

我们继续看内存解析,如下图:

代码执行顺序如上图序号所示,所以在堆内存中,引用类型的数组元素就是一个对象的引用。

它们在赋值过程中相当于是把自己的指向地址给了数组元素,可以说是cat1=cats[0]。

还可以把引用看做是一个堆内存地址指针,它指向的堆内存的对象。

3、数组元素就是变量

看过了上面两个例子,基本类型数组和引用类型数组初始化,我们可以得出一个结论:**数组元素就是变量**。

int[] ints; //int[]数组的元素相当于int类型的变量
String[] strs;//String[]数组的元素相当于String类型的变量
Cat[] cats;//Cat[]数组的元素相当于Cat类型的变量

在引用类型数组初始化的内存图解中也能看出来数组元素就是变量这个结论。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot项目配置文件注释乱码的问题解决方案

    SpringBoot项目配置文件注释乱码的问题解决方案

    这篇文章主要介绍了SpringBoot 项目配置文件注释乱码的问题解决方案,文中通过图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • Java中notify和notifyAll的区别及何时使用

    Java中notify和notifyAll的区别及何时使用

    本文主要介绍了Java中notify和notifyAll的区别及何时使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java集合之Map接口与实现类详解

    Java集合之Map接口与实现类详解

    这篇文章主要为大家详细介绍了Java集合中的Map接口与实现类,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的可以了解一下
    2022-12-12
  • Java实现矩阵加减乘除及转制等运算功能示例

    Java实现矩阵加减乘除及转制等运算功能示例

    这篇文章主要介绍了Java实现矩阵加减乘除及转制等运算功能,结合实例形式总结分析了java常见的矩阵运算实现技巧,需要的朋友可以参考下
    2018-01-01
  • springboot 接收LocalDateTime方式

    springboot 接收LocalDateTime方式

    这篇文章主要介绍了springboot 接收LocalDateTime方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java empty、null、blank的区别小结

    Java empty、null、blank的区别小结

    本文主要介绍了Java empty、null、blank的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring和IDEA不推荐使用@Autowired 注解原因解析

    Spring和IDEA不推荐使用@Autowired 注解原因解析

    这篇文章主要为大家介绍了Spring和IDEA不推荐使用@Autowired 注解原因解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Spring中的InitializingBean接口源码解析

    Spring中的InitializingBean接口源码解析

    这篇文章主要介绍了Spring中的InitializingBean接口源码解析,InitializingBean接口为Bean初始化提供了一种方式,实现InitializingBean接口的Bean,在BeanFactory设置其所有属性后会调用其afterPropertiesSet()方法,需要的朋友可以参考下
    2024-02-02
  • 如何通过XML方式配置AOP过程解析

    如何通过XML方式配置AOP过程解析

    这篇文章主要介绍了如何通过XML方式配置AOP过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 迪米特法则_动力节点Java学院整理

    迪米特法则_动力节点Java学院整理

    这篇文章主要介绍了迪米特法则,迪米特法则就是一个在类创建方法和属性时需要遵守的法则,有兴趣的可以了解一下
    2017-08-08

最新评论