Download COS240Lec12_JavaClassesObjects

Document related concepts
no text concepts found
Transcript
COS240 O-O Languages
AUBG, COS dept
Lecture 12
Title:
Java Classes and Objects
Reference: COS240 Syllabus
1
Lecture Contents:










Defining Classes for Objects
Constructing Objects using Constructors
Accessing Objects via Reference Variables
Visibility Modifiers, Accessors, Mutators
Data Field Encapsulation
Immutable Objects and Classes
Static Variables, Constants and Methods
The Scope of Variables
The this keyword
Class Abstraction and Encapsulation
2
Motivations
After learning the preceding lectures, you are capable of
solving problems using Java as conventional Prog Lang
incl. selections, loops, methods, and arrays. However,
these Java features are not sufficient for developing
graphical user interfaces and large scale software systems.
Suppose you want to develop a graphical user interface as
shown below. How do you program it?
3
OO Programming Concepts
• O-OP involves programming using objects.
• An object represents an entity in the world that can
be distinctly identified like a student, a desk, a circle, a
button, and even a loan can all be viewed as objects.
• An object has a unique identity - state and behaviors.
• The state of an object consists of a set of data fields
(known as properties) with their current values.
•The behavior of an object is defined by a set of
methods. Invoking a method is like sending a message
4
to ask an object to perform a task.
Defining Classes for Objects
An object has both a state and behavior.
•The state defines the object.
•The behavior defines what the object does.
Example:
•A Circle object has a data field, i.e. radius which is the
property to characterize a circle.
•One behavior of a circle is that its area can be computed
using the method getArea()
5
Objects
Class Name: Circle
A class template
Data Fields:
radius is _______
Methods:
getArea
Circle Object 1
Circle Object 2
Circle Object 3
Data Fields:
radius is 10
Data Fields:
radius is 25
Data Fields:
radius is 125
Three objects of
the Circle class
An object has both a state and behavior.
The state defines the object.
The behavior defines what the object does.
6
Classes
Classes are constructs or entities or categories that
define objects of the same type.
A Java class uses variables to define data fields and
methods to define behaviors.
Additionally, a class provides a special type of
methods, known as constructors, which are invoked
to construct objects from the class.
7
Classes
class Circle {
/** The radius of this circle */
double radius = 1.0;
/** Construct a circle object */
Circle() {
}
Data field
Constructors
/** Construct a circle object */
Circle(double newRadius) {
radius = newRadius;
}
/** Return the area of this circle */
double getArea() {
return radius * radius * 3.14159;
}
Method
}
8
UML Class Diagram
Circle
UML Class Diagram
Class name
radius: double
Data fields
Circle()
Constructors and
methods
Circle(newRadius: double)
getArea(): double
circle1: Circle
radius = 1.0
circle2: Circle
radius = 25
circle3: Circle
UML notation
for objects
radius = 125
9
Constructors
Constructors are a special kind of methods that are
invoked to construct objects.
A constructor with no parameters is referred to as a no-arg
constructor.
Circle() {
// optional statements
}
10
Constructors
Constructors are a special kind of methods that are
invoked to construct objects.
A constructor with no parameters is referred to as a no-arg
constructor.
//---------------------------Circle() {
}
//---------------------------Circle(double newRadius) {
radius = newRadius;
}
11
Constructors
Constructors are a special kind of methods that are
invoked to construct objects.
A constructor with no parameters is referred to as a no-arg
constructor.
//---------------------------Circle() {
}
//---------------------------Circle(double radius) {
this.radius = radius;
}
12
Constructor-method with three differences
·
Constructors must have the same name as the
class itself.
·
Constructors do not have a return type—not
even void.
·
Constructors are invoked using the new
operator when an object is created. Constructors
play the role of initializing objects.
13
Creating Objects Using
Constructors
Circle class differs from other classes already
discussed:
It does not have a main() method and
therefore cannot be run.
It is a definition used to declare and create
Circle objects.
HOW? Using the new operator. See next slide
14
Creating Objects Using
Constructors
Syntax: new ClassName();
Example: To create anonymous objects
new Circle()
new Circle(5.0)
15
Default Constructor
A class may be declared without constructors. In
this case, a no-arg constructor with an empty body
is implicitly declared in the class. This constructor,
called a default constructor, is provided
automatically only if no constructors are explicitly
declared in the class.
16
Declaring Object Reference Variables
To reference an object, assign the object (being
created using new operator) to a reference variable.
To declare a reference variable, use the syntax:
ClassName objectRefVar;
Example:
Circle myCircle;
17
Declaring/Creating Objects
in a Single Step
ClassName objectRefVar = new ClassName();
Example:
Assign object reference
Create an object
Circle myCircle = new Circle();
18
Accessing Objects

