CS110 Lecture
7
February 17, 2004
| Announcements | ||
| hw3 due Thursday | ||
| Agenda | ||
| questions | ||
| hw3 tips | ||
| getters and setters – information hiding | ||
| delegation | ||
| Shapes application | ||
| boxes and arrows | ||
| Practice new Java vocabulary (Lens.java) | |
| Improve TextFile class | |
| Draw box-and-arrow pictures | |
| Explore the Java API |
| Good | ||
| private String contents; | ||
| public String getContents() | ||
| public void setContents (String contents) | ||
| aTextFile.setContents(“foo”) in client class | ||
| Watch naming conventions | ||
| Bad (public access to field itself) | ||
| public String contents; | ||
| aTextFile.contents = “foo” in client class | ||
| Hide implementation details from TextFile clients | ||
| setContents(String contents) (line 51) | ||
| sets value of field and … | ||
| changes modification date | ||
| practice using this | ||
| int getSize() (line 97) | ||
| looks like a getter but … | ||
| there is no size field - code delegates the job | ||
| Pass along the message, asking some other object to do the work for you | |
| Important OO design pattern | |
|
The King asked The Queen, and The Queen asked The Dairymaid: "Could we have some butter for The Royal slice of bread?" |
|
| A. A. Milne, “The King’s Breakfast”, http://ingeb.org/songs/thekingb.html | |
| Keyword for the object we are looking at | ||
| Tricky - takes getting used to | ||
| Settles ambiguity in variable names: | ||
| 40 this.contents = contents; | ||
| declared on line 25 on line 37 | ||
| Send a message to yourself | ||
| 76 this.setContents(contents+text); | ||
| is the same as | ||
| setContents(contents+text); | ||
| (don’t forget that it is a message: this is implicit) | ||
| ("hello, " + "world"). equals("hello, world") | |
| + concatenates Strings | |
| remember to send equals message , don’t test with == | |
| Java can sometimes guess what you mean, converting a number to a String: | |
| ("balance: $" + 100). equals("balance: $100") |
| A 20x10 Screen with 3 HLines: | |
| ++++++++++++++++++++++ | |
| +RRRRRRRRRR + | |
| +GGGGGGGGGGGGGGG + | |
| +BBBBBBBBBBBBBBB + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| ++++++++++++++++++++++ | |
| draw 3 Boxes (2 overlapping): | |
| ++++++++++++++++++++++ | |
| + + | |
| + RRRR + | |
| + RRRR + | |
| + RGGGGGGG + | |
| + GGGGGGG + | |
| + GGGGGGG GGGGGGG + | |
| + GGGGGGG GGGGGGG + | |
| + GGGGGGG + | |
| + GGGGGGG + | |
| + + | |
| ++++++++++++++++++++++ | |
| Particular shapes: | ||
| horizontal line: class HLine | ||
| box: class Box | ||
| VLine, Frame, Triangle (hw4) | ||
| Shapes are clients for Screen | ||
| Use Screen API (javadoc) | ||
| Don’t look at source code | ||
| TestShapes is a test driver (client) for HLine and Box | ||
| Client for Screen, HLine, Box, self documenting | ||
| interesting code fragments | ||
| 28-31: create a Screen, declare and create two HLines | ||
| 32,33 : paintOn message to HLine wants Screen and position as arguments: “ask the HLine to paint itself on a Screen” - Screen is invisible still | ||
| 34: creates an anonymous new HLine which is then asked to paint itself on the Screen | ||
| 35: draw message to Screen gets Terminal as an argument “ask the Screen to draw itself on a Terminal” – finally, everything is visible | ||
| Variable: named place to hold a value of a particular type | ||
| Kinds of variables: fields (instance variables), local variables in methods, parameters | ||
| Variables must be declared before use | ||
| Type is either: | ||
| primitive (int, char, boolean,...) | ||
| reference to an instance (object) of some class | ||
| Why “reference to” ? Draw pictures ... | ||
| Draw a picture of a variable - box with narrow border, showing name and type | ||
| If type is primitive, show value inside box | ||
| If type is a class then value is a reference to an object ... | ||
| Draw a picture of an object - box with thick border, showing type, containing fields (which are just variables) | |
| The object’s methods are not part of this picture! | |
| HLine h0 = new HLine(3,‘x’); | |
| HLine h1; | |
| h1 = h0; | |
| h0.setLength(9); | |
| Variables h0 and h1 refer to the same HLine instance | |
| The HLine referred to by h1 sees the change since it’s the same HLine | |
| h0 = new HLine(5,‘y’); |
| h0 = h1; |
| A 20x10 Screen with 3 HLines: | |
| ++++++++++++++++++++++ | |
| +RRRRRRRRRR + | |
| +GGGGGGGGGGGGGGG + | |
| +BBBBBBBBBBBBBBB + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| + + | |
| ++++++++++++++++++++++ | |
| draw 3 Boxes (2 overlapping): | |
| ++++++++++++++++++++++ | |
| + + | |
| + RRRR + | |
| + RRRR + | |
| + RGGGGGGG + | |
| + GGGGGGG + | |
| + GGGGGGG GGGGGGG + | |
| + GGGGGGG GGGGGGG + | |
| + GGGGGGG + | |
| + GGGGGGG + | |
| + + | |
| ++++++++++++++++++++++ | |
| 1,2,3,... (everyday, mathematics) | ||
| 0,1,2,... (computer science) | ||
| Screen models (x,y) coordinates | ||
| y value increases as you read down | ||
| (0,0) is upper left hand corner | ||
| Each location holds one pixel – a character | ||
| Frame of +’s is not part of Screen | ||
| 5 ´ 3 Screen with G at position (3,1), & at position (0,2) | ||
| start test step | ||
| for (int i = 0; i < 5; i=i+1) { | ||
| System.out.println(2*i + 1); body | ||
| } | ||
| Prints 1, 3, 5, 7, 9 on successive lines | ||
| do start | ||
| if test is true do body do step go back and test again | ||
| else loop is done, so do first line after body | ||
| Use a for loop when you know how many repetitions you want (else use while loop) | ||
| See ForDemo.java in JOI | ||
| HLine paintOn() method (lines 47,48) | ||
| for ( int i = 0; i < length; i++ ){ s.paintAt( x+i , y, paintChar ); } | ||
| Counts from i = 0 to i = length-1, executing what’s in the body each time | ||
| i=0: ask Screen s to put paintChar at (x,y) | ||
| i=1: ask Screen s to put paintChar at (x+1,y) | ||
| i=2: ask Screen s to put paintChar at (x+2,y) | ||
| and so on … at (x+length-1,y) | ||
| for ( int i = 0; i < length; i++ ){ s.paintAt( x+i , y, paintChar ); } | |
| Variable i is declared inside for statement | |
| Surround body with braces {...}for safety | |
| i++ is short for i = i+1 (or i += 1) | |
| Can do the same job other ways: | |
| for (int col=x+len-1; col >=x; col-- ){ s.paintAt( col , y, paintChar ); | |
| } |
| while can replace for: | ||
| int i = 0; | ||
| while (i < 3) { for(int i=0;i<3;i++){ | ||
| System.out.println(i); //ditto | ||
| i = i + 1; } | ||
| } | ||
| for can replace while: | ||
| boolean more = true; for( ; ask(); ) { | ||
| while ( more ) { // do something | ||
| // do something } | ||
| more = ask(); | ||
| } | ||
| For loop advantages: | ||
| fewer lines, control all on one line, elegant, idiomatic | ||
| HLine paintOn messages in HLine unit test (main) | ||
| line 116: hline1.paintOn(screen) | ||
| line 118: hline1.paintOn(screen, 0, 1) | ||
| Two declarations for paintOn in HLine.java: | ||
| line 45: paintOn(Screen, int, int) | ||
| line 58: paintOn(Screen) | ||
| delegates work to first paintOn | ||
| JVM uses shape of message to select method | ||
| Signature: method name & types of parameters | ||