java数组 静态初始化_Java数组基本功(动态初始化、静态初始化)

——疯狂Java读书笔记

3个问题:

①java中,声明一个数组的过程中是如何分配内存的

②Java数组的初始化一共有哪几种方式

③基本数据类型数组和引用类型数组之间,初始化时内存分配机制有什么区别

一.java的初始化

java数组是静态的,必须经过初始化后才能使用,并且一旦初始化指定了数组的长度,该长度是不可变的。

两种初始化的方式:

1.静态初始化:初始化时由程序猿显示指定每个数组元素的初始值,由系统决定数组的长度

举个栗子:

String[] names = new String[]{"孙猴子","唐僧","猪八戒"};

2.动态初始化:就是与静态初始化相对的撒,23333。其实动态初始化就是在初始化的时候指定数组长度(这时已经分配内存)

举个栗子:

String[] names = new String[3];

names[0]="孙猴子";

names[1]="唐僧";

names[2]="猪八戒";

但是初始化只有这两种方式吗?我们需要理解到真正的初始化到底做了什么工作。

先了解一下初始化后它在内存中是这个样子的。

73971b5b16da

初始化后的内存示意图.png

提示:所有的局部变量都是放在栈内存中保存的,不管其实基本类型的变量还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数据,普通java对象)则总是存储在堆内存中。

Java中数组是引用变量(类似于C语言中的指针变量),我们初始化操作后,就是将它的引用指向了堆内存中开辟的指定长度的连续内存空间。

所以我们真正所做的初始化是将栈中数组变量指向有效的内存。

这样初始化也是完全可以的。

String[] names = new String[3];

names[0]="孙猴子";

names[1]="唐僧";

names[2]="猪八戒";

String[] names2;

names2 = names;

对于java中的所有引用变量,它们都不需要经过所谓的初始化操作,需要进行初始化操作的是该应用变量所引用的对象。比如,数组变量不需要进行初始化操作,而数组对象本身需要初始化;对象的引用变量也不需要初始化,而对象本身才需要进行初始化

基本类型的初始化

两个步骤:

①程序直接先为数组分配内存空间

②再将数组元素的值存入对于的内存中

int iArr[];

iArr = new int[]{1,2,3};

73971b5b16da

基本数据类型初始化后再内存中的存储形式.png

引用类型的初始化

引用类型数组中的元素仍然是引用类型,因此数组元素里存储的还是引用,它指向另一块内存。

public static void main(String[] args){

People[] peoples = new People[2];

People people1 = new People();

people1.name = "小明";

People people2 = new People();

people2.name = "小红";

people[0] = people1;

people[1] = people2;

}

public static class People{

public String name;

}

下面对应内存中的分配流程:

73971b5b16da

peoples数组初始化

73971b5b16da

两个对象初始化完成

73971b5b16da

为数组元素赋值后

从上图我们可以看到,people1与people[0]、people2与people[1]指向的是同一内存区(堆内存)的。(这里与java中的值传递有关系)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值