问题描述
- 小白问题:JAVA自定义容器类时,一段构造方法不太看得懂,求详细解释
-
我先解释一下题意,现在要设计一个容器类(intArray2),这个容器的本质就是一段数组(暂且只装int值),这个数组可以的索引可以根据使用者传入的数据多少而自动增长,而自动产生新数组覆盖以前的,那么我的疑问就是如下这个....为什么构造方法要像第二图里那么写,而不能照我想的第一张图里的写
解决方案
第一个,以为save这个变量在定义的时候,还没有被初始化,而你在下面构造函数里面的save = new int[save.length],中括号里面的save并没有具体的内容,所以是不对的。
第二个,定义了两个构造函数,他们是没有冲突的,你还可以定义第三第四五六七八九十十一个,只要他们的参数个数或顺序不同就行了。
第三个,上面已经解释了,他们是不同的构造函数,不传参数,调用的是无参构造函数(类默认就有的的),你传来参数,调用的就会是对应的构造函数。这样。
解决方案二:
第一个,以为save这个变量在定义的时候,还没有被初始化,而你在下面构造函数里面的save = new int[save.length],中括号里面的save并没有具体的内容,所以是不对的。
第二个,定义了两个构造函数,他们是没有冲突的,你还可以定义第三第四五六七八九十十一个,只要他们的参数个数或顺序不同就行了。
第三个,上面已经解释了,他们是不同的构造函数,不传参数,调用的是无参构造函数(类默认就有的的),你传来参数,调用的就会是对应的构造函数。这样。
解决方案三:
第一个,以为save这个变量在定义的时候,还没有被初始化,而你在下面构造函数里面的save = new int[save.length],中括号里面的save并没有具体的内容,所以是不对的。
第二个,定义了两个构造函数,他们是没有冲突的,你还可以定义第三第四五六七八九十十一个,只要他们的参数个数或顺序不同就行了。
第三个,上面已经解释了,他们是不同的构造函数,不传参数,调用的是无参构造函数(类默认就有的的),你传来参数,调用的就会是对应的构造函数。这样。
解决方案四:
private int[] save这是声明了一个int数组对象的引用 未初始化之前直接调用当然会报错
正确写法中 声明了两个构造器 一个无参构造器默认初始化一个长度为10的int数组 另外一个有参的构造器
测试代码里面如果长度超过你规定的长度 会重新声明一个2倍长度的数组 然后将内容copy一下
解决方案五:
不传的时候调用的是不带参数的构造方法,并且初始化一个大小为10的数组(有带参数的应该就是想让你初始化一个自己指定大小的容器),在你调用add的时候,他会去判断你加入的元素是否大于数组的长度,
如果大于就调用kr()来自动扩展数组的大小,至于你的第一张图,你只是声明了一个x变量,但没有对他进行初始化,所以你在调用x.length时会报空指针异常
解决方案六:
1、save没有new之前是不能用length方法的
2、分开2个写表示这2种构造方法都可以用,用哪个是根据你是否传参
3、10表示分配10*sizeof(int)个字节的内存,超过的部分运行时使用可能会出现错误,可能不会,但编译可以通过
解决方案七:
alert(11111)
解决方案八:
intArray2(){
save = new int[save.length];//为什么不可以这么写
}
intArray2()是构造函数,你在这里使用了save.length
,然而save
数组并没有被初始化,这么使用当然是不可以的。
写两个一个是默认长度为10,一个是可以自定义数组长度,这样对使用者来说是非常友好的,不是吗?至于为什么可以打印超出13以后的数字,那是因为有kr()
这个函数存在。你看一下在使用add()
的时候,先判断的是size
是否已经超出现有的长度,如果超出了,调用kr()
函数。这个kr()
函数县创造一个双倍于现有数组长度的数组,通过System.arraycopy()
函数完成了原来数组数据的复制,这就完成了一个扩容的过程。
如果完美解答了你的问题,请采纳谢谢~
解决方案九:
第一个,有如下两个问题
你这是在模拟线性表吧。
针对上面的三处有如下答案:
第一处:
save = new int[save.length];
1:在方法内部,变量没有初始化是不能使用的.
2:使用 xxx = new xxx的时候,等式右边的运算式save默认是null,你这么用编译没问题。运行的时候就是NullPointException了。
第二处:
定义2个构造方法
首先呢要写一个空参数的构造方法以防它被覆盖
第二个构造方法是可以自己定义线性表的大小的。
设置两个很符合线性表的构造需求。
而且你后面的操作有一个不传值得构造,这个时候就要用这个没有参数的。
第三处:
完全是因为你自己定义的add方法内部有一个扩容的操作。也就是那个kr函数了。
一旦超过内部存储save的容量就进行2倍的扩容。
所以你不传值得时候默认大小是10,后面录入数据,超过10就扩容。
所以你试验的时候传值与不传值都没有影响。
如果满意还请采纳
解决方案十:
引用类型没有实体化之前(也就是没有new之前)就是个null,null不能调用方法,也就是sava不能调用length方法,而第二个就是直接new有个int型数组而已。