cai772088996
2015-12-22 08:30
采纳率: 84.7%
浏览 2.4k
已采纳

小白问题:JAVA自定义容器类时,一段构造方法不太看得懂,求详细解释

我先解释一下题意,现在要设计一个容器类(intArray2),这个容器的本质就是一段数组(暂且只装int值),这个数组可以的索引可以根据使用者传入的数据多少而自动增长,而自动产生新数组覆盖以前的,那么我的疑问就是如下这个....为什么构造方法要像第二图里那么写,而不能照我想的第一张图里的写

我觉的应该如此写(编译通过,运行报错,失败):
图片说明

正确的写法,为什么要这么写两个:
图片说明

测试代码,实参传或不传,传什么值,都不影响结果,为什么:
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 已采纳

    第一个,以为save这个变量在定义的时候,还没有被初始化,而你在下面构造函数里面的save = new int[save.length],中括号里面的save并没有具体的内容,所以是不对的。
    第二个,定义了两个构造函数,他们是没有冲突的,你还可以定义第三第四五六七八九十十一个,只要他们的参数个数或顺序不同就行了。
    第三个,上面已经解释了,他们是不同的构造函数,不传参数,调用的是无参构造函数(类默认就有的的),你传来参数,调用的就会是对应的构造函数。这样。

    点赞 评论
  • 当头冷水 2015-12-22 08:53

    private int[] save这是声明了一个int数组对象的引用 未初始化之前直接调用当然会报错
    正确写法中 声明了两个构造器 一个无参构造器默认初始化一个长度为10的int数组 另外一个有参的构造器
    测试代码里面如果长度超过你规定的长度 会重新声明一个2倍长度的数组 然后将内容copy一下

    点赞 评论
  • _执着_ 2015-12-22 08:59

    不传的时候调用的是不带参数的构造方法,并且初始化一个大小为10的数组(有带参数的应该就是想让你初始化一个自己指定大小的容器),在你调用add的时候,他会去判断你加入的元素是否大于数组的长度,
    如果大于就调用kr()来自动扩展数组的大小,至于你的第一张图,你只是声明了一个x变量,但没有对他进行初始化,所以你在调用x.length时会报空指针异常

    点赞 评论
  • 1、save没有new之前是不能用length方法的
    2、分开2个写表示这2种构造方法都可以用,用哪个是根据你是否传参
    3、10表示分配10*sizeof(int)个字节的内存,超过的部分运行时使用可能会出现错误,可能不会,但编译可以通过

    点赞 评论
  • 申鹰 2015-12-22 09:33
    intArray2(){
        save = new int[save.length];//为什么不可以这么写
    }
    

    intArray2()是构造函数,你在这里使用了save.length,然而save数组并没有被初始化,这么使用当然是不可以的。

    写两个一个是默认长度为10,一个是可以自定义数组长度,这样对使用者来说是非常友好的,不是吗?至于为什么可以打印超出13以后的数字,那是因为有kr()这个函数存在。你看一下在使用add()的时候,先判断的是size是否已经超出现有的长度,如果超出了,调用kr()函数。这个kr()函数县创造一个双倍于现有数组长度的数组,通过System.arraycopy()函数完成了原来数组数据的复制,这就完成了一个扩容的过程。

    如果完美解答了你的问题,请采纳谢谢~

    点赞 评论
  • lambda-fk 2015-12-22 10:43

    第一个,有如下两个问题
    你这是在模拟线性表吧。
    针对上面的三处有如下答案:
    第一处:

       save = new int[save.length];
    

    1:在方法内部,变量没有初始化是不能使用的.
    2:使用 xxx = new xxx的时候,等式右边的运算式save默认是null,你这么用编译没问题。运行的时候就是NullPointException了。

    第二处:
    定义2个构造方法
    首先呢要写一个空参数的构造方法以防它被覆盖
    第二个构造方法是可以自己定义线性表的大小的。
    设置两个很符合线性表的构造需求。
    而且你后面的操作有一个不传值得构造,这个时候就要用这个没有参数的。

    第三处:
    完全是因为你自己定义的add方法内部有一个扩容的操作。也就是那个kr函数了。
    一旦超过内部存储save的容量就进行2倍的扩容。
    所以你不传值得时候默认大小是10,后面录入数据,超过10就扩容。
    所以你试验的时候传值与不传值都没有影响。

    如果满意还请采纳

    点赞 评论
  • 编程爱好者熊浪 2015-12-23 07:12

    引用类型没有实体化之前(也就是没有new之前)就是个null,null不能调用方法,也就是sava不能调用length方法,而第二个就是直接new有个int型数组而已。

    点赞 评论
  • 编程爱好者熊浪 2015-12-23 07:13

    而且你第一个没有int类型的构造方法,根本就不会进入你第一个的构造方法。

    点赞 评论

相关推荐 更多相似问题