当我创建类的数组时,前一个类的每个元素都被下一个类元素覆盖。
我的班级:
public class Perceptron2 {
public double prog=0.01;
public double wagi[]=new double[35];
public double blad;
public double stala=0.001;
public Perceptron2(double prog, double[] wagi, double blad) {
this.prog = prog;
this.wagi = wagi;
this.blad = blad;
stala=0.001;
}
public double getProg() {
return prog;
}
public void setProg(double prog) {
this.prog = prog;
}
public double[] getWagi() {
return wagi;
}
public void setWagi(double[] wagi) {
this.wagi = wagi;
}
public double getBlad() {
return blad;
}
public void setBlad(double blad) {
this.blad = blad;
}
public double getStala() {
return stala;
}
public void setStala(double stala) {
this.stala = stala;
}
}
以下代码
public class runn {
public static void main(String[] args) {
Random random = new Random();
double [] wagi = new double[35];
double prog = 0.01;
Perceptron2[] p = new Perceptron2[10];
System.out.println(p.length);
for (int i=0;i<p.length;i++)
{
for(int j=0; j<35; j++)
{
wagi[j]=random.nextDouble()*0.1;
}
System.out.println(i+" "+wagi[1]);
p[i] = new Perceptron2 (prog, wagi , 0.01);
}
System.out.println(p[3].wagi[1]);
System.out.println(p[4].wagi[1]);
}
}
例如p [3] .wagi [1]和p [4] .wagi [1]相等。如何使它们与众不同?
答案 0 :(得分:2)
对象(包括数组)在Java中作为指针传递,而不是作为其内容的副本传递。
您需要为外循环的每次迭代创建一个wagi
的新实例。
实际上,你将wagi
填入每个Perceptron2
(我从未想过要写的另一句话)。
所以要么
for (int i=0;i<p.length;i++){
double [] wagi = new double[35];
for(int j=0; j<35; j++) {
或在Perceptron2构造函数中制作数组的防御副本:
this.wagi = Arrays.copyOf(wagi, wagi.length);
答案 1 :(得分:0)
进入main方法,更改此行:
p[i] = new Perceptron2 (prog, new double[35], 0.01);
把它放在循环的开头。在循环中,通过执行以下操作将值设置在数组中的正确位置:
p[i].wagi[j]=random.nextDouble()*0.1;
您的问题是由于每个Perceptron对象使用相同的wagi实例。
答案 2 :(得分:0)
在&#34; runn.class&#34;中删除此行,
double [] wagi = new double[35];
并将其置于外部for循环之下
for (int i=0;i<p.length;i++)
{
double [] wagi = new double[35];
for(int j=0; j<35; j++)
{
wagi[j]=random.nextDouble()*0.1;
}
System.out.println(i+" "+wagi[1]);
p[i] = new Perceptron2 (prog, wagi , 0.01);
}