|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
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 |
|
|
|