Building Java Programs

Lab: Classes and Objects

 

 

Lab goals

Goals for this problem set:

Declaring a class (syntax)

public class ClassName {
    // fields
    fieldType fieldName;

    // methods
    public returnType methodName() {
        statements;
    }
}
A couple things look different than programs for past homeworks:

Exercise 1: Client code method call syntax

Suppose a method in the BankAccount class is defined as:

public double computeInterest(int rate)

If the client code has declared a BankAccount variable named acct, which of the following would be a valid call to the above method?

Exercise 2: PointCoordinates

What are the x- and y-coordinates of the Points referred to as p1, p2, and p3 after the following code executes? Give your answer as an x-y pair such as (0, 0). (Recall that Points and other objects use reference semantics.

Point p1 = new Point();
p1.x = 17;
p1.y = 9;
Point p2 = new Point();
p2.x = 4;
p2.y = -1;
Point p3 = p2;

p1.translate(3, 1);
p2.x = 50;
p3.translate(-4, 5);
p1:
(20, 10)
p2:
[^0-9,]+
(46, 4)
p3:
(46, 4)

Exercise : Point class errors

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import java.awt.*;
public class Point {
    int x;                                   // Each Point object has
    int y;                                   // an int x and y inside.

    public static void draw(Graphics g) {    // draws this point
        g.fillOval(p1.x, p1.y, 3, 3);
        g.drawString("(" + p1.x + ", " + p1.y + ")", p1.x, p1.y);
    }

    public void translate(int dx, int dy) {  // Shifts this point's x/y
        int x = x + dx;                      // by the given amounts.
        int y = y + dy;
    }

    public double distanceFromOrigin() {     // Returns this point's
        Point p = new Point();               // distance from (0, 0).
        double dist = Math.sqrt(p.x * p.x + p.y * p.y);
        return dist;
    }
}

The above Point class has 5 errors. Can you find them all?

Exercise - answer

  1. line 6: method header should not have the word static
  2. line 12: should not re-declare field x (delete word int)
  3. line 13: should not re-declare field y (delete word int)
  4. line 17: should not declare Point p
  5. line 18: should not use p. in front of the fields

Exercise - solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.awt.*;
public class Point {
    int x;                                   // Each Point object has
    int y;                                   // an int x and y inside.

    public void draw(Graphics g) {           // draws this point
        g.fillOval(x, y, 3, 3);
        g.drawString("(" + x + ", " + y + ")", x, y);
    }

    public void translate(int dx, int dy) {  // Shifts this point's x/y
        x = x + dx;                          // by the given amounts.
        y = y + dy;
    }

    public double distanceFromOrigin() {         // Returns this point's
        double dist = Math.sqrt(x * x + y * y);  // distance from (0, 0).
        return dist;
    }
}

Exercise 4: Printing objects

Point p1 = new Point();
...
System.out.println(p1);

The above println statement (the entire line) is equivalent to what?

Exercise 5: PointClient

Exercise : jGRASP Debugger

The debugger can help you learn how classes and objects work. In this exercise we will debug the Ch. 8 "Stock" Case Study example. This program tracks purchases of two stock investments. To download the example:

  1. Find the section labeled "Code Files" and click the "code files" link. Then click "ch08".
  2. Download and save the files Stock.java and StockMain.java. Right-click each file name and Save the Link in the same folder you use for lab work.
  3. Compile and run StockMain.java in jGRASP to see that it works.

continued on the next slide...

Exercise - jGRASP Debugger

continued on the next slide...

Exercise - jGRASP Debugger

continued on the next slide...

Exercise - jGRASP Debugger

BankAccount class

// Each BankAccount object represents one user's account
// information including name and balance of money.

public class BankAccount {
    String name;
    double balance;

    public void deposit(double amount) {
        balance = balance + amount;
    }

    public void withdraw(double amount) {
        balance = balance - amount;
    }
}

Exercise 7: BankAccount transactionFee

Point and PointMain

Exercise 8: quadrant 

Add the following method to the Point class:

public int quadrant()

Returns which quadrant of the x/y plane this Point object falls in. Quadrant 1 contains all points whose x and y values are both positive. Quadrant 2 contains all points with negative x but positive y. Quadrant 3 contains all points with negative x and y values. Quadrant 4 contains all points with positive x but negative y. If the point lies directly on the x and/or y axis, return 0.

 

Exercise 9: flip 

Add the following method to the Point class:

public void flip()

Negates and swaps the x/y coordinates of the Point object. For example, if an object pt initially represents the point (5, -3), after a call of pt.flip(); , the object should represent (3, -5). If the same object initially represents the point (4, 17), after a call to pt.flip();, the object should represent (-17, -4).

 

Exercise 10: Point toString

Modify the toString method in the Point class. Make it return a string in the following format. For example, if a Point object stored in a variable pt represents the point (5, -17), return the string:

java.awt.Point[x=5,y=-17]

If the client code were to call System.out.println(pt); , that text would be shown on the console.

 

Exercise 11: BankAccount toString 

Add a toString method to the BankAccount class. Your method should return a string that contains the account's name and balance separated by a comma and space. For example, if an account object named benben has the name "Benson" and a balance of 17.25, benben.toString() should return:

Benson, $17.25

If the client code were to call System.out.println(benben); , that text would be shown on the console.

 

Exercise 12: manhattanDistance 

Add the following method to the Point class:

public int manhattanDistance(Point other)

Returns the "Manhattan distance" between the current Point object and the given other Point object. The Manhattan distance refers to how far apart two places are if the person can only travel straight horizontally or vertically, as though driving on the streets of Manhattan. In our case, the Manhattan distance is the sum of the absolute values of the differences in their coordinates; in other words, the difference in x plus the difference in y between the points.

 

Exercise 13: TimeSpan 

Define a class named TimeSpan. A TimeSpan object stores a span of time in hours and minutes (for example, the time span between 8:00am and 10:30am is 2 hours, 30 minutes). The minutes should always be reported as being in the range of 0 to 59. That means that you may have to "carry" 60 minutes into a full hour.

To solve this problem, you may want to refer to the lecture slides about the syntax for constructors.

 

Exercise 14: Circle 

Define a class named Circle. A Circle object stores a center point and a radius.

See the Practice-It link above for a full description of the class and the methods/constructors it should have.

Exercise : Point class errors 2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public class Point {
    int x;                                       // Each Point object has
    int y;                                       // an int x and y inside.

    public void Point(int initX, int initY) {    // Constructor
        initX = x;
        initY = y;
    }

    public static double distanceFromOrigin() {  // Returns this point's
        int x;                                   // distance from (0, 0).
        int y;
        double dist = Math.sqrt(x*x + y*y);
        return dist;
    }

    public void translate(int dx, int dy) {      // Shifts this point's x/y
        int x = x + dx;                          // by the given amounts.
        int y = y + dy;
    }
}

The above Point class has 8 errors. Can you find them all?

Exercise - answer

  1. line 5: constructor header should not have the word void
  2. line 6-7: the assignment statements are backwards; reverse left/right sides of each
  3. line 10: method header should not have the word static
  4. line 11-12: should not re-declare fields x and y
  5. lines 18-19: should not re-declare fields x and y (remove word int)

Exercise - solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/td>
public class Point {
    int x;
    int y;

    public Point(int initX, int initY) {
        x = initX;
        y = initY;
    }

    public double distanceFromOrigin() {
        double dist = Math.sqrt(x*x + y*y);
        return dist;
    }

    public void translate(int dx, int dy) {
        x = x + dx;
        y = y + dy;
    }
}

ClockTime class

Suppose you are given a class named ClockTime with the following contents:

// A ClockTime object represents an hour:minute time during
// the day or night, such as 10:45 AM or 6:27 PM.
public class ClockTime {
    private int hour;
    private int minute;
    private String amPm;

    // Constructs a new time for the given hour/minute
    public ClockTime(int h, int m, String ap)
    
    // returns the field values
    public int getHour()
    public int getMinute()
    public String getAmPm()

    // returns a String for this time; for example, "6:27 PM"
    public String toString()

    ...
}

Exercise 16: ClockTime advance

Exercise 17: ClockTime isWorkTime

Rectangle class

Suppose you are given a class named Rectangle with the following contents:

// A Rectangle stores an (x, y) coordinate of its top/left corner, a width and height.
public class Rectangle {
    private int x;
    private int y;
    private int width;
    private int height;

    // constructs a new Rectangle with the given x,y, width, and height
    public Rectangle(int x, int y, int w, int h)

    // returns the fields' values
    public int getX()
    public int getY()
    public int getWidth()
    public int getHeight()

    // returns a string such as {(5,12), 4x8}
    public String toString()

    ...
}

Exercise 18: Rectangle union

Exercise 19: Rectangle contains