write的返回值Java引⽤数组作为返回值_java11:数组作为函数参数,数组
做为函数返回值
1 数组作为参数
我们可以将数组作为参数,传⼊到函数中,其实就像我们main函数中 public void main(String [] args){};就是⽤数组作为函数参数;
⼜如,
publicclassArrayPar
{
publicstaticvoidprintArray(int[] array)
{
for(inti=0;i
System.out.print(array[i]+”  “);
}
}
我们可以这样调⽤ ArrayPar.printt(new int[ ]{3,2, 5,67});调⽤数组
这⾥的new int[ ]{3,2,5,67};他也是⼀种创建数组的⽅法,只是这种⽅法创建出来的数组是没有名字的,所以叫匿名数组。很多时候在只使⽤⼀次的时候可以使⽤匿名数组的⽅法法,类似的还有匿名类。
Javauses pass-by-value to pass arguments to a method. There are important differences
between passing the values of variables of primitive data types and passing arrays.
■ For an argument of a primitive type, the argument’s value is passed.
■ For an argument of an array type, the value of the argument is a reference to an array;
this reference value is passed to the method. Semantically, it can be best described as
pass-by-sharing, i.e., the array in the method is the same as the array being passed.
So if you change the array in the method, you will see the change outside the
method.
java 使⽤值传参(pass_by_value)的⽅式来传递函数参数,只是值传递⽅式在处理原始数据类型参数与引⽤类型参数时候有不同,如果⼀个参数是原始数据类型,那么参数变量的值传递进去。如果是引⽤类型,是传进了引⽤变量的值(也就是说,只是将指向数据的引⽤的值给传进去了,也就是被调⽤的函数新建的空间放的是这个引⽤的值,那么也就是也指向了数组存在的内存),所以同样是值传递,引⽤类型的传⼊的当然是引⽤变量的值,指向了同⼀数组,那么函数内对数组进⾏的修改在函数退出后依旧是有效的。
例⼦:
publicclassArrayPar
{
publicstaticvoidmain(String [] args)
{
intx=1;
inty[]={1,2,3};
change(x,y);
System.out.println(“x=”+x+“,y[0]=”+y[0]);
}
publicstaticvoidchange(intnum,int[] array)
{
num=100;
array[0]=100;
}
}
图形表⽰:
这⾥同时注意⼀下,当我们⽤new 以及malloc这些的内存空间是在堆上heap,⽽像我们被调⽤的函数中使⽤的这些变量等在栈上。在调⽤changes时候,x的值被传⼊,在被调⽤的函数中重新开辟⼀个空间来放这个基本数据类型参数,但是int [ ] y ,将y传⼊其实就是传⼊了引⽤,在被调⽤的函数的栈上只会开辟⼀个空间来存放这个引⽤,所以被调⽤的函数与调⽤者 中两个引⽤指向堆上同⼀块内存。
2 数组做为函数返回值
publicstaticint[] reverse(int[] array)
{
int[] result=newint[array.length]
for(inti=0;i
{
result[i]=array[lenght-i];
}
returnresult;
}
在将数组作为函数返回值时候如上红⾊标出的,就是在函数名字前加上返回值类型是int [ ] 表⽰返回⼀个int型数组,在函数体内最后返回是result这样的函数引⽤。
Case Study: Counting the Occurrences of Each Letter
write a program to count the occurrences of each letter in an random array of  lower  characters.
那么我们可以怎么做呢?
1)⾸先是要产⽣⼀个随机char数组  creatArray();(是否记得前边说过产⽣[a,a+b)之间的⼀个随机数 为  a+Math.random()*b,是否记得我们创建过获取任意字符的⼀个类?)
2) 创建⼀个数组 int [ ] count,长度26,准备来存放各个字母的计数
3)对数组进⾏循环 , 每读取⼀个字母ch,则 count[ch-‘a’]++;
classRandomChar
{
publicstaticchargetRandomChar(charch1,charch2)
return(char)(ch1+Math.random()*(ch2-ch1+1));
}
publicstaticchargetLowerCaseLetter()
{
returngetRandomChar(‘a’,‘z’);
}
publicstaticchargetUpperCaseLetter()
{
returngetRandomChar(‘A’,‘Z’);
}
publicstaticchargetDigitalLetter()
{
returngetRandomChar(‘0’,‘9’);
}
publicstaticchargetRandomLetter()
{
returngetRandomChar(‘\u0000’,‘\uFFFF’);
}
}
publicclassCountOccur
{
publicstaticvoidmain(String [] args)
{
char[] array=CreateArray();
int[] count =newint[26];
for(inti=0;i
{
count[array[i]-‘a’]++;
}
for(inti=0;i
{
System.out.print((char)(i+‘a’)+“: “+count[i]+”    “); if((i+1)%10==0) System.out.println();
}
//产⽣⼀个100个元素的⼩写随机数组
publicstaticchar[] CreateArray()
{
char[] a=newchar[100];
for(inti=0;i
{
a[i]=LowerCaseLetter();
}
returna;
}
}
3 可变长度参数列表
You can pass a variable number of arguments of the same type to a method. The parameter in
the method is declared as follows:
typeName… parameterName
In the method declaration, you specify the type followed by an ellipsis Only one vari-
able-length parameter may be specified in a method, and this parameter must be the last para-
meter. Any regular parameters must precede it.
Java treats a variable-length parameter as an array. You can pass an array or a variable
number of arguments to a variable-length parameter.When invoking a method with a variable
number of arguments, Java creates an array and passes the arguments to it
我们可以传递类型相同,但个数可以变化的参数到函数中,如果有这个需求的话,这时候我们只需要在形式参数中使⽤ typename…parameterName就可以达到这个⽬的,要注意,在这⾥声明的该变长参数必须是最后⼀个参数,任何常规参数必须在他之前,也就是说你可以有 MethodName(char b, double c, int … nums) 这样的形式即int … nums必须在最后⼀个位置,你不能将int … nums 声明在参数参数列表的⾮最后位置。
java将可变长参数当做数组对待。可以将⼀个数组或者可的参数个数传递给该参数(注意,我们这⾥说该参数就是 typeName …parameterName这整个结构),⽆论哪种形式,java会创建⼀个数组并把参数传给他,注意这⾥体会原⽂说的When invoking a method with a variable
number of arguments, java Create an array and passes the arguments to it,也就是说,如果你是传⼊⼏个变长的变量,那么在调⽤时候java先将创建⼀个数组来装这⼏个实际参数,然后再执⾏调⽤的函数,如果本⾝我们传⼊⼀个数组,其实他并不会创建⼀个新的数组来装,还是⼀样像上⾯指向了已经分配的数组空间,所以在被调⽤的函数中对数组的改变在退出时候还是有效的(这是我⽤例⼦试了下体会到的)
publicclassVariablePar
{
publicstaticvoidmain(String [] args)
intarray[]={1,4,7,2,0};
System.out.println(“max=”+findMax(array));
ifChange(array);
System.out.println(“array[0]=”+array[0]);
ifChange(1,45,33);
}
publicstaticintfindMax(int… nums)
{
if(nums.length==0)
{
System.out.println(“No argumment passed”);
return–1;
}
intmax=nums[0];
for(inti=1;i
{
if(max
}
returnmax;
}
//测试这⾥究竟是新创建⼀个数组还是相当于把引⽤传进来⽽已
publicstaticvoidifChange(int… nums)
{
nums[0]=100;
}
}
这⾥,我们从findMax中看到,他不⽤先说明 什么就可以直接使⽤nums.lenght 说明确实java是完全将这类型的参数当做⼀个数组来处理了,⼆在ifChange中,我们看到输出的是array[0]=100,说明我们在调⽤ifChange(array)时候并不是重新创建⼀个新的数组,⽽是还是⼀样像前边的传⼊了引⽤,被调⽤者还是指向了相同的数组空间。但是在ifChage(1,45,33)这个调⽤时候,java就会先new int[ ]{1,45,33}这样,然后形参nums再指向它,其实这样返回后应该就不会改变了1的值吧?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。