我无法理解为什么当我处理'Distribuzione'的实例时,它会修改另一个实例的参数'medie'。以下是我使用对象'Distribuzioni'的代码部分:
Distribuzione bernulliana = new Distribuzione(f, popolazione, f.getDefTabBernulli());
Distribuzione inBlocco = new Distribuzione(f, popolazione, f.getDefTabInBlocco());
f.getMediaCampBlocco().setText(String.valueOf(inBlocco.calcoloMedia(inBlocco.getMedie())));
f.getMediaCampRipetizione().setText(String.valueOf(bernulliana.calcoloMedia(bernulliana.getMedie())));
f.getVarCampBlocco().setText(String.valueOf(inBlocco.calcoloVarianza(inBlocco.getMedie())));
f.getVarCampRipetizione().setText(String.valueOf(bernulliana.calcoloVarianza(bernulliana.getMedie())));
inBlocco.mediaCampionaria(f.getDefTabMedInBlocco());
bernulliana.mediaCampionaria(f.getDefTabMedBernulli());
类'Distribuzione'的每个对象都在向量'medie'中,当我调用对象'inBlocco'的方法时,它们会修改对象'bernulliana'的属性'medie'。 似乎对象使用相同的向量'medie'。为什么?如何为“Distribuzione”的每个实例创建两个不同的向量?
以下是“Distribuzione”类的代码:
import java.util.Collections;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
public class Distribuzione {
public Vector<Float> getMedie() {
return medie;
}
private static Grafica f = null;
private static Vector<Float> medie;
private static DefaultTableModel tabella;
public Distribuzione(Grafica f, Vector<Float> popolazione, DefaultTableModel tabella){
this.f = f;
medie = new Vector<Float>();
this.tabella = tabella;
creaDistribuzione(f.getNcampione(), 0, popolazione, new Vector<Float>());
}
private static String vectorToString(Vector<Float> vector){
//istanzio una nuova stringa che inizializzo con una parentesi aperta
String stringaCampione = new String("(");
for(int x = 0; x < vector.size(); x++)
stringaCampione = stringaCampione.concat(Float.toString(vector.elementAt(x)).concat(", "));
stringaCampione = stringaCampione.substring(0, stringaCampione.length()-2);
stringaCampione = stringaCampione.concat(")");
return (stringaCampione);
}
public Float calcoloMedia(Vector<Float> vet){
float sum = 0;
for(int x = 0; x < vet.size(); x++) sum += vet.elementAt(x);
return sum / vet.size();
}
public Float calcoloVarianza(Vector<Float> vet){
float media = calcoloMedia(vet);
float varianza = 0;
for(int x = 0; x < vet.size(); x++) varianza += Math.pow(vet.elementAt(x) - media, 2);
return varianza / vet.size();
}
private void creaDistribuzione(int n, int primoElementoConsiderato, Vector<Float> popolazione, Vector<Float> combinazione){
if(n==0){
Vector<String> riga = new Vector<String>();
riga.add(vectorToString(combinazione));
int sum = 0;
for(int x = 0; x < combinazione.size(); x++) sum += combinazione.elementAt(x);
float media = (float) sum / combinazione.size();
riga.add(String.valueOf(media));
this.medie.add(media);
this.tabella.addRow(riga);
return;
}
for(int x = primoElementoConsiderato; x<popolazione.size();x++){
Vector<Float> aggiunta = new Vector<Float>(combinazione);
aggiunta.add(popolazione.elementAt(x));
if(this.tabella == f.getDefTabInBlocco()){
creaDistribuzione(n-1, x+1, popolazione, aggiunta);
}else{
creaDistribuzione(n-1, 0, popolazione, aggiunta);
}
}
}
public void mediaCampionaria(DefaultTableModel dafTabMed){
Float valore;
int count;
Collections.sort(this.medie);
while(this.medie.size() > 0){
Vector<String> riga = new Vector<String>();
count = 1;
valore = this.medie.remove(0);
while(this.medie.size() > 0 && this.medie.elementAt(0).equals(valore)){
this.medie.remove(0);
count++;
}
riga.add(String.valueOf(valore));
riga.add(String.valueOf(count));
dafTabMed.addRow(riga);
}
return;
}
}
答案 0 :(得分:0)
这是由'静态'克劳索勒造成的。 'static'表示一个是类的每个实例之间的公共属性,如果在其中一个实例中你修改了该属性,它也会在其他实例中被修改。