Referencing the object’s data:
objectRefVar.data
e.g., myCircle.radius

Invoking the object’s method:
objectRefVar.methodName(arguments)
e.g., myCircle.getArea()
19
Practical problem
Write a Java program that constructs an object
with radius 5 and an object with radius 10 and
display the radius and area of each one of the
circles.
 Change the radius of the second object to 100 and
display the new radius and area.
 Add a new method to return the circumference of
the circle.


Hints: read next slide
20
Hints

Ver 1, project Circle1: One .java file, one class Circle with
methods:
–
–
–
–

two constructors,
method getArea()
method main().
See attached file Circle1.java
Version 2, project Circle2: One .java file, two classes:
– Circle with methods: two constructors and method getArea()
– TestCircle with method main() only
– See attached files TestCircle.java(OK) and Circle2.java(notOK)

Version 3, project Circle3:
– Two classes Circle and TestCircle, as in version 2
– Each class saved in a separate file, but in the same package
21
Hints
When a program contains more than 1 class, how to
proceed?
 A program contains two classes. The first is
TestCircle, is the main class. Its sole purpose is to
test the second class Circle. Every time you run the
program, JRE invokes the main() method in the
main class.

You can put two or more classes into one file, but
only one class in the file can be a public class.
Furthermore, the public class must have the same name
as the file name.

The main class contains the main() method that
creates objects of the second class.

There are many ways to write Java programs. For
instance, you can combine two classes into one

22
Caution
Recall that you use
Math.methodName(arguments) (e.g., Math.pow(3, 2.5))
to invoke a method in the Math class. Can you invoke getArea() using
Circle.getArea()? The answer is no. All the methods used before this
chapter are static methods, which are defined using the static keyword.
However, getArea() is non-static. It must be invoked from an object
using
objectRefVar.methodName(arguments) (e.g., myCircle.getArea()).
More explanations will be given in the section on “Static Variables,
Constants, and Methods.”
23
Reference Data Fields
The data fields can be of reference types. For example,
the following Student class contains a data field name of
the String type.
public class Student {
String name; // name has default value null
int age; // age has default value 0
boolean isScienceMajor; // isScienceMajor has default value false
char gender; // c has default value '\u0000'
}
24
The null Value
If a data field of a reference type does not
reference any object, the data field holds a
special literal value, null.
25
Default Value for a Data Field
The default value of a data field is:
null for a reference type,
0 for a numeric type,
false for a boolean type, and
'\u0000' for a char type.
However, Java assigns no default value to a local variable
inside a method (see next slide).
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println("name? " + student.name);
System.out.println("age? " + student.age);
System.out.println("isScienceMajor? " + student.isScienceMajor);
System.out.println("gender? " + student.gender);
}
}
26
Example
Java assigns no default value to a local variable
inside a method.
public class Test {
public static void main(String[] args) {
int x; // x has no default value
String y; // y has no default value
System.out.println("x is " + x);
System.out.println("y is " + y);
}
}
Compilation error: variables not
initialized
27
Differences between Variables of
Primitive Data Types and Object Types
int i = 1;
Circle c = new Circle(1);
Created using new Circle()
Primitive type
int i = 1
i
1
Object type
Circle c
c
reference
c: Circle
radius = 1
28
Copying Variables of Primitive
Data Types and Object Types
Primitive type assignment i = j
Before:
After:
i
1
i
2
j
2
j
2
Object type assignment c1 = c2
Before:
After:
c1
c1
c2
c2
c1: Circle
C2: Circle
c1: Circle
C2: Circle
radius = 5
radius = 9
radius = 5
radius = 9
29
Garbage Collection
As shown in the previous figure, after the
assignment statement c1 = c2, c1 points to
the same object referenced by c2. The
object previously referenced by c1 is no
longer referenced. This object is known as
garbage. Garbage is automatically
collected by JVM.
30
Garbage Collection, cont
TIP: If you know that an object is no
longer needed, you can explicitly assign
null to a reference variable for the
object. The JVM will automatically
collect the space if the object is not
referenced by any variable.
31
Instance Variables and
Instance Methods
Instance variables belong to a specific
instance.
Instance methods are invoked by an
instance of the class.
32
Static Variables, Constants,
and Methods
Static variables are shared by all the instances of the
class.
Static methods are not tied to a specific object.
Static constants are final variables shared by all the
instances of the class.
To declare static variables, constants, and methods, use
the static modifier.
33
Static Variables, Constants,
and Methods, cont.
instantiate
circle1
radius = 1
numberOfObjects = 2
Circle
Memory
1
radius: double
numberOfObjects: int
getNumberOfObjects(): int
+getArea(): double
UML Notation:
+: public variables or methods
underline: static variables or methods
instantiate
radius
2
numberOfObjects
5
radius
After two Circle
objects were created,
numberOfObjects
is 2.
circle2
radius = 5
numberOfObjects = 2
34
Example of
Using Instance and Class Variables
and Method
Objective: Demonstrate the roles of instance
and class variables and their uses.
Task: Modify the Circle program by adding
a class variable numberOfObjects to
track the number of Circle objects
created.
35
Visibility modifiers
private: private members are accessible only in the
class itself
package: package members are accessible in classes in
the same package and the class itself (by default)
protected: protected members are accessible in
classes in the same package, in subclasses of the class,
and in the class itself
public: public members are accessible anywhere the
class is accessible
36
Pencil
public class Pencil {
public String color = “red”;
public int length;
public float diameter;
private float price;
public static long nextID = 0;
public void setPrice (float newPrice) {
price = newPrice;
}
}
CreatePencil
public class CreatePencil {
public static void main (String args[]){
Pencil p1 = new Pencil();
p1.price = 0.5; // illegal
}
}
37
Visibility Modifiers and
Accessor/Mutator Methods
By default, the class, variable, or method can be
accessed by any class in the same package.

public
The class, data, or method is visible to any class in any
package.

private
The data or methods can be accessed only by the declaring
class.
The get and set methods are used to read and modify
private properties.
38
Accessor/Mutator Methods

Coloquially,
– a get method is referred to as a getter (or accessor)
– a set method is referred to as a setter (or mutator)

A get method has following signature:
– public returntype getPropertyName()

If return type is boolean, get method is like:
–

public boolean isPropertyName()
A set method has following signature:
– public void setPropertyName(dataType propertyValue)
39
Accessor/Mutator Methods
 See
file ModernObjectProg1.java
 Modify
the Circle class with get /accessor/
method and set /mutator or mutators/
method(s) associated to the rad data field
for the radius of the circle.
40
package p1;
public class C1 {
public int x;
int y;
private int z;
public void m1() {
}
void m2() {
}
private void m3() {
}
}
package p2;
public class C2 {
void aMethod() {
C1 o = new C1();
can access o.x;
can access o.y;
cannot access o.z;
can invoke o.m1();
can invoke o.m2();
cannot invoke o.m3();
can invoke o.m1();
cannot invoke o.m2();
cannot invoke o.m3();
}
}
package p1;
class C1 {
...
}
public class C3 {
void aMethod() {
C1 o = new C1();
can access o.x;
cannot access o.y;
cannot access o.z;
}
}
package p2;
public class C2 {
can access C1
}
public class C3 {
cannot access C1;
can access C2;
}
The private modifier restricts access to within a class, the
default modifier restricts access to within a package, and the
public modifier enables unrestricted access.
41
NOTE
An object cannot access its private members, as shown in (b). It is
OK, if the object is declared in its own class, as shown in (a).
public class Foo {
private boolean x;
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.x);
System.out.println(foo.convert());
}
public class Test {
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.x);
System.out.println(foo.convert(foo.x));
}
}
private int convert(boolean b) {
return x ? 1 : -1;
}
}
(a) This is OK because object foo is used inside the Foo class
(b) This is wrong because x and convert are private in Foo.
42
Why Data Fields Should Be
private?
To protect data.
To make class easy to maintain.
43
Example of
Data Field Encapsulation
Circle
The - sign indicates
private modifier
-radius: double
The radius of this circle (default: 1.0).
-numberOfObjects: int
The number of circle objects created.
+Circle()
Constructs a default circle object.
+Circle(radius: double)
Constructs a circle object with the specified radius.
+getRadius(): double
Returns the radius of this circle.
+setRadius(radius: double): void
Sets a new radius for this circle.
+getNumberOfObject(): int
Returns the number of circle objects created.
+getArea(): double
Returns the area of this circle.
44
Immutable Objects and Classes
 If
