08.ppt

advertisement
CS110 Lecture 8
February 19, 2004
• Announcements
– hw3 due tonight
– hw4 available, due Thursday February 26
– exam Tuesday March 2
• Agenda
–
–
–
–
–
–
–
questions
Shapes application
counting
signatures
scope
classes vs objects
how parameters really work
Lecture 7
1
Shapes
• Character graphics on your terminal
A 20x10 Screen with 3 HLines:
++++++++++++++++++++++
+RRRRRRRRRR
+
+GGGGGGGGGGGGGGG
+
+BBBBBBBBBBBBBBB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++++++++++++++++++++++
draw 3 Boxes (2 overlapping):
++++++++++++++++++++++
+
+
+ RRRR
+
+ RRRR
+
+ RGGGGGGG
+
+ GGGGGGG
+
+ GGGGGGG GGGGGGG +
+ GGGGGGG GGGGGGG +
+
GGGGGGG +
+
GGGGGGG +
+
+
++++++++++++++++++++++
Lecture 7
2
Counting
• 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)
Lecture 7
0 1 2
+ + + +
0 +
1 +
2 + &
+ + + +
3 4
+ + +
+
G
+
+
+ + +3
for loop
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
Lecture 7
4
for loop
• 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)
Lecture 7
5
for loop
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 );
}
Lecture 7
6
for and while
• while can replace for:
test
start
int i = 0;
while (i < 3) {
for(int i=0;i<3;i++){
System.out.println(i); body //ditto
i++;
}
}
step
• for can replace while:
//ask()
boolean
while (
// do
returns boolean
more;
ask() ) {
something
note empty
start
step
for( ; ask(); ) {
// do something
}
}
Lecture 7
7
for and while
• for loop better than while loop
– fewer lines
– control all on one line at top of loop
– elegant, idiomatic
– natural when loop count known in advance
• while loop better than for loop
– reads more like pseudocode (English)
– natural when loop count not known in advance
(set somehow in body)
Lecture 7
8
Signatures
• HLine paintOn messages in HLine unit test (main)
– line 106: hline1.paintOn(screen)
– line 108: hline1.paintOn(screen, 0, 1)
• Two declarations for paintOn in HLine.java:
– line 39: paintOn(Screen, int, int)
– line 52: paintOn(Screen)
line 54 delegates work to first paintOn (could use this)
• JVM uses shape of message to select method
• Signature: method name & types of parameters
Lecture 7
9
Scope
• scope of a variable or method: where its
unadorned name is visible to the program
• Usually: the block { … } where it’s declared
• Examples from HLine.java
–
–
–
–
scope of all fields:
lines 15-114
scope of screen (line 100) : lines 100-113
scope of length (line 25): lines 25-29
scope of i
(line 41): lines 41-43
• Scope of a method is the class it’s declared in
• public declaration does not change scope
Lecture 7
10
Scope
• To see a method or field outside its scope,
qualify the name of the method or field:
– account.getBalance()
– System.out
– this.contents
• But
– account.balance
will fail because balance is private
Lecture 7
11
static
• Java keyword for belongs to whole class
rather than to an instance of the class
• Static things are rare, objects are common:
too much static is bad design
• public static void main( )
– main() is a static method - it can run before any
objects are created with new
– TestShapes (like many testing programs) is all
static: there is a TestShapes class, but never a
TestShapes object (although main uses objects
Lecture 7
12
What can main() see?
• HLine is meant to be a client class
– private fields
– public getters, setters, other methods as appropriate
• HLine has a static main method, for unit testing
• main in HLine
– can’t refer to length field or paintOn method, since
those belong only to HLine objects
– can instantiate an HLine object, and then send it a
paintOn message
Lecture 7
13
Static tools in the library
• To invoke a static method, send a message to the
class (there is no object) - syntax
ClassName.methodName( args )
• Math.sqrt( x )
• Calendar.getInstance()
a factory method -Java designers chose this rather than
new Calendar
• UnitTest.java line 21: HLine.main(args)
sends message to HLine class to run main() there
Lecture 7
14
static fields
• Syntax for accessing static field:
ClassName.fieldName (e.g. System.out )
(no System constructor, no System object)
• Like global variables (in other languages)
• In Integer class (part of Java API)
public static final int MAX_VALUE =
2147483647;
• final: Java keyword for “can’t be changed”
int big = Integer.MAX_VALUE; // OK
Integer.MAX_VALUE = 255; // error
• Naming convention for final fields: ALL_CAPS
Lecture 7
15
How parameters really work
• Box.java line 143 sends a message:
box2.paintOn( screen, 2, 2 );
• Execution shifts to method at Box.java line 52:
public void paintOn(
Screen s, int x, int y)
• Value of parameter
– s in method is value of screen in message
– x in method is (first) 2 in message
– y in method is (second) 2 in message
Lecture 7
16
How parameters really work
• Name of parameter (s) in method declaration
need not match the name of the value in the
message (screen)
• You can’t even think they should match:
– The value in the message might not even have a
name (the 2 in the example)
– The method can be written before the client
(in some other class) has even been imagined and the client programmer does not have access
to the source code with the method declaration
• The type of the value in the message must
match the type in the method declaration
Lecture 7
17
In Box main
Screen
Screen
Box
Box
Box
Box
screen:
box1:
box2:
int
width: 3
int
width: 4
char
pntCh: 'G'
Lecture 7
18
Screen
Screen
Box
Box
Box
Box
In Box paintOn
screen:
box1:
box2:
out of scope
int
width: 3
int
width: 4
char
pntCh: 'G'
Box
this:
Screen
s:
int
int
y:
Lecture 7
2
x:
2
19
Download