Finding the highest and the lowest value

I have this assignment I gotta do. It looks good, except for the getHighest output and the getLowest result. Here’s my code:

KNW_CourseGradesV2 Class:

public class KNW_CourseGradesV2 implements KNW_Analyzable
{
  //Declare array variable
  private KNW_GradedActivity[] grades = new KNW_GradedActivity[4];
  String results;

  /**
   * Constructor
   * */
  public KNW_CourseGradesV2()
  {

  }

  public void setLab(KNW_GradedActivity lab)
  {
    grades[0] = lab;
  }

  public void setPassFailExam(KNW_GradedActivity pfe)
  {
    grades[1] = pfe;
  }

  public void setEssay(KNW_GradedActivity essay)
  {
    grades[2] = essay;
  }
  public void setFinalExam(KNW_FinalExam fe)
  {
    grades[3] = fe;
  }
  public void setTotalGrade(KNW_GradedActivity tg)
  {
    grades[4] = tg;
  }

  public String toString()
  {
    //Lay out all of the scores
    return "Lab Score: " + grades[0].getScore() +
      "tGrade: " + grades[0].getGrade() + 
      "nPass/Fail Exam: " + grades[1].getScore() +
      "tGrade: " + grades[1].getGrade() +
      "nEssay Score: " + grades[2].getScore() + 
      "tGrade: " + grades[2].getGrade() + 
      "nFinal Exam Score: " + grades[3].getScore() + 
      "tGrade: " + grades[3].getGrade();

  }

  //Find the average of the grades
  public double getAverage()
  {
    double sum = 0.0;
    double average = 0.0;
    double total = 0.0;

    //For loop to calc. the average
    for(int i =0; i<grades.length; i++)
    {
      total =+ grades[i].getScore();
      average = sum/grades.length;
    }
    return average;
  }

  public KNW_GradedActivity getHighest()
  {
    double highest = grades[0].getScore();

    for(int i = 0; i < grades.length;  i++)
    {
      if(grades[i].getScore() > highest)
      {
        highest = grades[i].getScore();
      }
    }

    //Created KNW_GradedActivity object to bring the highest number
    //into the setScore method so it can be a double
    KNW_GradedActivity gaH =  new KNW_GradedActivity();
    gaH.setScore(highest);
    return gaH;
  }

  public KNW_GradedActivity getLowest()
  {
    double lowest = grades[0].getScore();

    for(int i = 0; i < grades.length; i++)
    {
      if(grades[i].getScore() > lowest)
      {
        lowest = grades[i].getScore();
      }
    }
    //Samething here, just doing it for the lowest number
    KNW_GradedActivity gaL =  new KNW_GradedActivity();
    gaL.setScore(lowest);
    return gaL;

  }
}

KNW_Analyzable Class:

public interface KNW_Analyzable
{
  double getAverage();
  KNW_GradedActivity getHighest();
  KNW_GradedActivity getLowest();
}

KNW_GradedActivity Class:

public class KNW_GradedActivity
{
   private double score;  // Numeric score

   /**
      The setScore method sets the score field.
      @param s The value to store in score.
   */

   public void setScore(double s)
   {
      score = s;
   }

   /**
      The getScore method returns the score.
      @return The value stored in the score field.
   */

   public double getScore()
   {
      return score;
   }

   /**
      The getGrade method returns a letter grade
      determined from the score field.
      @return The letter grade.
   */

   public char getGrade()
   {
      char letterGrade;

      if (score >= 90)
         letterGrade = 'A';
      else if (score >= 80)
         letterGrade = 'B';
      else if (score >= 70)
         letterGrade = 'C';
      else if (score >= 60)
         letterGrade = 'D';
      else
         letterGrade = 'F';

      return letterGrade;
   }
}

And here is the output I get. I will just show the problem I am facing, won’t show all of the output.

Output:

Average: 0.0
Highest: KNW_GradedActivity@565d3fa7
Lowest: KNW_GradedActivity@655c4395> 

I have been trying for about a week to figure this out and find what is happening, and I can’t seem to find it. Maybe you guys can help me out, I would appreciate it!