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

问题描述

小白问题: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型数组而已。

时间: 2023-09-26

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

java中需要统计子串在字符串中出现多少次。 麻烦大家帮我详细解释一下那串代码是什么意思。谢谢了!

问题描述 java中需要统计子串在字符串中出现多少次. 麻烦大家帮我详细解释一下那串代码是什么意思.谢谢了! String str="abcjavadefjavadddjava"; String newStr="java"; int count=0; int i=0;//出现的下标 while(str.indexOf(newStr,i)>=0 && i<=str.length()){ count++; i = str.indexOf(ne

参数识别-java小白又来提问啦,形参实参的辨别。

问题描述 java小白又来提问啦,形参实参的辨别. 代码如下: public class Test { public static void main(String[] args){ int max= 0; max(1,2,max);//此处括号里的1,2,max是实参 System.out.println(max);//这个语句里的max也是实参,这个理解是否正确? } public static void max(int n1,int n2,int max){//方法签名里的max是形参 i

减少使用Java应用服务器,迎接Docker容器

本文讲的是减少使用Java应用服务器,迎接Docker容器,[编者的话]随着Docker的发展,越来越多的应用开发者开始使用Docker.James Strachan写了一篇有关Java开发者如何使用Docker进行轻量级快速开发的文章.他告诉我们,使用Docker和服务发现的机制,可以有效减轻Java运维人员的负担,进行项目的快速启动和持续迭代. 多年来,Java生态系统一直在使用应用服务器.Java应用服务器(如Servlet Engine.JEE或OSGi)是一个可以作为最小部署单元(如j

java小白遇到了问题,问题如下

问题描述 java小白遇到了问题,问题如下 想做一个代码统计工具(可是简单的显示代码的量,注释量,空行),运用正则表达式,GUI ,IO流来完成的,我是有一点思路的,可是完成起来遇到了问题!有谁懂的,或者有源代码的帮助我下,谢谢了!PS:不要现成的工具 解决方案 问题提的有点大,不好回答. 有点思路的话,思路是什么,是不是可以先贴出来看看?这样的工具很多,开源的也不少,是不是可以先去看看别人怎么做的?

java小白求解,下面的代码是按照书上的例子抄下来的,不明白为什么报错。

问题描述 java小白求解,下面的代码是按照书上的例子抄下来的,不明白为什么报错. 代码如下:主要问题就是报错的地方:已经用注释吧报错贴上:还看不懂这个报错,求大神帮助:package Calendar; import java.util.Scanner; public class Calendar { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println(

用java实现DB2的自定义函数

函数 我们知道,在DB2中提供的函数有限.在笔者的实际工作中就遇到了这个问题.所以我们在用到DB2的项目中,很多时候需要自己定义函数.好在DB2也提供了自定义函数的功能.下面笔者就某个项目来说.用java来实现DB2自定义函数,首先要写出函数的java实现代码import COM.ibm.db2.app.*; public class DB2Udf extends UDF{ /** * */ public DB2Udf() { } /** * 返回两个数值的按位与操作结果 * @param nu

JAVA加密解密:自定义类加载器应用

最近在研究JAVA CLASS LOADING技术,已实现了一个自定义的加载器.对目前自定义加载器的应用,还在探讨中.下面是自定义的CLASSLOADER在JAVA加密解密方面的一些研究. JAVA安全 JAVA是解释执行的语言,对于不同的操作平台都有相应的JVM对字节码文件进行解释执行.而这个字节码文件,也就是我们平时所看到的每一个.class文件. 这是我们大家都知道的常识,也就是由.java文件,经过编译器编译,变成JVM所能解释的.class文件. 而这个过程,在现在公开的网络技术中,利

java小白试着分析了一下这个代码。求大神帮忙看一下正不正确;代码如下:

问题描述 java小白试着分析了一下这个代码.求大神帮忙看一下正不正确:代码如下: public class Test{ private static int i = 0; private static int j = 0; public static void main(String[] args) { int i = 2;//i之所以是2 而不是0 是因为 就近原则 int k = 3; { int j = 3; System.out.println("i+j ist"+i+&qu

java小白又来烦大家啦,这次是带参方法的调用问题:代码和问题如下:

问题描述 java小白又来烦大家啦,这次是带参方法的调用问题:代码和问题如下: import java.util.Scanner; class Rilitou { static Scanner in = new Scanner(System.in); public static void rilitou(int year,int month){ /*System.out.println("请输入您想查询的年份:"); year = in.nextInt(); System.out.pr