Title: Java Lecture 3
1Java Lecture 3
13X11
2Types of Java Programs
- Applications
- Stand alone
- Requires JVM (java.exe, etc.) on your machine
- Applets
- JVM built in to web browser runs program
- Can be downloaded from network or files can be on
your machine - Susceptible to browser problems!
- Servlets
- Like an applet but code runs on server when a
particular web page is browsed
3A View of Memory
4Recall
- class CokeMachine
- int numCans 3
- void vend()
- if(numCans gt 0)
- System.out.println("Have a Coke!")
- numCans numCans - 1
-
- else
- System.out.println("Sorry!")
-
-
- void load(int n)
- numCans numCans 1
- System.out.println("Ready to vend!")
-
5Two Views
- External
-
- CokeMachine cc
- cc new CokeMachine()
- cc.vend()
- cc.load(5)
- class CokeMachine
- int numCans 3
- void vend()
- if(numCans gt 0)
- System.out.println
- ("Have a Coke!")
- numCans numCans - 1
-
- else
- System.out.println
- ("Sorry!")
-
-
- void load(int n)
- numCans numCans 1
- System.out.println
6Could write...
- class Driver
- public static void main(String args)
- CokeMachine cc
- cc new CokeMachine()
- cc.vend()
- cc.vend()
- cc.vend()
- cc.vend()
- cc.load(5)
- // main
- // Simulation
javac .java java Driver
7What happened?
java Driver
Heap
Stack
Driver main
Class Pool
8What happened?
Java searches for (and finds) static main method
Heap
Stack
Driver main
Class Pool
9What happened?
Java searches for (and finds) static main method
Heap
Stack
main
Driver main
Class Pool
10What happened?
CokeMachine cc
Heap
Stack
main
CokeMachine numCans vend() load()
Driver main
Class Pool
11What happened?
CokeMachine cc
Heap
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
12What happened?
cc new CokeMachine()
Obj CokeMachine numCans vend() load()
Heap
3
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
13What happened?
cc.vend()
Obj CokeMachine numCans vend() load()
Heap
2
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
Have a Coke!
14What happened?
cc.vend()
Obj CokeMachine numCans vend() load()
Heap
1
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
Have a Coke! Have a Coke!
15What happened?
cc.vend()
Obj CokeMachine numCans vend() load()
Heap
0
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
Have a Coke! Have a Coke! Have a Coke!
16What happened?
cc.vend()
Obj CokeMachine numCans vend() load()
Heap
0
Stack
main cc (CokeMachine)
CokeMachine numCans vend() load()
Driver main
Class Pool
Have a Coke! Have a Coke! Sorry!
17As a convenience...
- We don't really need the driver class
- We can put a static main in the CokeMachine
- But the operation is essentially the same!
- In fact, you should always put a static main in
every class you write - Use it to test the class for correct operation
- Will Java get confused?
18No Way, Jose!
class D main()
class E main()
class F main()
Why?
19Because!
class D main()
class E main()
class F main()
javac .java java F
20Questions?
21Fields
- Sometimes called attributes
- In our CokeMachine numCans
- Can be
- Primitives
- References
- Access
- cc.numCans 42 // Direct access
- cc.vend() // Via modifier
- Is direct access a "GoodThing" or a "BadThing"
22Controlling Access
- Access to fields (and methods) can be controlled
- public -- Anyone can access
- private -- Access is only from within class
- Recall
- public static void main(String args)
23Example
- class CokeMachine
-
- int numCans 3
- double cash 0.0
- static final double PRICE 0.65
- void vend()
- if(numCans gt 0)
- numCans--
- cash PRICE
- System.out.println("Have a coke!")
- else
- System.out.println("Sorry, no Cokes")
-
24Let's Test It!
- class Tester
-
- public static void main(String args)
-
- CokeMachine cm // Make reference
- cm new CokeMachine() // Make a machine
- cm.numCans-- // Steal a Coke
- System.out.println("Cash " cm.cash)
-
25Let's add some protection
- class CokeMachine
-
- private int numCans 3
- private double cash 0.0
- private static final double PRICE 0.65
- public void vend()
- if(numCans gt 0)
- numCans--
- cash PRICE
- System.out.println("Have a coke!")
- else
- System.out.println("Sorry, no Cokes")
-
26Warning about Testing
- class CokeMachine
-
- private int numCans 3
- private double cash 0.0
- private static final double PRICE 0.65
- public void vend()
- if(numCans gt 0)
- numCans--
- cash PRICE
- System.out.println("Have a coke!")
- else
- System.out.println("Sorry, no Cokes")
-
-
-
- class Tester
- public static void main(String a)
- CokeMachine cm new CokeMachine()
- class CokeMachine
-
- private int numCans 3
- private double cash 0.0
- private static final double PRICE 0.65
- public void vend()
- if(numCans gt 0)
- numCans--
- cash PRICE
- System.out.println("Have a coke!")
- else
- System.out.println("Sorry, no Cokes")
-
-
- public static void main(String a)
- CokeMachine cm new CokeMachine()
- cm.numCans--
-
27Demo
28Details
- Methods
- Module defined in a class which effectively
becomes a message that an object of that class
can understand - cc.vend()
- Send a "vend()" message to the object referenced
by cc - Almost all code executed in Java will be executed
in methods
29Anatomy of a method
- ltaccessgt ltstaticgt ltreturn typegt ltnamegt(ltparameter
listgt) ltmethod bodygt - Examples
- public static void main(String args)
-
- System.out.println("Hello World!")
-
-
- void vend() / code goes here /
- private int addEmUp(int a, int b, int c)
- return a b c
-
30Parts is parts
- ltaccessgt
- public
- private
- There are others we won't discuss
- ltstaticgt
- static
- nothing which implies dynamic or instance
31Parts is parts
- ltreturn typegt
- Methods may optionally return a value
- May be any valid type
- Class name
- Primitive
- void indicates no return value
- If you promise to return something Java will
expect you to keep your promise - If you promise to not return anything Java will
break your kneecaps with a Louisville Slugger if
you don't keep your promise
32A Promise is a Promise
- public int max(int a, int b)
-
- if(a gt b)
-
- return a
-
- if(a lt b)
-
- return b
-
33A Promise is a Promise
- public int max(int a, int b)
-
- if(a gt b)
-
- return a
-
- if(b lt a)
-
- return b
-
Classname.javaltlinenogt Return required at end
of int max(int, int). public int max(int a,
int b)
34Method Name...
- ltnamegt
- Method name follows normal identifier rules
- Style note Start method names with a lower case
letter but capitalize multiword names - enqueue
- vend
- vendACoke
- load
- loadCokes
35Parameter List
- ltparameter listgt
- Declare each parameter individually
- i.e. int a, float f, CokeMachine cm
- Java only supports pass by value (in) parameters.
- public void swap(int a, int b)
- / This method is worthless! /
- int t a
- a b
- b t
-
36Parameter List
- public static void testMachine(int n, CokeMachine
cm) -
- for(int i0 i lt n i)
-
- cm.vend()
-
- n 0 // Just to be mean
- cm null // and nasty!
-
- What is the effect on the outside world?
- Could this be considered (just maybe) a side
effect?
37Pass by Value
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() testMachine(i, cm)
Object CokeMachine numCans 3
main
38Pass by Value
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() testMachine(i, cm)
n cm
testMachine
Object CokeMachine numCans 3
3
main
39Pass by Value
public static void testMachine (int
n, CokeMachine cm) for(int i0 i lt n i)
cm.vend() n 0 // Just to be
mean cm null // and nasty!
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() exerciseMachine(i, cm)
n cm
testMachine
Object CokeMachine numCans 3
3
main
40Pass by Value
public static void testMachine (int
n, CokeMachine cm) for(int i0 i lt n i)
cm.vend() n 0 // Just to be
mean cm null // and nasty!
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() exerciseMachine(i, cm)
n cm
testMachine
Object CokeMachine numCans 0
3
main
41Pass by Value
public static void testMachine (int
n, CokeMachine cm) for(int i0 i lt n i)
cm.vend() n 0 // Just to be
mean cm null // and nasty!
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() exerciseMachine(i, cm)
n cm
testMachine
Object CokeMachine numCans 0
0
main
42Pass by Value
public static void testMachine (int
n, CokeMachine cm) for(int i0 i lt n i)
cm.vend() n 0 // Just to be
mean cm null // and nasty!
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() exerciseMachine(i, cm)
n cm
testMachine
Object CokeMachine numCans 0
0
main
43Pass by Value
class Demo / Code for testMachine
here/ public static void Main(String args)
int i 3 CokeMachine cm cm new
CokeMachine() exerciseMachine(i, cm)
Object CokeMachine numCans 0
main
44Questions?
45Sidebar on Methods
- Factorial (Yes, again)
- class FactDemo
- public static void main(String args)
- int n 10
- int i
- int answer 1
- for(i 1 i lt n i)
- answer i
- // for
- System.out.println(n "! " answer)
- // main
- // factDemo
-
46Sidebar on Methods
- Make it a method
- public static void fact(int n)
- int i
- int answer 1
-
- for(i 1 i lt n i)
- answer i
- // for
- System.out.println(n "! " answer)
- // fact
47Sidebar on Methods
- Make it smaller and more efficient?
- public static void fact(int n)
- int i, ans
- for(i 1, ans 1 i lt n ans i)
- System.out.println(n "! " ans)
- // fact
48Sidebar on Methods
- Make it more readable?
- public static void fact(int n)
- int i
- int ans 1
- for(i 1 i lt n i)
- ans i
- System.out.println(n "! " ans)
- // fact
49Sidebar on Methods
- Make it more useful?
- public static int fact(int n)
- int i
- int ans 1
- for(i 1 i lt n i)
- ans i
- return ans
- // fact
50Sidebar on Methods
- Make it more useful?
- class FactDemo
- public static int fact(int n)
- int i
- int ans 1
- for(i 1 i lt n i)
- ans i
- return ans
- // fact
- public static void main(String args)
- System.out.println("10! " fact(10))
-
51Sidebar on Methods
- Do it recursively!
- class FactDemo
- public static int fact(int n)
- if(n 0)
- return 1
- else
- return n fact(n - 1)
- // fact
- public static void main(String args)
- System.out.println("10! " fact(10))
-
52Sidebar on Methods
- Do it recursively!
- class FactDemo
- public static int fact(int n)
- if(n 0)
- return 1
- else
- return n fact(n - 1)
- // fact
- public static void main(String args)
- for(int i 1 i lt 18 i)
- System.out.println(i "! " fact(i))
-
53ShakyResults
- 1! 1
- 2! 2
- 3! 6
- 4! 24
- 5! 120
- 6! 720
- 7! 5040
- 8! 40320
- 9! 362880
- 10! 3628800
- 11! 39916800
- 12! 479001600
- 13! 1932053504
- 14! 1278945280
- 15! 2004310016
- 16! 2004189184
- 17! -288522240
54Primitive Data Type Ranges
Type
Size
Min
Default
Max
boolean
false
1
false
true
char
'\u0000' (null)
16
byte
(byte) 0
8
-128
127
short
(short) 0
16
-32,768
32,767
int
0
32
-2,147,483,648
2,147,483,647
long
0L
64
-9,223,372,036,854,775,808
9,223,372,036,854,775,807
float
0.0F
32
Approx 3.4E38 with 7 significant digits
double
0.0D
64
Approx 1.7E308 with 15 significant digits
void
Not truly min and max.
55Notice!
- Notice how Java gave you a helpful warning
message to help keep you spacecraft from plunging
into the Sun - NOT.
56Sidebar on Methods
- Fix the problem (forever?)!
- class FactDemo
- public static long fact(long n)
- if(n 0)
- return 1
- else
- return n fact(n - 1)
- // fact
- public static void main(String args)
- for(int i 1 i lt 18 i)
- System.out.println(i "! " fact(i))
-
57Pop Quiz
- class Widget
-
- int a, b
- public int sum()
- return a b
-
- public static void main(String a)
- a 5
- b 10
- System.out.println(sum())
-
-
Okay?
58Pop Quiz
- class Widget
-
- int a, b
- public int sum()
- return a b
-
- public static void main(String a)
- Widget w
- w new Widget()
- w.a 5
- w.b 10
- System.out.println(w.sum())
-
-
59Questions?
60Final Thought
class
declarations
initialization modules
methods
61Questions?
62(No Transcript)