调用inserimentoVoto方法向Studente对象列表添加元素时数据被覆盖
解决每次调用inserimentoVoto时成绩被覆盖的问题
嘿,我刚看了你的问题,你遇到的这个覆盖问题其实很常见,尤其是刚接触Java集合的时候😉 咱们一步步来排查和解决:
核心问题分析
你说每次调用inserimentoVoto方法,Studente里的列表元素都会被覆盖,大概率是下面两个原因之一:
- 你的
Studente类里没有用列表存储成绩,而是用了单个Voto对象变量(比如private Voto voto;),每次调用方法都会替换这个变量的引用,自然就覆盖了之前的数据。 - 即使有列表,但你没有正确往列表里添加新元素,反而可能每次都重新初始化列表,或者直接替换了列表本身。
第一步:修正Studente类的结构
首先确保Studente类里有一个初始化好的列表来存储多个成绩,代码示例如下:
import java.util.ArrayList; import java.util.List; public class Studente { // 初始化一个空的成绩列表,避免空指针异常 private List<Voto> votiList = new ArrayList<>(); // 提供获取列表的方法,方便外部添加元素 public List<Voto> getVotiList() { return votiList; } }
第二步:修正inserimentoVoto方法
接下来修改inserimentoVoto方法,确保你把新创建的Voto对象添加到Studente的列表中,而不是覆盖某个单一变量:
import java.util.Scanner; public class Gestione { private Scanner scanner = new Scanner(System.in); public void inserimentoVoto(Studente s) { Voto v = new Voto(); System.out.println("Insert value"); v.setVoto(scanner.next()); System.out.println("Insert subject name"); v.setMateria(scanner.next()); // 假设Voto类有setMateria方法来设置科目 // 关键:把新创建的成绩对象添加到学生的成绩列表里 s.getVotiList().add(v); } }
第三步:验证效果
在main方法里多次调用inserimentoVoto,然后打印学生的成绩列表,确认所有成绩都被保留:
public class Run { public static void main(String[] args) { Gestione g = new Gestione(); Studente s = new Studente(); // 添加两次成绩 g.inserimentoVoto(s); g.inserimentoVoto(s); // 遍历打印所有成绩 for (Voto voto : s.getVotiList()) { System.out.println("科目:" + voto.getMateria() + ",成绩:" + voto.getVoto()); } } }
为什么之前会覆盖?
如果之前你的Studente类里是单个Voto变量,每次调用inserimentoVoto时用setVoto方法赋值,那新的Voto对象会替换掉旧的引用,就会出现覆盖的情况。而用列表的add方法是往集合里追加新元素,不会影响已有的数据。
内容的提问来源于stack exchange,提问作者Matteo Bruni
相关产品推荐
相关产品推荐

