前两天读Java核心卷的时候看到以下一个例子
基础是关于Java里面的数组拷贝,在Java里面的数组有两种复制方式,一种是下面例子中的直接赋值相等,此时staff数组与managers数组引用的是同一个数组,修改staff数组也就等同于修改managers数组。此时的拷贝相当于地址传递。
第二种是值传递,即只将对象数组的内容复制另一份给第二个数组。此时需要Arrays类的copyof方法。
在核心卷中有讲述:
看完后自己去实现了一下,发现出现了问题:
代码如下:
Dog.java
public class Dog {
private int age=1;
// public Dog(int age) {
// this.age=age;
// }
//
// public Dog() {
// this.age;
// }
public void setAge(int age) {
this.age=age;
}
void ShowAge() {
System.out.println("The dog is "+age);
}
}
Husky.java
public class Husky extends Dog{
private String color="black";
// public Husky(int age,String color) {
// super(age);
// this.color=color;
// }
public Husky() {
super();
}
public void setHusky(int age,String color) {
super.setAge(age);
this.color=color;
}
public void showColor() {
System.out.println("the dog's color is " +this.color);
}
}
Main.java
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Husky[] husky=new Husky[10];
for(Husky h:husky) {
h.setHusky(0,"blue");
}
// Dog[] dog=husky;
husky[0].ShowAge();
}
}
发现在测试例子中只是定义了数组,却并没有进行初始化。查了下,在书上没找到相关讲述,但是找到了下面的一个博文,讲得挺清楚的。
https://www.cnblogs.com/luosongchao/p/3298150.html
修改后代码:
Main.java
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Husky[] husky=new Husky[10];
for(Husky h:husky) {
h=new Husky();
h.setHusky(0,"blue");
}
//Dog[] dog=husky;
husky[0].ShowAge();
}
}
依旧报错,测试发现
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Husky[] husky=new Husky[10];
for(Husky h:husky) {
h=new Husky();
h.setHusky(0,"blue");
}
husky[0]=new Husky();
husky[0].setHusky(0,"blue");
//Dog[] dog=husky;
husky[0].ShowAge();
}
}
这样就有结果
个人理解for each是值传递,而不是地址。。
更改后还是用以下方法初始化数组
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Husky[] husky=new Husky[10];
for(int i=0;i<husky.length;i++) {
husky[i]=new Husky();
husky[i].setHusky(i,"blue");
}
//Dog[] dog=husky;
for(Husky h:husky) {
h.ShowAge();
h.showColor();
}
}
}
结果显示: