Methods and classes (chapter 7)
Download
Report
Transcript Methods and classes (chapter 7)
Programming with
methods and classes
Chapter 7
Fall 2006
CS 101
Aaron Bloomfield
1
Static vs. non-static
2
Methods
Instance (or member) method
Operates on a object (i.e., and instance of the class)
String s = new String("Help every cow reach its "
+ "potential!");
int n = s.length();
Instance method
Class (i.e. static) method
Service provided by a class and it is not associated with a
particular object
String t = String.valueOf(n);
Class method
3
Variables
Instance variable and instance constants
Attribute of a particular object
Usually a variable
Point p = new Point(5, 5);
int px = p.x;
Instance variable
Class variables and constants
Collective information that is not specific to individual
objects of the class
Usually a constant
Color favoriteColor = Color.MAGENTA;
double favoriteNumber = Math.PI - Math.E;
Class constants
4
static and non-static rules
Member/instance (i.e. non-static) fields and methods can
ONLY be accessed by the object name
Class (i.e. static) fields and methods can be accessed by
Either the class name or the object name
Non-static methods can refer to BOTH class (i.e. static)
variables and member/instance (i.e. non-static) variables
Class (i.e. static) methods can ONLY access class (i.e. static)
variables
5
Static vs. non-static
Consider the following code:
public class Staticness {
private int a = 0;
private static int b = 0;
public void increment() {
a++;
b++;
}
public String toString() {
return "(a=" + a + ",b=" + b + ")";
}
}
6
Static vs. non-static
And the code to run it:
public class StaticTest {
public static void main (String[] args) {
Staticness s = new Staticness();
Staticness t = new Staticness();
s.increment();
t.increment();
t.increment();
System.out.println (s);
System.out.println (t);
}
}
7
Static vs. non-static
Execution of the code…
Output is:
(a=1,b=3)
(a=2,b=3)
8
Static vs. non-static: memory diagram
Staticness s = new
Staticness t = new
s.increment();
t.increment();
t.increment();
System.out.println
System.out.println
Staticness();
Staticness();
(s);
(t);
s
t
Staticness
-a=1
0
Staticness
Staticness
-a=2
0
1
b
0
3
2
1
9
Program demo
StaticTest.java
10
How well do you feel
you understand static-ness?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s static again?
I’d rather not answer this question, thanks.
11
Hand Paintings
12
Conversion.java
13
Task – Conversion.java
Support conversion between English and metric values
d degrees Fahrenheit = (d – 32)/1.8 degrees Celsius
1 mile = 1.609344 kilometers
1 gallon = 3.785411784 liters
1 ounce (avdp) = 28.349523125 grams
1 acre = 0.0015625 square miles = 0.40468564 hectares
14
Conversion Implementation
public class Conversion {
// conversion equivalencies
private static final double
KILOMETERS_PER_MILE = 1.609344;
private static final double
LITERS_PER_GALLON = 3.785411784;
private static final double
GRAMS_PER_OUNCE = 28.349523125;
private static final double
HECTARES_PER_ACRE = 0.40468564;
15
Conversion implementation
Modifier public indicates other classes can use the method
Modifier static indicates the method is a class method
public static double fahrenheitToCelsius (double f) {
return (f - 32) / 1.8;
}
No use of member/instance variables!!!
16
Conversion Implementation
// temperature conversions methods
public static double fahrenheitToCelsius(double f) {
return (f - 32) / 1.8;
}
public static double celsiusToFahrenheit(double c) {
return 1.8 * c + 32;
}
// length conversions methods
public static double kilometersToMiles(double km) {
return km / KILOMETERS_PER_MILE;
}
17
Conversion Implementation
// mass conversions methods
public static double litersToGallons(double liters) {
return liters / LITERS_PER_GALLON;
}
public static double gallonsToLiters(double gallons) {
return gallons * LITERS_PER_GALLON;
}
public static double gramsToOunces(double grams) {
return grams / GRAMS_PER_OUNCE;
}
public static double ouncesToGrams(double ounces) {
return ounces * GRAMS_PER_OUNCE;
}
18
Conversion Implementation
// area conversions methods
public static double hectaresToAcres(double hectares) {
return hectares / HECTARES_PER_ACRE;
}
public static double acresToHectares(double acres) {
return acres * HECTARES_PER_ACRE;
}
19
Conversion use
Scanner stdin = new Scanner (System.in);
System.out.print("Enter a length in kilometers: ");
double kilometers = stdin.nextDouble();
double miles = Conversion.kilometersToMiles(kilometers);
System.out.print("Enter a mass in liters: ");
double liters = stdin.nextDouble();
double gallons = Conversion.litersToGallons(liters);
System.out.print("Enter a mass in grams: ");
double grams = stdin.nextDouble();
double ounces = Conversion.gramsToOunces(grams);
System.out.print("Enter an area in hectares: ");
double hectares = stdin.nextDouble();
double acres = Conversion.hectaresToAcres(hectares);
20
A Conversion use
System.out.println(kilometers + " kilometers = "
+ miles + " miles ");
System.out.println(liters + " liters = "
+ gallons + " gallons");
System.out.println(grams + " grams = "
+ ounces + " ounces");
System.out.println(hectares + " hectares = "
+ acres + " acres");
2.0
3.0
4.0
5.0
kilometers = 1.242742384474668 miles
liters = 0.7925161570744452 gallons
grams = 0.14109584779832166 ounces
hectares = 12.355269141746666 acres
21
A preferred Conversion use
Part of java.text
NumberFormat style = NumberFormat.getNumberInstance();
style.setMaximumFractionDigits(2);
style.setMinimumFractionDigits(2);
System.out.println(kilometers + " kilometers = "
+ style.format(miles) + " miles ");
System.out.println(liters + " liters = "
+ style.format(gallons) + " gallons");
System.out.println(grams + " grams = "
+ style.format(ounces) + " ounces");
System.out.println(hectares + " hectares = "
+ style.format(acres) + " acres");
2.0
3.0
4.0
5.0
kilometers = 1.24 miles
liters = 0.79 gallons
grams = 0.14 ounces
hectares = 12.36 acres
22
Program Demo
Conversion.java
23
How well do you feel
you understand Conversion.java?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a class again?
I’d rather not answer this question, thanks.
24
Fractals
25
Parameter passing
27
Java parameter passing
The value is copied to the method
Any changes to the parameter are forgotten when the
method returns
28
Java parameter passing
Consider the following code:
static void foobar (int y) {
y = 7;
}
y
5
7
x
5
formal parameter
public static void main (String[] args) {
int x = 5;
actual parameter
foobar (x);
System.out.println(x);
}
What gets printed?
29
Java parameter passing
Consider the following code:
static void foobar (String y) {
y = “7”;
}
y
“7"
x
“5"
formal parameter
public static void main (String[] args) {
String x = “5”;
actual parameter
foobar (x);
System.out.println(x);
}
What gets printed?
30
Java parameter passing
Consider the following code:
static void foobar (Rectangle y) {
y.setWidth (10);
formal parameter
}
public static void main (String[] args) {
Rectangle x = new Rectangle();
foobar (x);
actual parameter
System.out.println(x.getWidth());
}
y
What gets printed?
x
width
width==10
0
31
Java parameter passing
Consider the following code:
static void foobar (Rectangle y) {
y = new Rectangle();
y.setWidth (10); formal parameter
}
public static void main (String[] args) {
Rectangle x = new Rectangle();
actual parameter
foobar (x);
System.out.println(x.getWidth());
}
What gets printed?
y
width
width==10
0
x
width = 0
32
Java parameter passing
The value of the actual parameter gets copied to the formal
parameter
This is called pass-by-value
C/C++ is also pass-by-value
Other languages have other parameter passing types
Any changes to the formal parameter are forgotten when the
method returns
However, if the parameter is a reference to an object, that
object can be modified
Similar to how the object a final reference points to can
be modified
33
Method invocations
Actual parameters provide information that is otherwise
unavailable to a method
When a method is invoked
Java sets aside memory for that particular invocation
Called the activation record
Activation record stores, among other things, the
values of the formal parameters
Formal parameters initialized with values of the actual
parameters
After initialization, the actual parameters and formal
parameters are independent of each other
Flow of control is transferred temporarily to that method
34
Value parameter passing demonstration
public class ParameterDemo {
public static double add(double x, double y) {
double result = x + y;
return result;
}
public static double multiply(double x, double y) {
x = x * y;
return x;
}
public static void main(String[] args) {
double a = 8, b = 11;
double sum = add(a, b);
System.out.println(a + " + " + b + " = " + sum);
double product = multiply(a, b);
System.out.println(a + " * " + b + " = " + product);
}
}
35
Value parameter passing demonstration
The file/class is actually called ParameterDemo.java
36
Program demo
ParameterDemo.java
37
ParameterDemo.java walkthrough
double sum = add(a, b);
Initial values of formal parameters
come from the actual parameters
public static double add (double x, double y) {
double result = x + y;
return result;
}
main()
add()
x
8.0
y
11.0
result
19.0
-
a
8.0
b
11.0
sum
19.0
-
product
-
38
ParameterDemo.java walkthrough
double multiply = multiply(a, b);
Initial values of formal parameters
come from the actual parameters
public static double multiply (double x, double y) {
x = x * y;
return x;
}
main()
multiply()
x
88.0
8.0
y
11.0
a
8.0
b
11.0
sum
19.0
product
88.0
-
39
How well do you feel
you understand parameter passing?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a parameter again?
I’d rather not answer this question, thanks.
40
Honda’s best commercial
cog.mov
41
Casting
42
Casting
We’ve seen casting before:
double d = (double) 3;
int x = (int) d;
Aside: duplicating an object
String s = “foo”;
String t = s.clone();
Causes an error: “inconvertible types”
(Causes another error, but we will ignore that one)
What caused this?
43
Casting, take 2
.clone() returns an object of class Object (sic)
More confusion: You can also have an object of class
Class
Thus, you can have an Object class and a Class object
Got it?
We know it’s a String (as it cloned a String)
Thus, we need to tell Java it’s a String via casting
Revised code:
String s = “foo”;
String t = (String) s.clone();
Still causes that “other” error, but we are still willfully
44
ignoring it…
Casting, take 3
That “other” error is because String does not have a .clone()
method
Not all classes do!
We just haven’t seen any classes that do have .clone()
yet
Check in the documentation if the object you want to copy
has a .clone() method
A class that does: java.util.Vector
Vector s = new Vector();
Vector t = s.clone();
Vector u = (Vector) s.clone();
Causes the “inconvertible
types” error
45
Casting, take 4
What happens with the following code?
Vector v = new Vector();
String s = (String) v;
Java will encounter a compile-time error
“inconvertible types”
What happens with the following code?
Vector v = new Vector();
String s = (String) v.clone();
Java will encounter a RUN-time error
ClassCastException
46
How well do you feel
you understand casting?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a parameter again?
I’d rather not answer this question, thanks.
47
Overloading
48
Overloading
Have seen it often before with operators
int i = 11 + 28;
double x = 6.9 + 11.29;
String s = "April " + "June";
Java also supports method overloading
Several methods can have the same name
Useful when we need to write methods that perform
similar tasks but different parameter lists
Method name can be overloaded as long as its signature
is different from the other methods of its class
Difference in the names, types, number, or order of
the parameters
49
Legal
public static int min(int a, int b, int c) {
return Math.min(a, Math.min(b, c));
}
public static int min(int a, int b, int c, int d) {
return Math.min(a, min(b, c, d));
}
50
Legal
public static int power(int x, int n) {
int result = 1;
for (int i = 1; i <= n; ++i) {
result *= x;
}
return result;
}
public static double power(double x, int n) {
double result = 1;
for (int i = 1; i <= n; ++i) {
result *= x;
}
return result;
}
51
What’s the output?
public static void f(int a, int b) {
System.out.println(a + b);
}
public static void f(double a, double b) {
System.out.println(a - b);
}
public static void main(String[] args) {
int i = 19;
double x = 54.0;
f(i, x);
}
52
How well do you feel
you understand overloading?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a parameter again?
I’d rather not answer this question, thanks.
53
2004 IOCCC winners
2004 winners:
– 2004 anonymous
– 2004 arachnid
–
–
–
–
–
–
–
–
–
–
–
–
–
2004
2004
2004
2004
2004
2004
2004
2004
2004
2004
2004
2004
2004
burley
gavare
gavin
hibachi
hoyle
jdalbec
kopczynski
newbern
omoikane
schnitzi
sds
vik1
vik2
Rendering of a stroked font
Curses maze displayer/navigator with only line-of-sight
visibility
A Poker game
A ray tracer
Mini-OS
A CGI capable HTTP server
Curses based polynomial graphing with auto-scale
Conway's look'n'say sequence split into elements
OCR of 8, 9, 10 and 11
Renders arbitary bitmapped fonts
A CRC inserter
Editor animation
Space/tab/linefeed steganography
X Windows car racing game
Calculates prime numbers using only CPP
At http://www1.us.ioccc.org/years.html#2004
54
Scope
55
What’s wrong with this code?
class Scope {
public static void f(int a) {
int b = 1;
// local definition
System.out.println(a); // print 10
a = b;
// update a
System.out.println(a); // print 1
}
public static void main(String[] args) {
int i = 10;
// local definition
f(i);
// invoking f() with i as parameter
System.out.println(a);
System.out.println(b);
}
}
56
Variables a and b do not exist in the scope of method main()
Program demo
Scope.java (just the compilation)
57
Blocks and scope rules
A block is a list of statements nested within braces
A method body is a block
A block can be placed anywhere a statement would be legal
A block contained within another block is a nested block
A formal parameter is considered to be defined at the beginning of
the method body
A local variable can be used only in a statement or nested blocks
that occurs after its definition
An identifier name can be reused as long as the blocks containing
the duplicate declarations are not nested one within the other
Name reuse within a method is permitted as long as the reuse
occurs in distinct blocks
58
Legal
class Scope2 {
public static void main(String[] args) {
int a = 10;
f(a);
System.out.println(a);
}
public static void f(int a) {
System.out.println(a);
a = 1;
System.out.println(a);
}
}
59
Legal but not recommended
public void g() {
{
int j = 1;
System.out.println(j);
}
{
int j = 10;
System.out.println(j);
}
{
char j = '@';
System.out.println(j);
}
}
// define j
// print 1
// define a different j
// print 10
// define a different j
// print '@'
60
Program demo
Scope2.java (just the compilation)
61
What’s the output?
for (int i = 0; i < 3; ++i) {
int j = 0;
++j;
System.out.println(j);
}
The scope of variable j is the body of the for loop
j is not in scope when ++i
j is not in scope when i < 3 are evaluated
j is redefined and re-initialized with each loop iteration
62
How well do you feel
you understand scoping?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a parameter again?
I’d rather not answer this question, thanks.
63
Triple.java
65
Task – Triple.java
Represent objects with three integer attributes
public Triple()
Constructs a default Triple value representing three zeros
public Triple(int a, int b, int c)
Constructs a representation of the values a, b, and c
public int getValue(int i)
Returns the i-th element of the associated Triple
public void setValue(int i, int value)
Sets the i-th element of the associated Triple to value
66
Task – Triple.java
Represent objects with three integer attributes
public String toString()
Returns a textual representation of the associated Triple
public Object clone()
Returns a new Triple whose representation is the same as
the associated Triple
public boolean equals(Object v)
Returns whether v is equivalent to the associated Triple
67
Triple.java implementation
// Triple(): default constructor
public Triple() {
this (0, 0, 0);
}
The new Triple object (the this object) is constructed
by invoking the Triple constructor expecting three int
values as actual parameters
public
int
int
int
this
}
Triple() {
a = 0;
b = 0;
c = 0;
(a, b, c);
Illegal this() invocation. A this() invocation
must begin its statement body
68
Triple.java implementation
// Triple(): default constructor
public Triple() {
this (0,0,0);
}
// Triple(): specific constructor
public Triple(int a, int b, int c) {
setValue(1, a);
setValue(2, b);
setValue(3, c);
}
// Triple(): specific constructor - alternative definition
public Triple(int a, int b, int c) {
this.setValue(1, a);
this.setValue(2, b);
this.setValue(3, c);
}
69
Triple.java implementation
Class Triple like every other Java class
Automatically an extension of the standard class Object
Class Object specifies some basic behaviors common to
all objects
These behaviors are said to be inherited
Three of the inherited Object methods
toString()
clone()
equals()
70
Recommendation
Classes should override
implementation)
toString()
clone()
equals()
(i.e.,
provide
a
class-specific
By doing so, the programmer-expected behavior can be
provided
System.out.println(p); // displays string version of
// object referenced by p
System.out.println(q); // displays string version of
// object referenced by q
71
Triple.java toString() implementation
public
int
int
int
String toString() {
a = getValue(1);
b = getValue(2);
c = getValue(3);
return "Triple[" + a + ", " + b + ", " + c+ "]";
}
Consider
Triple t1 = new Triple(10, 20, 30);
System.out.println(t1);
Triple t2 = new Triple(8, 88, 888);
System.out.println(t2);
Produces
Triple[10, 20, 30]
Triple[8, 88, 888]
72
Triple.java clone() implementation
public
int
int
int
Object clone() {
a = getValue(1);
b = getValue(2);
c = getValue(3);
return new Triple(a, b, c);
}
Consider
Triple t1 = new Triple(9, 28, 29);
Triple t2 = (Triple) t1.clone();
Must cast!
System.out.println("t1 = " + t1);
System.out.println("t2 = " + t2);
Produces
Triple[9, 28, 29]
Triple[9, 28, 29]
73
Triple.java equals() implementation
public boolean equals(Object v) {
if (v instanceof Triple) {
int a1 = getValue(1);
int b1 = getValue(2);
int c1 = getValue(3);
Triple
int a2
int b2
int c2
t
=
=
=
Can’t be equal
unless it’s a Triple
= (Triple) v;
t.getValue(1);
t.getValue(2);
t.getValue(3);
return (a1 == a2) && (b1 == b2) && (c1 == c2);
}
else {
return false;
}
Compare corresponding
attributes
}
74
Triple.java equals()
Triple e = new Triple(4, 6, 10);
Triple f = new Triple(4, 6, 11);,
Triple g = new Triple(4, 6, 10);
Triple h = new Triple(4, 5, 11);
boolean flag1 = e.equals(f);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
Triple
h
x1: 4
x2: 5
x3: 10
75
x3: 11
Triple.java equals()
Triple e = new Triple(4, 6, 10);
Triple f = new Triple(4, 6, 11);,
Triple g = new Triple(4, 6, 10);
Triple h = new Triple(4, 5, 11);
boolean flag2 = e.equals(g);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
Triple
h
x1: 4
x2: 5
x3: 10
76
x3: 11
Triple.java equals()
Triple e = new Triple(4, 6, 10);
Triple f = new Triple(4, 6, 11);,
Triple g = new Triple(4, 6, 10);
Triple h = new Triple(4, 5, 11);
boolean flag3 = g.equals(h);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
Triple
h
x1: 4
x2: 5
x3: 10
77
x3: 11
Using our Triple class
…
78
Program demo
TripleDemo.java
79
How well do you feel
you understand Triple.java?
a)
b)
c)
d)
e)
Very well! This stuff is so easy.
With a little review, I’ll be good.
Not very well at all.
I’m so lost. What’s a parameter again?
I’d rather not answer this question, thanks.
80
Summary
81
Summary of key points
The this keyword
Can be used to call another constructor
Must be the FIRST thing called
Can be used as a reference to the current object
Static vs. non-static
A static variable means there is only one such variable
regardless of how many objects have been declared
A static method does not care about the “state” of the
object
Various methods we may want to override:
clone()
toString()
equals()
82
Using random numbers
Cubic Tragedy
Cubic_tragedy_m640.mov
83
A two legged dog….
84