黑马程序员技术交流社区

标题: 代码求助 [打印本页]

作者: 乔_博_文    时间: 2013-12-6 17:43
标题: 代码求助
本帖最后由 乔_博_文 于 2013-12-6 18:43 编辑

复制代码
我想要对学生数组内的学生按照总分数排序打印到控制台上,可是每次只能保留最后一个学生的分数,请大家帮我检查一下代码,我是不是哪个地方写错了?
  1. //一个学生类
  2. public class Student{
  3.         private static String name,
  4.                                                 EnglishScore,
  5.                                                 MathScore,
  6.                                                 ChineseScore;

  7.         //有参构造函数
  8.         public Student(String name, String englishScore, String mathScore,
  9.                         String chineseScore) {
  10.                 Student.name = name;
  11.                 Student.EnglishScore = englishScore;
  12.                 Student.MathScore = mathScore;
  13.                 Student.ChineseScore = chineseScore;
  14.         }
  15.         
  16.         //获取总分的方法
  17.         public int getAllScores(){
  18.                 int eScore = Integer.parseInt(EnglishScore);
  19.                 int mScore = Integer.parseInt(MathScore);
  20.                 int cScore = Integer.parseInt(ChineseScore);
  21.                 int allScores = eScore + mScore + cScore;
  22.                 return allScores;
  23.         }
  24.         
  25. //        //重写toString()方法
  26.         public String toString(){
  27.                 return name+" "+EnglishScore+" "+MathScore+" "+ChineseScore;
  28.         }
  29. }

  30. //一个操作学生的类
  31. public class OperateStu {
  32.         //主函数入口
  33.         public static void main(String[] args) {
  34.                 Student[] stus = new Student[5];
  35.                 stus[0] = new Student("LiLei","30","23","20");
  36.                 stus[1] = new Student("Hanmei","23","40","23");
  37.                 stus[2] = new Student("Jim","32","20","24");
  38.                 stus[3] = new Student("Lily","56","24","27");
  39.                 stus[4] = new Student("Lucy","34","67","28");

  40.                 for(int i=0; i<stus.length; i++){
  41.                         System.out.println(stus[i]);
  42.                 }
  43.                
  44.         }
  45.         
  46.         //按总分数排序方法
  47.         public static Student[] sortByScore(Student[] stus){
  48.                
  49.                 for(int i=0; i<stus.length; i++){
  50.                         for(int j=i; j<stus.length; j++){
  51.                                 int temp = 0;
  52.                                 int iScore = stus[i].getAllScores();
  53.                                 int jScore = stus[j].getAllScores();
  54.                                 
  55.                                 if(iScore > temp){
  56.                                         temp = iScore;
  57.                                         iScore = jScore;
  58.                                         jScore = temp;
  59.                                 }
  60.                         }
  61.                 }
  62.                 return stus;
  63.         }
  64. }
复制代码




作者: 乔_博_文    时间: 2013-12-6 17:45
本帖最后由 乔_博_文 于 2013-12-6 18:44 编辑

坐等指点啊,求关注。。。。
作者: 胡永城    时间: 2013-12-6 19:48
代码第03行。static修饰符,
被static修饰的成员变量和成员方法独立于该类的任何对象。
也就是说,它不依赖类特定的实例,被类的所有实例共享。
所以,你创建的五个实例,公用一组成员变量
作者: lichao    时间: 2013-12-6 20:17
  1. public class Student{
  2.         private static String name,
  3.                                                 EnglishScore,
  4.                                                 MathScore,
  5.                                                 ChineseScore;

  6.         //有参构造函数
  7.         public Student(String name, String englishScore, String mathScore,
  8.                         String chineseScore) {
  9.                 Student.name = name;
  10.                 Student.EnglishScore = englishScore;
  11.                 Student.MathScore = mathScore;
  12.                 Student.ChineseScore = chineseScore;
  13.         }
复制代码

你在这里将类的成员变量定义成静态的,成员变量就变成了共享数据,也就是说,不是每一个对象都有一组这样的数据了,而是所有的对象共同的拥有这些数据,一个对象改变数据,其他对象调用时,也是改变完的相应数据。
  1. Student[] stus = new Student[5];
  2.                 stus[0] = new Student("LiLei","30","23","20");//这里将 name设为LiLei,成绩分别是30,23,20;
  3.                 stus[1] = new Student("Hanmei","23","40","23");//这里又将name设为了Hanmei,成绩23,40,23;
  4.                 stus[2] = new Student("Jim","32","20","24");//................
  5.                 stus[3] = new Student("Lily","56","24","27");//...............
  6.                 stus[4] = new Student("Lucy","34","67","28");//.................
复制代码

最后也就是你将共有数据设置为name="Lucy",  EnglishScore="34",   MathScore,="67"  ChineseScore="28";
等你在输入时看到的也就是最后一次设置值(最后一次调用够着函数是给的值)了。
  1. private static String name,  EnglishScore,  MathScore,  ChineseScore;
复制代码
中的static删了就可以了。
作者: 乔_博_文    时间: 2013-12-6 20:18
胡永城 发表于 2013-12-6 19:48
代码第03行。static修饰符,
被static修饰的成员变量和成员方法独立于该类的任何对象。
也就是说,它不依赖 ...

{:3_46:}哈哈,你好厉害,佩服,很谢谢你啊。另外,OperateStu类中根据三门成绩总分在Student[]中进行排序的方法sortByScore()我也写错了,正确代码补上:
  1.         //按总分数排序方法
  2.         public static Student[] sortByScore(Student[] stus){
  3.                
  4.                 for(int i=0; i<stus.length; i++){
  5.                         for(int j=i; j<stus.length; j++){
  6.                                 Student s = new Student(null, null, null, null);
  7.                                 int iScore = stus[i].getAllScores();
  8.                                 int jScore = stus[j].getAllScores();
  9.                                
  10.                                 if(iScore > jScore){
  11.                                         s = stus[i];
  12.                                         stus[i] = stus[j];
  13.                                         stus[j] = s;
  14.                                 }
  15.                         }
  16.                 }
  17.                 return stus;
  18.         }
复制代码

作者: 胡永城    时间: 2013-12-6 20:43
乔_博_文 发表于 2013-12-6 20:18
哈哈,你好厉害,佩服,很谢谢你啊。另外,OperateStu类中根据三门成绩总分在Student[]中进行排 ...

不用谢,共同进步,那个,sortByScore方法并不需要返回值,因为数组是引用数据类型,利用内存地址指向数组实体,所以传递参数时传递的是内存地址引用,在方法中操作的是和原数组是一个数组实体。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2