Salve ho un codice così composto:
codice:
public class StagePrincipale extends Stage {
    
    private final int DIM;
    Circle[][] matrix;
    
    public StagePrincipale(int righe){
        
        DIM=righe;
        matrix=new Circle[righe][righe];
        GridPane g=new GridPane();
        
        
        for(int i=0;i<righe;i++){
            for(int j=0;j<righe;j++){
                
                Circle c=new Circle(25);
                c.setOpacity(0);
                g.add(c, j , i );
                matrix[j][i]=c;
            }
        }
        
        HBox togglegroup=new HBox();//contenitore bottoni superiori
        ToggleGroup algoritmi=new ToggleGroup();
        ToggleButton alg1 = new ToggleButton("alg1");
        ToggleButton alg2 = new ToggleButton("alg2");
        ToggleButton alg3 = new ToggleButton("alg3");   
        alg1.setToggleGroup(algoritmi);
        alg1.setId("1");
        alg2.setToggleGroup(algoritmi);
        alg2.setId("2");
        alg3.setToggleGroup(algoritmi);
        alg3.setId("3");
        togglegroup.setAlignment(Pos.CENTER);
        togglegroup.setSpacing(5);
        togglegroup.getChildren().addAll(alg1,alg2,alg3);
        togglegroup.setPadding (new Insets (10, 0, 10, 0)); //spazia i bottoni sopra e sotto
        algoritmi.selectToggle(alg1);//di default il selezionato è l'1
        
        
        final Button step = new Button("step");
        step.setMinWidth(80);
        
        step.setOnAction(new EventHandler<ActionEvent>() {
            
            @Override
            public void handle(ActionEvent event) {
                ToggleButton a=(ToggleButton) algoritmi.getSelectedToggle();
                switch(a.getId()){
                    case "1":new Algoritmo1(matrix);
                        break;
                    case "2":new Algoritmo2(matrix);
                        break;
                    case "3":new Algoritmo3(matrix);
                        break;
                }
            }
        });
    
    
    }
    
}


public class Algoritmo1 {
    public Algoritmo1(Circle[][] matrix){
        int dim=matrix.length;
        Circle[][] matricecopia=new Circle[dim][dim];
        
        for(int i=0;i<dim;i++){
                    for(int j=0;j<dim;j++){
                        matricecopia[i][j]=new Circle(25);
                        
                        if(i!=0 && j!=dim-1)
                            matricecopia[i][j]=matrix[i-1][j+1];
                        else
                            matricecopia[i][j].setOpacity(0);
                    }
        }


        matrix=matricecopia;
        }
    }
c'è sicuramente qualcosa che manca perchè ho tagliato buona parte del codice per renderlo più breve ma alla mia domanda non dovrebbe servire. Tutto mi funziona e Algoritmo1 fa quello che voglio che faccia infatti alla fine con l'ultimo comando "matrix=matricecopia" stampando matrix questo ha i valori che voglio. Il problema è che appena ristampo il matrix sotto allo switch nella prima classe ritorna com'era prima. La mia domanda è matrix non è passato per riferimento e quindi dovrebbe cambiare? Se sbaglio qualcosa come posso risolvere questa cosa?