廖雪峰Java练习——字符串和编码篇其中的一个小例子,主要是要保证外面的修改不影响里面,但函数参数又必须为引用类型时。需要重新分配空间,逐一赋值。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] scores = new int[] { 88, 77, 51, 66 };
Score s = new Score(scores);
s.printScores();
scores[2] = 99;
s.printScores();
}
}
class Score {
private int[] scores;
public Score(int[] scores) {
//未修改前,引用类型参数
this.scores = scores;
}
public void printScores() {
System.out.println(Arrays.toString(scores));
}
}
上面的代码设计了一个Score
类保存一组学生的成绩
运行结果是:
[88, 77, 51, 66]
[88, 77, 99, 66]
观察两次输出,由于Score
内部直接引用了外部传入的int[]
数组,这会造成外部代码对int[]
数组的修改,影响到Score
类的字段。如果外部代码不可信,这就会造成安全隐患。
请修复Score
的构造方法,使得外部代码对数组的修改不影响Score
实例的int[]
字段。
public class Main {
public static void main(String[] args) {
int[] scores = new int[] { 88, 77, 51, 66 };
Score s = new Score(scores);
s.printScores();
scores[2] = 99;
s.printScores();
}
}
class Score {
private int[] scores;
public Score(int[] scores) {
//为类中的scores重新分配空间
this.scores = new int[scores.length];
//逐一赋值
for(int i = 0;i<scores.length;i++)
this.scores[i] = scores[i];
}
public void printScores() {
System.out.println(Arrays.toString(scores));
}
}
运行结果是:
[88, 77, 51, 66]
[88, 77, 51, 66]