13 x 11 java lecture 3 cs 1311 structure 13 x 11
TRANSCRIPT
13X11
Java Lecture 3
CS 1311
Structure
13X11
13X11
Types 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
13X11
A View of Memory
Class Pool(What you wrote)
Stack (Static Area)(Store stuff here)
Heap (Dynamic Area)(Store stuff here)
13X11
class CokeMachine {
int numCans = 3;
void vend() {if(numCans > 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!");
}
public static void main(String args[]) {CokeMachine cc;cc = new CokeMachine();cc.vend();cc.vend();cc.vend();cc.vend();cc.load();cc.vend();
}}
13X11
Two Views• External
CokeMachine cc;
cc = new CokeMachine();
cc.vend();
cc.load(5);
class CokeMachine {
int numCans = 3;
void vend() { if(numCans > 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!"); }}
13X11
javac *.java
java Driver
Could 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
13X11
What happened?
java Driver
DrivermainC
lass
Pool
Stac
kH
eap
13X11
What happened?
Java searches for(and finds) staticmain method
Cla
ssPo
olSt
ack
Hea
p
Drivermain
13X11
What happened?
Java searches for(and finds) staticmain method
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main
13X11
What happened?
CokeMachine cc;
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main
CokeMachinenumCans vend() load()
13X11
What happened?
CokeMachine cc;
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
13X11
What happened?
cc = new CokeMachine();
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
Obj: CokeMachinenumCans vend() load()
3
13X11
What happened?
cc.vend();
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
Obj: CokeMachinenumCans vend() load()
2
Have a Coke!
13X11
What happened?
cc.vend();
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
Obj: CokeMachinenumCans vend() load()
1
Have a Coke!Have a Coke!
13X11
What happened?
cc.vend();
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
Obj: CokeMachinenumCans vend() load()
0
Have a Coke!Have a Coke!Have a Coke!
13X11
What happened?
cc.vend();
Cla
ssPo
olSt
ack
Hea
p
Drivermain
main cc (CokeMachine)
CokeMachinenumCans vend() load()
Obj: CokeMachinenumCans vend() load()
0
Have a Coke!Have a Coke!Sorry!
13X11
As 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?
13X11
No Way, Jose!
class Amain()
class Bmain()
class Cmain()
class Dmain()
class Emain()
class Fmain()
Why?
13X11
Because!
class Amain()
class Bmain()
class Cmain()
class Dmain()
class Emain()
class Fmain()
javac *.javajava F
13X11
Questions?
13X11
Fields
• Sometimes called attributes• In our CokeMachine: numCans• Can be
– Primitives– References
• Accesscc.numCans = 42; // Direct access
cc.vend(); // Via modifier
• Is direct access a "GoodThing"® or a "BadThing"®
13X11
Controlling Access
• Access to fields (and methods) can be controlledpublic -- Anyone can access
private -- Access is only from within class
Recall
public static void main(String args[])
13X11
Exampleclass CokeMachine
{
int numCans = 3;
double cash = 0.0;
static final double PRICE = 0.65;
void vend() {
if(numCans > 0) {
numCans--;
cash += PRICE;
System.out.println("Have a coke!");
} else {
System.out.println("Sorry, no Cokes");
}
}
13X11
Let'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);
}
} Where's my money?!?!?!
13X11
Let's add some protectionclass CokeMachine
{
private int numCans = 3;
private double cash = 0.0;
private static final double PRICE = 0.65;
public void vend() {
if(numCans > 0) {
numCans--;
cash += PRICE;
System.out.println("Have a coke!");
} else {
System.out.println("Sorry, no Cokes");
}
}
13X11
Warning about Testingclass CokeMachine
{
private int numCans = 3;
private double cash = 0.0;
private static final double PRICE = 0.65;
public void vend() {
if(numCans > 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();
cm.numCans--;
}
}
class CokeMachine
{
private int numCans = 3;
private double cash = 0.0;
private static final double PRICE = 0.65;
public void vend() {
if(numCans > 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--;
}
}
13X11
Demo
13X11
Details
• 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
13X11
Anatomy of a method• <access> <static> <return type>
<name>(<parameter list>) { <method body> }• 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;
}
13X11
Parts is parts
• <access>
public
private– There are others we won't discuss
• <static>
staticnothing which implies dynamic or instance
13X11
Parts is parts
• <return type>– 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
13X11
A Promise is a Promisepublic int max(int a, int b)
{
if(a >= b)
{
return a;
}
if(a < b)
{
return b;
}
}
13X11
A Promise is a Promisepublic int max(int a, int b)
{
if(a >= b)
{
return a;
}
if(b < a)
{
return b;
}
}
Classname.java:<lineno>: Return required at end of int max(int, int). public int max(int a, int b)
13X11
Method Name...
• <name>– 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
13X11
Parameter List
• <parameter list>– 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;
}
13X11
Parameter Listpublic static void testMachine(int n, CokeMachine cm)
{
for(int i=0; i < 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?
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();testMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 3
Object: CokeMachinenumCans = 3
main:
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();testMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 3
Object: CokeMachinenumCans = 3
main:
testMachine: n: cm:3
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();exerciseMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 3
Object: CokeMachinenumCans = 3
main:
testMachine: n: cm:3
public static void testMachine
(int n, CokeMachine cm) {
for(int i=0; i < n; i++) {
cm.vend();
}
n = 0; // Just to be mean
cm = null; // and nasty!
}
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();exerciseMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 0
Object: CokeMachinenumCans = 0
main:
testMachine: n: cm:3
public static void testMachine
(int n, CokeMachine cm) {
for(int i=0; i < n; i++) {
cm.vend();
}
n = 0; // Just to be mean
cm = null; // and nasty!
}
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();exerciseMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 0
Object: CokeMachinenumCans = 0
main:
testMachine: n: cm:0
public static void testMachine
(int n, CokeMachine cm) {
for(int i=0; i < n; i++) {
cm.vend();
}
n = 0; // Just to be mean
cm = null; // and nasty!
}
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();exerciseMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 0
Object: CokeMachinenumCans = 0
main:
testMachine: n: cm:0
public static void testMachine
(int n, CokeMachine cm) {
for(int i=0; i < n; i++) {
cm.vend();
}
n = 0; // Just to be mean
cm = null; // and nasty!
}
13X11
Pass by Valueclass Demo {
/* Code for testMachine here*/public static void Main(String args[]) {
int i = 3;CokeMachine cm;cm = new CokeMachine();exerciseMachine(i, cm);
}}
i: cm:3
Object: CokeMachinenumCans = 0
Object: CokeMachinenumCans = 0
main:
13X11
Questions?
13X11
Sidebar 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 <= n; i++) {
answer *= i;
} // for
System.out.println(n + "! = " + answer);
} // main
} // factDemo
13X11
Sidebar on Methods
• Make it a method
public static void fact(int n) {
int i;
int answer = 1;
for(i = 1; i <= n; i++) {
answer *= i;
} // for
System.out.println(n + "! = " + answer);
} // fact
13X11
Sidebar on Methods
• Make it smaller and more efficient?
public static void fact(int n) {
int i, ans;
for(i = 1, ans = 1; i <= n; ans *= i++);
System.out.println(n + "! = " + ans);
} // fact
13X11
Sidebar on Methods
• Make it more readable?
public static void fact(int n) {
int i;
int ans = 1;
for(i = 1; i <= n; i++)
ans *= i;
System.out.println(n + "! = " + ans);
} // fact
13X11
Sidebar on Methods
• Make it more useful?
public static int fact(int n) {
int i;
int ans = 1;
for(i = 1; i <= n; i++)
ans *= i;
return ans;
} // fact
13X11
Sidebar on Methods
• Make it more useful?
class FactDemo {
public static int fact(int n) {
int i;
int ans = 1;
for(i = 1; i <= n; i++)
ans *= i;
return ans;
} // fact
public static void main(String args[]) {
System.out.println("10! = " + fact(10));
}
}
13X11
Sidebar 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));
}
}
13X11
Sidebar 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 < 18; i++)
System.out.println(i + "! = " + fact(i));
}
}
13X11
ShakyResults
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
Correct value: n! = 6,227,020,800 > ?
13X11
Primitive Data Type Ranges
Type Size Min Default
boolean false
Max
1 false* true*
char '\u0000' (null)16
byte (byte) 08 -128 127
short (short) 016 -32,768 32,767
int 032 -2,147,483,648 2,147,483,647
long 0L64 -9,223,372,036,854,775,808 9,223,372,036,854,775,807
float 0.0F32 Approx ±3.4E+38 with 7 significant digits
double 0.0D64 Approx ±1.7E+308 with 15 significant digits
void
* Not truly min and max.
13X11
Notice!
• Notice how Java gave you a helpful warning message to help keep you spacecraft from plunging into the Sun
NOT.
13X11
Sidebar 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 < 18; i++)
System.out.println(i + "! = " + fact(i));
}
}
13X11
Pop Quizclass Widget
{
int a, b;
public int sum() {
return a + b;
}
public static void main(String a[]) {
a = 5;
b = 10;
System.out.println(sum());
}
}
13X11
Pop Quizclass 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());
}}
13X11
Questions?
13X11
Final Thought
• Just what is a class?
class
declarations
initializationmodules*
methods
13X11
Questions?