...
1. Writing Simple Java Classes (45 min)
First steps
Wiki Markup If you have not done it already, download the latest DrJava to your Desktop. \[Use this link\!\|http://drjava.org.}
- Create a
lab06
directory within your Comp211 directory. - Set your DrJava "Language Level" to "Elementary"
- Create a class to calculate the areas of rectangles in DrJava by following the steps below. We will begin the process of writing a class that represents a rectangle given its width and height. We will write the class in several small steps. At each step, we will compile the code to ensure that everything is syntactically correct. By compiling the code at each small step, we hope to avoid seeing a large number of error messages that can be rather intimidating.
- In the Definitions pane (upper right pane), type the following:
Note the placement of the curly braces: the opening brace is on the same line as the class name, while the closing brace lines up with the beginning of the class definition on a new line. This is the de-facto Java coding style.Code Block class Rectangle { double width; double height; doublewidth;doubleheight; }
The two lines beginning withdouble
define fields within the class, much like the fields of a structure in Scheme.
The worddouble
is a the name for the principal real number type in Java. So thewidth
andheight
fields of aRectangle
have typedouble
. TheRectangle
class is not very interesting because we cannot do much with it. However, it is syntactically correct and we can compile it. - Save the file in your
Comp211/lab07
folder under the default nameRectangle
. The file will be saved as a.dj0
file, which is a DrJava Elementary level file. - Click the "Compile All" button in DrJava. The file should compile with no errors.
- In the Interactions pane (bottom pane), type the following:
This code defines a variable calledCode Block Rectangle r = new RectanglenewRectangle(5, 10);
r
of typeRectangle
and binds it to a new object belonging to class
Rectangle
. - There is not much we can do with the
Rectangel
class yet, but we can print the string representations ofRectangle
objets. In the Interactions pane, typer
and hit Enter. This action will print the string representation of object bound tocalc
. In the DrJava Elementary language level, the string representation of theRectangle
objectr
is {"Rectanlge(5.,10.)"}}. DrJava automatically strips the quotation marks off string representations when it prints them. Conventional Java would return a much more cryptic string representation for
aRectangle
object. - Take a look at your
Comp211/lab07
directory and you will see several new files. The compiler automatically created a file calledRectangle.class
containing the compiled cJava bytecode ready execution on the Java Virtual Machine (JVM). The DrJava Interactions Pane is a convenient user interface to a Java Virtual Machine. When you
refer to a Java class in the Interactions pane, DrJava automatically loads the byte code for that class. When you
compile the fileRectangle.dj0
using DrJava, DrJava generates a corresponding conventional Java source file calledRectangle.java
and invokes the Java compiler to translate this Java source file to bytecode.
- In the Definitions pane (upper right pane), type the following:
- Now we are ready to add to
Rectangle
a method to compute the area of a rectangle. Change the definition of theRectangle
class to read:Code Block class Rectangle { double width; double height; double areadoublewidth;doubleheight;doublearea() { return widthreturnwidth * height; } // The only new line onlynewline}
- Compile All: the
Rectangle
file is automatically saved and recompiled. - To create an instance of class
Rectangle
, type the following in the Interactions pane:
Note: the "Compile All" command resets the Interactions pane erasing all extantCode Block Rectangle r = new RectanglenewRectangle(4,5);
definitions of names bound to objects. So when we compiled our new definition for theRectangle
class,
we destroyed our first binding ofr
in the Interactions pane. - To "ask" the
Rectangle
object bound tor2
to compute its area, type
in the Interactions pane.Code Block r2.area();
- Experiment with the DrJava Interactions pane to create some new rectangles and computer their areas.
...
Suppose we want to define a class representing a right triangle given the length of the two sides forming the right angle, which we call base
and height
. What code should we write? Use the DrJava New
command to
create a new document. In this document define a class called RightTriangle
with fields of type double
called base
and height
, and a method
Code Block |
---|
double areadoublearea() |
to compute the area of this right triangle. Save and compile this file. Interact with it in the Interactions pane.
...
Suppose we want to model the notion of a smart person who knows his/her birthday and can compute the number of months till his/her next birthday given the current month. For our purpose, a month can simply be represented by an integer, which in Java is called int. We start by writing "stub" code for the class Person that is to represent our smart person.
Code Block |
---|
class Person { /** * Computes the number of months till the next birthday given the current month. */ int nMonthTillBD(int currentMonthintnMonthTillBD(intcurrentMonth) { // to do todo} } } |
Notice in the above there is really no concrete code. As a matter of fact, the above would not compile. Now we must abandon everything and start writing test code for nMonthTillBD(...).
...
- Go to the File menu and select New Junit Test Case...
- Create a stub test case called Test_Person. DrJava will create a stub class that looks like the following
At this point, do not worry about what "extends TestCase" means in the above. DrJava is re-using the class TestCase from the JUnit framework in some clever way without you having to deal with all the details of how to use an existing class from some other files.Code Block /** * A JUnit test case classtestcaseclass. * Every method starting with the word "test" will be called when running * the test with JUnit. */ class Test_PersonPersonextendsTestCase extends TestCase { /** * A test method. * (Replace "X" with a name describing the test. You may write as * many "testSomething" methods ininthisclass this class as you wish, and each * one will be called when running JUnit over this classoverthisclass.) */ void testX() { } } }
...
- Change the name of the stub method testX() in the above to test_nMonthTillBD()and add code to make it look like the code below.
Note that in the code for test_nMonthTillBD(), we have decided that we only need to know the birth month of a person in order to compute the number of months till the next birth day. As a result, we instantiate a Person object by passing only the birth month: new Person(9).Code Block class Test_PersonPersonextendsTestCase extends TestCase { void test_nMonthTillBD() { Person peter = new PersonnewPerson(9); // a person born in September. assertEquals("Calling nMonthTillBD(2).", 7, peter.nMonthTillBD(2)); assertEquals("Calling nMonthTillBD(9).", 0, peter.nMonthTillBD(9)); assertEquals("Calling nMonthTillBD(12).", 9, peter.nMonthTillBD(12)); } } }
...
- the current month is less than the birth month
- the current month is equal to the birth month
- the current month is greater than the birth month.
The
Code Block |
---|
assertEquals |
method comes from the class TestCase and takes in three parameters:
...
Now add the statement return 0; to the body of the method nMonthTillBD(...) and compile.
Code Block |
---|
class Person { int _bMonth; /** * Computes the number of months till the next birthday. */ int nMonthTillBD(int currentMonthintnMonthTillBD(intcurrentMonth) { return 0; return0;// to do todo} } } |
Step 4.
After you have cleaned up your code for Person as shown in the above, you should be able to compile Test_Person. With Test_Person open, click on the Test button in DrJava tool bar.
...
Change the formula to
Code Block |
---|
int nMonthTillBD(int currentMonthintnMonthTillBD(intcurrentMonth) { return _bMonth - currentMonth; // to do todo} |
Compile all and test again.
...
Change the formula to
Code Block |
---|
int nMonthTillBD(int currentMonthintnMonthTillBD(intcurrentMonth) { return (_bMonth - currentMonth + 12) % 12; // to do todo} |
Compile all and test again. Now everything should pass! You may now remove the TO DO comment from the code of nMonthTillBD.
...
Lecture notes on Object-Oriented Programming using Java by Dung X. Nguyen and Stephen B. Wong: http://cnx.org/content/col10213/latest
Here is another link for a more detailed discussion of JUnit testing uisng DrJava: http://cnx.rice.edu/content/m11707/latest/
The following link contains a more elaborate discussion on JUnit testting and a more involved example of testing: http://junit.sourceforge.net/doc/testinfected/testing.htm.
...
Access Permissions: (Please don't edit)
...