1
|
- 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
|
2
|
- A 20x10 Screen with 3 HLines:
- ++++++++++++++++++++++
- +RRRRRRRRRR +
- +GGGGGGGGGGGGGGG +
- +BBBBBBBBBBBBBBB +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- ++++++++++++++++++++++
- draw 3 Boxes (2 overlapping):
- ++++++++++++++++++++++
- + +
- + RRRR +
- + RRRR +
- + RGGGGGGG +
- + GGGGGGG +
- + GGGGGGG GGGGGGG +
- + GGGGGGG GGGGGGG +
- + GGGGGGG +
- + GGGGGGG +
- + +
- ++++++++++++++++++++++
|
3
|
- 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)
|
4
|
- 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
|
5
|
- 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)
|
6
|
- 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 );
- }
|
7
|
- while can replace for:
- int i = 0;
- while (i < 3) { for(int i=0;i<3;i++){
- System.out.println(i); //ditto
- i++; }
- }
- for can replace while:
- //ask() returns boolean
- boolean more; for( ; ask(); ) {
- while ( ask() ) { // do something
- // do something }
- }
|
8
|
- 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)
|
9
|
- 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
|
10
|
- 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
|
11
|
- To see a method or field outside its scope, qualify the name of the method or
field:
- account.getBalance()
- System.out
- this.contents
- But
- will fail because balance is private
|
12
|
- 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
|
13
|
- 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
|
14
|
- 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
|
15
|
- 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
|
16
|
- 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
|
17
|
- 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
|
18
|
|
19
|
|