java 数组

帮忙看下 下面的代码

public class printArray {

public static void printArray(int[] array){
System.out.print('<');
for(int i=0;i<array.length;i++){
System.out.print(array[i]);
if((i+1)<array.length){
System.out.print(", ");
}
}
System.out.print('>');
}

}

public class TestArrays {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int array2[];
int array1[]={2,3,5,7,11,13,17,19};
array2=array1;
for(int i=0;i<8;i++){
if(i%2==0){
array2[i]=i;
}
}
printArray.printArray(array1);

}

}

为什么输入的array1数组是
<0, 3, 2, 7, 4, 13, 6, 19>
而不是
<2, 3, 5, 7, 11, 13, 17, 19>

修改了array2为什么array1发生了变化 谢谢!
还有就是编写printArray类时 在方法printArray(int[] array)下面有黄线提示 This method has a constructor name 这是怎么回事啊 讲明白了追分

对与你的这个程序算法也没什么复杂的。我也就不用解释了。关于你提出的问题我说一下:

1. 修改array2时array1当然要发生变化了。之所以你对这个有疑问,是你对java中的数据类型还没理解。在java中有两中数据类型,值类型和引用类型。像一些基本的数据类型如:int ,float,double,byte等都是值类型,而String,还有‘类’都是引用类型,其中数组也是引用类型。

array2=array1; 这句话就是把array1的首地址赋值给array2,此时array1和array2所指向的是同一块类存单元。array2对这块内存的修改也会反映在array1上了。

同样的道理,当向一个函数传值时,如果函数的形参是一个值类型的数据,则在传参数时把实参的内容拷贝一份放到形参里面,之后形参在函数相当于一个局部变量,它在函数中做的一切动作都不会影响到实参的内容。

而如果函数的形参是一个引用类型,当向它传值时,就是把实参的地址传给形参,而不是把它的内容传给形参。这时候形参有了实际参数的内存地址,那么在函数中形参的改变也会反应到实际参数中来,你可以做下列实验:

//test1.java

class test1
{
public static void main(String [] args)
{
int [] b={9,8,7,6,5,4,3,2,1,0};
int c=10;
test2.amend(b);
test2.print(b);//输出:0 1 2 3 4 5 6 7 8 9说明b的值被改了。
System.out.println(""); //换行
test2.amend1(c);
System.out.println(c); //输出:10 说明c的值并没有被改为20
}
}

class test2
{
public static void amend(int [] a) //引用传递
{
for(int i=0;i<a.length;i++)
a[i]=i;
}
public static void print(int [] a)
{
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
public static void amend1(int a)
{
a=20;
}
}

引用就相当于c语言里面的指针,不知道你学过c语言没有。如果学过,就应该很容易理解的。java中没有指针的概念,在java中是不允许直接操作变量的内存地址的。

int a=10;
int b=a; //这里仅仅是把a的值,也就是10拷贝一份再赋给变量b。a和b在内存上是没有任何联系的。

如果Student是一个类,那么:

Student stu1=new Student(); //学生1
Student stu2=stu1; //把学生1的引用赋给学生2这时候stu2的操作就会反映到stu1上。

参考下面的例子:

class test1
{
public static void main(String [] args)
{
Student stu1=new Student("张三",18); //建立一个学生变量,并且初始化为"张三" ,18岁 Student stu2=stu1; //把学生stu1的引用赋给学生stu2
stu1.print(); //输出:名字:张三 年龄:18
stu2.print(); //输出:名字:张三 年龄:18
//把学生stu2的名字改成"李四" 20岁
stu2.name="李四";
stu2.age=20;

stu1.print(); //输出名字:李四 年龄:20
stu2.print(); //输出名字:李四 年龄:20
}
}

class Student
{
String name; //学生的名字
int age; //学生的年龄
Student(String name,int age)
{
this.name=name; //给名字赋值
this.age=age; //给年龄赋值
}
void print() //输出学生的名字和年龄
{
System.out.println("名字:"+name+" 年龄:"+age);
}
}

//可以看到,我改了stu2的名字和年龄,但是stu1学生的名字和年龄也改了。这就是引用的效果。

2.第二个问题:This method has a constructor name

这句话的意思说,"这个方法有一个构造函数名字"
为什么会出现这样的提示呢?是因为你定义的类的名字是:printArray,而这个类默认有一个构造函数它的名字是和类名相同的。而且构造函数是没有返回值的。

而你在类里面有定义了一个public 的静态的成员方法。

它的名字和你的构造函数的名字是一样的。如果你把static void 都去掉的话,也就是说变成这种形式:

public printArray(int [] array)
{
}

那么这时系统就会把它当作是类的构造函数了,但是你这里函数的形式是:

public static void printArray(int [] array)
{
}

因为有返回值所以,系统把它当作是类的成员函数了,但是它又是与构造函数的名字相同的,所以就出现了你上面的警告了。虽然没有报错,但还是希望类的成员函数不要与类的名字相同,以免带来不必要的麻烦。

我的回答也只有这些了,相信你对java里面的数据类型也有了一个了解了吧,如果还有不懂的话,上百度去吧。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-03-15
array2=array1这是对象的引用。所以,修改array2就是修改array1,同理修改array1也就是修改array2。他们的值永远都是一样的。
This method has a constructor name 这是说,你调用的方法名跟该类的构造方法名是一样的
相似回答