Spring Semester 2002

Lab Notes Four: Classes and objects.
1. Here's a set of practice problems.

2. Here's a set of warm-up questions.

3. Here are the answers to the warm-up questions.

4. Here's a broad overview of the programs to be implemented.

5. Here are the solutions.

Below you have your LAB ASSIGNMENT (#4). Next time you are expected to:

• Have all the steps below done and understood (we develop a program below).

• Look over and solve (or learn the posted solutions to) the review exercises and problems from Chapter Three (pp. 134-137). The texts and the solutions to all of these problems are posted above (steps 1, 2, 3, 5 above).

• Read and understand and be able to explain the crux of the slides presented at step 4 above (the part that talks about Kanamits and the Twilight Zone). Why do you think the slides talk about, open up, and end in reference to Kanamits (whatever they are). Hint: abstraction.

Let's go through the complete and annotated development of a solution to a problem.

(This is problem 3.7 from the book, page 137).

1. Let's implement a class `Student`.

```frilled.cs.indiana.edu%pico Student.java
frilled.cs.indiana.edu%cat Student.java
public class Student {

}
frilled.cs.indiana.edu%javac Student.java
frilled.cs.indiana.edu%ls -ld Student*
-rw-------   1 dgerman       188 Feb  1 08:18 Student.class
-rw-------   1 dgerman        27 Feb  1 08:17 Student.java
frilled.cs.indiana.edu%```
2. Looks like we're done. Can we test it?

3. We need a tester class with a `main` method.

```frilled.cs.indiana.edu%pico StudentTest.java
frilled.cs.indiana.edu%cat StudentTest.java
public class StudentTest {
public static void main(String[] args) {
Student a = new Student();
}
}
frilled.cs.indiana.edu%javac StudentTest.java
frilled.cs.indiana.edu%ls -ld Student*
-rw-------   1 dgerman       188 Feb  1 08:18 Student.class
-rw-------   1 dgerman        27 Feb  1 08:17 Student.java
-rw-------   1 dgerman       297 Feb  1 08:21 StudentTest.class
-rw-------   1 dgerman       110 Feb  1 08:21 StudentTest.java
frilled.cs.indiana.edu%```
4. Can we test it?

5. We can run `StudentTest` but we get no output.

```frilled.cs.indiana.edu%java StudentTest
frilled.cs.indiana.edu%```
6. Does it matter?

7. Do we know what happens inside?

8. The `Student` class is empty. `Student` objects are amorphous.

9. I see... Let's make it such each `Student` have (at least) a name, then.

```frilled.cs.indiana.edu%pico Student.java
frilled.cs.indiana.edu%cat Student.java
public class Student {
private String name;

}
frilled.cs.indiana.edu%```
10. What's the meaning of `private`?

11. It means that to know the name of a `Student` you need to ask the `Student` what its name is.

12. I don't feel very comfortable using he or she for a `Student object. `

``` 13. Fine. How do you inquire about a Student's name? ```

``` 14. We need to add this functionality to class Student first, then make use of it. ```

``` 15. Here's a more comprehensive blueprint of Student objects. ```

``` ```

``````frilled.cs.indiana.edu%pico Student.java
frilled.cs.indiana.edu%cat Student.java
public class Student {
private String name;

}
frilled.cs.indiana.edu%pico Student.java
frilled.cs.indiana.edu%cat Student.java
public class Student {
private String name;

public String whatsYourName () {
return name;
}

}
frilled.cs.indiana.edu%``````
``` 16. What does it mean for the whatsYourName method to be public? 17. It means you can ask a Student "What's your name?" 18. What if we make it private? 19. Then we can never ask. 20. How do we create a Student? 21. Just invoke new the way we did in the tester's main. 22. And if we invoke it, how do things get created, and initialized. 23. Well, a default no-arg constructor is present, but we don't see it. 24. I think we should add it, so that we not forget that it's there. frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } } frilled.cs.indiana.edu% 25. It's empty, but it gets called at creation time. 26. Can we create a Student with an initial name? 27. Only if we provide that type of constructor. 28. To be able to create a Student with an initial name we need to be able to initialize the name of any Student (at creation time) with an actual name (to be specified when we create the Student). 29. We're looking for something like this: new Student("Larry Johnson") 30. Let's provide class Student with that capability. frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } Student(String givenName) { name = givenName; } } frilled.cs.indiana.edu% 31. Let's enhance our tester's main to exploit the new features. frilled.cs.indiana.edu%pico StudentTest.java frilled.cs.indiana.edu%cat StudentTest.java public class StudentTest { public static void main(String[] args) { Student a = new Student("Larry"); Student b = new Student("Michael"); String answer; System.out.print("Printing the name of the first student: "); answer = a.whatsYourName(); System.out.println(answer); System.out.print("Printing the name of the second student: "); answer = b.whatsYourName(); System.out.println(answer); } } frilled.cs.indiana.edu%javac StudentTest.java frilled.cs.indiana.edu%java StudentTest Printing the name of the first student: Larry Printing the name of the second student: Michael frilled.cs.indiana.edu% 32. Great! What else were we supposed to do? 33. Let's enable the Students to keep track of their scores. frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } Student(String givenName) { name = givenName; } void addQuizScore(int newScore) { totalScore = totalScore + newScore; } private int totalScore; } frilled.cs.indiana.edu% 34. I see... If there's a new score to be added to the total score for a student then we just add it to the totalScore as if it were an amount to be placed as deposit over a current, given, existing balance. 35. Yes, so you need to define an instance variable totalScore (which will keep the cumulative score for the Student) and use it as if it were a balance. 36. This way a Student is like a BankAccount with a name. 37. Let's write getBalance, then. frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } Student(String givenName) { name = givenName; } void addQuizScore(int newScore) { totalScore = totalScore + newScore; } private int totalScore; int whatsYourTotalScore() { return totalScore; } } frilled.cs.indiana.edu% 38. Let's test it. frilled.cs.indiana.edu%pico StudentTest.java frilled.cs.indiana.edu%cat StudentTest.java public class StudentTest { public static void main(String[] args) { Student a = new Student("Larry"); Student b = new Student("Michael"); String answer; System.out.print("Printing the name of the first student: "); answer = a.whatsYourName(); System.out.println(answer); System.out.print("Printing the name of the second student: "); answer = b.whatsYourName(); System.out.println(answer); a.addQuizScore(100); a.addQuizScore(90); a.addQuizScore(100); System.out.println("Student " + a.whatsYourName() + "reports: "); System.out.println(" cumulative score: " + a.whatsYourTotalScore()); } } frilled.cs.indiana.edu%javac StudentTest.java frilled.cs.indiana.edu%java StudentTest Printing the name of the first student: Larry Printing the name of the second student: Michael Student Larryreports: cumulative score: 290 frilled.cs.indiana.edu% 39. I think you need a space between Larry and reports. 40. I'll let you fix that. But overall we've come a long way, don't you think? 41. I sure do so. What if I want the Students to be able to report the average score in addition to the cumulative score? I don't think this is possible at the moment, because they don't remember how many quizzes they have taken. 42. Indeed, they only keep the cumulative score. 43. To remember how many quizzes they have taken they would need to keep a counter, to be updated (incremented by 1) every time a new score is added to the totalScore. 44. If we kept the number updated we could easily report the average at any time, as follows. frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } Student(String givenName) { name = givenName; } void addQuizScore(int newScore) { totalScore = totalScore + newScore; } private int totalScore; int whatsYourTotalScore() { return totalScore; } private int numberOfScores; double reportAverage() { return (double)totalScore / numberOfScores; } } frilled.cs.indiana.edu% 45. I think you forgot to update the counter in addQuizScore, haven't you? 46. Ooops!... frilled.cs.indiana.edu%pico Student.java frilled.cs.indiana.edu%cat Student.java public class Student { private String name; public String whatsYourName () { return name; } Student() { } Student(String givenName) { name = givenName; } void addQuizScore(int newScore) { totalScore = totalScore + newScore; numberOfScores = numberOfScores + 1; } private int totalScore; int whatsYourTotalScore() { return totalScore; } private int numberOfScores; double reportAverage() { return (double)totalScore / numberOfScores; } } frilled.cs.indiana.edu% 47. There you go. 48. Can you test that? 49. Sure, how about this: frilled.cs.indiana.edu%pico StudentTest.java frilled.cs.indiana.edu%cat StudentTest.java public class StudentTest { public static void main(String[] args) { Student a = new Student("Larry"); Student b = new Student("Michael"); String answer; System.out.print("Printing the name of the first student: "); answer = a.whatsYourName(); System.out.println(answer); System.out.print("Printing the name of the second student: "); answer = b.whatsYourName(); System.out.println(answer); a.addQuizScore(100); a.addQuizScore(90); a.addQuizScore(100); System.out.println("Student " + a.whatsYourName() + "reports: "); System.out.println(" cumulative score: " + a.whatsYourTotalScore()); System.out.println(" average score: " + a.reportAverage()); } } 50. Nice. You only changed one line! 51. Indeed. And here's the actual test: frilled.cs.indiana.edu%javac StudentTest.java frilled.cs.indiana.edu%java StudentTest Printing the name of the first student: Larry Printing the name of the second student: Michael Student Larryreports: cumulative score: 290 average score: 96.66666666666667 frilled.cs.indiana.edu% 52. Good Student! 53. Yes. Isn't it time for a break? 54. I sure think so. 55. See you next week! Until then, here's a brief summary of chapter 3: Last updated: Jan 19, 2002 by Adrian German for A201 ```