对象上的方法修改其他对象的属性

时间:2013-11-30 17:32:46

标签: java object attributes runtime-error

我无法理解为什么当我处理'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;
}
}

1 个答案:

答案 0 :(得分:0)

这是由'静态'克劳索勒造成的。 'static'表示一个是类的每个实例之间的公共属性,如果在其中一个实例中你修改了该属性,它也会在其他实例中被修改。