为何Java类中成员变量mf调用mediaFinal返回0,主类调用正常?
问题解析:为何Aluno类中
mf成员变量返回0,直接调用mediaFinal却能得到正确结果? 在以下Java代码中,Aluno类内定义的成员变量double mf = mediaFinal(nota1, nota2, nota3);返回值为0,但在主类QuestaoJoao中直接调用mediaFinal方法却能得到正确结果,请问这是为什么?
Aluno类代码
package emcasa; import java.util.Scanner; public class Aluno { Scanner scanner = new Scanner(System.in); String nome; String matricula; int nota1; int nota2; int nota3; double mediaFinal (double nota1, double nota2 , double nota3){ return (( nota1 * 2.5) + (nota2 * 2.5) + (nota3 * 2)) / 7 ; } double mf = mediaFinal(nota1, nota2, nota3); void fim () { if ( mf >= 7 ) { System.out.println("Aprovado!"); } else { System.out.println(nome + " precisa tirar " + ( 10 - mf) + " na prova final"); } } }
主类QuestaoJoao代码
package emcasa; import java.util.Scanner; public class QuestaoJoao { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Aluno a = new Aluno(); a.nome = "Rafael Arruda"; a.matricula = "2023.1REC0001"; a.nota1 = 5; a.nota2 = 6; a.nota3 = 10; //double mediaf = a.mediaFinal(a.nota1, a.nota2, a.nota3); System.out.println(a.mf); a.fim(); } }
原因分析
核心问题出在Java实例变量的初始化顺序:
- 当创建
Aluno对象a时,Java会先给所有实例变量分配默认值:nota1、nota2、nota3作为int类型,默认值是0;mf作为double类型,默认值是0.0。 - 接着按照变量在类中的声明顺序执行初始化表达式:
mf = mediaFinal(nota1, nota2, nota3)这行代码会在此时执行,传入的nota1、nota2、nota3还是默认的0,计算结果自然为0并赋值给mf。 - 之后你在主类中给
a.nota1、a.nota2、a.nota3赋值为5、6、10时,mf已经完成初始化,不会自动重新调用mediaFinal计算新值,所以mf始终是0。 - 而直接调用
a.mediaFinal(a.nota1, a.nota2, a.nota3)时,传入的是已经赋值后的有效成绩,因此能得到正确结果。
如果想要mf能正确反映后续赋值后的成绩,可以新增一个手动计算的方法:
void atualizarMedia() { mf = mediaFinal(nota1, nota2, nota3); }
然后在主类中赋值完成绩后调用a.atualizarMedia(),即可让mf更新为正确值。
内容的提问来源于stack exchange,提问作者Rafael Arruda
相关产品推荐
相关产品推荐