the contents of an object cannot be
changed once the object is created, the
object s called an immutable object and the
class is called an immutable class.
 If you delete the set method(s) of the
Circle class and the radius data field is
qualified private, the class would be
immutable.
45
Passing Objects to Methods
 Passing
by value for primitive type value
(the value is passed to the parameter)
 Passing
by value for reference type value
(the value is the reference to the object)
46
Passing Objects to Methods, cont.
Stack
Space required for the
printAreas method
int times: 5
Circle c: reference
Space required for the
main method
int n: 5
myCircle: reference
Pass by value (here
the value is 5)
Pass by value
(here the value is
the reference for
the object)
Heap
A circle
object
47
The this Reference



Need to reference a class’s hidden variable in a method. A
property name is used as a parameter in a set method for the
property
Hidden static variable is accessed using class name reference
Hidden instance variable is accessed using keyword this
class Foo {
int i= 5; static double k=0;
void setI(int i) {
this.i = i;
}
void setK(double k) {
Foo.k = k;
}
}
48
The this Reference
Keyword this can also use inside a constructor to invoke another constructor
of the same class.
public class Circle {
private double radius;

public Circle (double radius) {
this.radius = radius;
}
public Circle()
this(1.0);
}
{
public getArea() {
return this.radius * this.radius * Math.PI;
}
}
// this(1.0) has to appear first in the constructor before any other statements.
49
Class Abstraction
 Java
provides many levels of abstraction.
 Class
abstraction is the separation of class
implementation from the use of a class.
50
Array of Objects
Circle[] circleArray = new Circle[10];
An array of objects is actually an array of
reference variables. So invoking
circleArray[1].getArea() involves two
levels of referencing as shown in the next
figure. circleArray references to the entire
array. circleArray[1] references to a
Circle object.
51
Array of Objects, cont.
Circle[] circleArray = new Circle[10];
circleArray
reference
circleArray[0]
circleArray[1]
Circle object 0
…
Circle object 1
circleArray[9]
Circle object 9
52
Practical session
Problem: Write a program to develop user
defined type Rectangle class:
Data fields: int m_length, m_width
Methods:
no-arg constructor, 2-arg constructor
accessor methods and mutator methods
getArea() method and getPerimeter() meethod
Hint: Transform Circle1.java program to
Rectangle1.java program
53
Practical session
Problem: Write a program to develop user
defined type Rectangle class:
Data fields: int m_length, m_width
Methods:
no-arg constructor, 2-arg constructor
accessor methods and mutator methods
getArea() method and getPerimeter() meethod
Hint: Transform TestCircle.java program to
TestRectangle.java program
54
Practical session
Problem: Write a program to develop user
defined type Counter class:
Data field: int m_count
Methods:
no-arg constructor
1-arg constructor
void incCount()
get method /accessor/
set method /mutator/
55
Practical session
 //
One class combines/includes both:
 // user defined class Counter
 //
+
 // tester class functionality as method main(…)
 //
56
Practical session
IDE NetBeans:
Project name: Counter1 – user specified
IDE generates: package name counter1
class name Counter1
Class includes Counter1 functionality
+
tester method main(…)
57
Practical session
IDE Eclipse:
Project name: Counter1 – user specified
Package name: counter1 – user specified
Class name: Counter – user specified
Class includes Counter functionality
+
tester method main(…)
58
Practical session
 //
Two separate classes, same package:
 //
one for user defined class Counter
 //
 //
one tester class as method main(....)
 //
59
Practical session
IDE NetBeans:
Project name: Counter2 – user specified
IDE generates: package name counter2
class name Counter2 (main class)
To add new class:
File > New File > Choose category: Java,
File type : Java class
Name: Counter
60
Practical session
IDE Eclipse:
Project name: Counter2 – user specified
Package name: counter2 – user specified
Class name: TestCounter – user specified
Class name: Counter – user specified
61
Thank You
for
Your attention!
62