为什么类的成员变量可以是不给定长的?数组类型的

[复制链接]
查看11 | 回复7 | 2021-1-27 06:09:33 | 显示全部楼层 |阅读模式
1数组在成员方法中定义局部变量需要定长,但可以不初始化!如inta[]=newint[5];
2为什么类的成员变量不用定长,
int[]a;
如果是因为成员变量默认值数组长度为0?
那么数组长度不是不可变吗?为啥还可以给成员变量a添加元素呢?这样不就改变了数组的长度了吗?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
如inta[]=newint[5],你可以打印一下内容看看,全部都是0,已经初始化了
类的成员变量不需要初始化,是因为在没有new一个对象之前,这个属性还没有占据内存堆栈。一旦你new好之后,在使用这个变量,就必须要初始化了。
数组长度确实是不可变的,但那是针对内存中的变量或对象而言的。
不可变的含义是当前对象的不可变,但是不代表不可以扩容,扩容会复制一份新的大小的数组,然后把原先的指针指向新的对象。就达到了你所说的‘改变’大小的效果。

回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
因为,当你在方法里面定义了数据的时候,如inta[]=newint[5];那么这时候已经创建好了5个int类型的空间,你只要往这个空间里存值就可以了。
inta[]=newint[5];
你也可以拆分为:
inta[];
a=newint[5];
当然,当你不想要这个int[5]的时候,a=newint[6];可以让a重新指向一个6空间的int数组呀~(如果是c的话,估计还得把之前的int[5]释放掉)
但是,对于类来说,他只是写好了一个引用,当你实例化这个类时,才确定他的属性域。
也就是,类里面只有第一句代码:inta[];
实例化的时候:再执行a=newint[?];

回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
所谓的数组是定长的,针对的不是a[],而是newint[5]这个东西,如果你要改变a的长度,重新newint[6],让a指向int[6]就行了呀~
回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
类成员变量只是做了声明,并没有初始化,只是在使用的时候才初始化或接收已初始化的参数。
回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
首先数组是引用数据类型,而且再局部方法中也是可以不初始化的


但是在方法之后调用时一定要初始化否则会编译错误;

数组在声明的时候并没有初始化那么这个时候会在栈中开辟一块内存存储这个变量但是其引用地址并没有指向堆
所以此时调用该变量时会NullPointException,所以不允许调用未初始化的数组变量;
但是在成员变量与局部变量中是有区别的

在局部变量中变量未初始化那么这个变量一定不会初始化,所以会抛出编译异常
但是在成员变量中(也叫全局变量)这个变量未初始化时可以在其他方法中使用是因为不确定是否在其调用之前会被初始化所以编译时是没有问题的(编译异常只是为了一定程度上保证运行时不出错)但是在实际运行中未初始化调用就会抛出NullPointException
回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
未初始化调用


作为成员变量时
红框内的方法先调用那么程序就是没问题的
但是在编译期是无法判断的(那么只能认为程序正确)


回复

使用道具 举报

千问 | 2021-1-27 06:09:33 | 显示全部楼层
关于你说的数组长度变化问题

publicclassTests{
int[]s;
publicvoids(){
s[0]=1;
}
publicvoida(){
s=newint[10];
}
publicvoidb(){
s=newint[20];
}
}

看代码数组变量s被赋值不同大小的数组;
数组大小是无法变化的就比如你有一个1L的桶最多只能装1L水桶是不会自己变大的想装更多的水可以换一个更大的桶(也就是数组变大了)
上边这句话中"你"就是变量,桶是数组,水是实际的数据;

有你没桶那么你就没办法装水
有桶没你那么桶跟水就只能放在那里无法操作
比如你拿到桶是初始化
你家是局部
外界是全局
家里可以有你但是没桶(没初始化)那你肯定没办法装水
你在外边的话现在没桶没关系可以去别人家拿嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行