Notes, Part VII (Inheritance)
Download
Report
Transcript Notes, Part VII (Inheritance)
The complete Circle class
public class Circle {
public double x,y; // center coordinates
public double r; // radius
// the methods
public double circumference()
{ return 2*3.14*r; }
public double area() { return 3.14*r*r; }
}
1
Using the Circle class
public class TestCircle {
public static void main(String args[]) {
Circle c;
c = new Circle();
c.x = 2.0; c.y = 2.0; c.r = 5.5;
System.out.println(c.area());
}
}
2
The this keyword
this refers to the current object
In the Circle class, the following
definitions for area() are equivalent:
public double area() { return 3.14 * r * r; }
public double area() { return 3.14 * this.r * this.r; }
Using the keyword clarifies that you are
referring to a variable inside an object
3
Constructors
A constructor is a special type of
method
has the same name as the class
It is called when an object is created
new Circle(); // “calls” the Circle()
method
If no constructor is defined, a default
constructor that does nothing is
implemented
4
A constructor for the
Circle class
public class Circle {
public double x,y; // center coordinates
public double r; // radius
public Circle() {
// sets default values for x, y, and r
this.x = 0.0; this.y = 0.0; this.r = 1.0;
}
...
}
5
A constructor with
parameters
public class Circle {
…
public Circle(double x, double y, double z) {
this.x = x; this.y = y; this.r = z;
// using this is now a necessity
}
...
}
6
Using the different
constructors
Circle c, d;
c = new Circle();
// radius of circle has been set to 1.0
System.out.println(c.area());
d = new Circle(1.0,1.0,5.0);
// radius of circle has been set to 5.0
System.out.println(d.area());
7
Method Overloading
In Java, it is possible to have several
method definitions under the same name
but the signatures should be different
Signature:
the name of the method
the number of parameters
the types of the parameters
8
Syntax Summary
Constructor without a parameter
public classname() {
*body of the constructor
}
9
Syntax Summary
Overloading constructors
public classname(type variablename) {
*body of constructor
}
public classname(
type variable-name, type variable-name) {
*body of constructor
}
10
Encapsulation
A key OO concept: “Information Hiding”
Key points
The user of an object should have access
only to those methods (or data) that are
essential
Unnecessary implementation details should
be hidden from the user
In Java, use public and private
11
Access Modifiers
public
a public variable/method is available for use
outside the class it is defined in
private
a private variable/method may be used only
within the class it is defined in
12
The Circle class Revisited
public class Circle {
private double x,y; // center coordinates
private double r; // radius
// ...
}
// when using the Circle class ...
Circle c;
c.r = 1.0; // this statement is not allowed
13
Outside access
to private data
No direct access
Define (public) set and get methods
instead or initialize the data through
constructors
Why?
If you change your mind about the names
and even the types of these private data, the
code using the class need not be changed
14
Set and Get Methods
Variables/attributes in a class are often
not declared public
Instead:
define use a (public) set method to assign a
value to a variable
define a get method to retrieve that value
Consistent with encapsulation
15
Set and Get Methods for
Radius
public class Circle {
// ...
private double r; // radius
// …
public void setRadius(double r) { this.r = r; }
public double getRadius() { return this.r; }
// ...
}
16
Inheritance
17
Subclasses and
Inheritance
Inheritance:
programming language feature that allows
for the implicit definition of variables/methods
for a class through an existing class
In Java, use the extends keyword
public class B extends A { … }
objects of subclass B now have access* to
variables and methods defined in A
18
The EnhancedCircle class
public class EnhancedCircle extends Circle {
// as if area(), circumference(), setRadius() and getRadius()
// automatically defined; x,y,r are also present (but are private
// to the the Circle class)
private int color;
public void setColor(int c) { color = c; }
public void draw() { … }
public double diameter() {
return getRadius()*2; }
}
19
Using a Subclass
EnhancedCircle c;
c = new EnhancedCircle();
// Circle() constructor
// implicitly invoked
c.setColor(5);
c.setRadius(6.6);
System.out.println(c.area());
System.out.println(c.diameter());
c.draw();
20
Applets and Inheritance
Java Applets that we write extend the
Applet class (defined in package
java.applet)
Methods such as add() (for adding visual
components) are actually methods
available in the Applet class
init(), action(), and paint() are also
available but can be overridden
21
Class Hierarchy
Subclass relationship forms a hierarchy
Example: TextField class
TextField extends TextComponent which
extends Component which extends Object
Object is the topmost class in Java
Exercise (use javap):
determine where the methods setText(),
getText(), hide(), and show() are defined
22
Method Overriding
A method (with a given signature) may be
overridden in a subclass
Suppose class B extends A
let void operate() be a method defined in A
void operate() may be defined in B
objects of class A use A’s operate()
objects of class B use B’s operate()
23
Dynamic Binding
Let A be a superclass of subclasses B and
C
A variable of class A may refer to
instances of A, B, and C
Java facilitates the calling of the
appropriate method at run time
Example
A v; … v.operate();
24
Constructors and
Superclasses
Suppose B extends A
new B() calls B’s constructor
how about A’s constructor ?
Rule
the constructor of a superclass is always
invoked before the statements in the
subclass’ constructor are executed
25
super()
Used to call a superclass’ constructor
Implicitly included when not indicated
If B extends A, the following are equivalent:
public B() {
// body of constructor
}
public B() {
super();
// body of constructor
}
26
Calling a particular
Constructor
Use super with parameters if a particular
constructor should be called
Example:
public class BlueButton extends Button {
public BlueButton(String s) {
super(s); // without this, super() is called (label-less)
setBackground(Color.blue);
}…
}
27
Default Constructors
When no constructors are defined
a default constructor with no parameters is
implicitly included
If at least one constructor is defined, with
or without parameters
a default constructor will not apply
28
Syntax Summary
Extends and Super
public class subclass extends superclass {
public subclassconstructor(...) {
super(...);
*body of constructor
}
...
}
29
Abstract Classes and
Interfaces
30
“Incomplete” Classes
Objects vs “concepts”
Example: Circle and Shape
circles are shapes (Circle extends Shape)
shapes (such as circle) have area and
circumference
how are area() and circumference() defined
at the level of Shape?
Shape has incomplete definitions
31
The Shape class
One option
make area() and circumference() methods
that do nothing (perhaps return 0.0)
Circle could extend shape and then override
these methods
problems ?
Another option available in Java
abstract class
32
Abstract Class
Same as class
but it is possible to omit method bodies
syntax:
abstract before class (and method headers)
semicolon at the end of the method headers
Rules
may declare variables of abstract classes
instantiation not possible (new will not
work)
subclasses must override incomplete
33
The Shape class
public abstract class Shape {
private int color;
public void setColor(int c) { color = c; }
public abstract double circumference();
public abstract double area();
}
34
The Circle class
public class Circle extends Shape {
private double r;
…
// the compiler will complain if the ff methods are not defined
public double circumference()
{ return 2*3.14*r; }
public double area() { return 3.14*r*r; }
}
35
Using Shape and Circle
Circle c;
Shape s;
c = new Circle(); // ok
s = new Shape(); // not allowed -- Shape is abstract
s = new Circle(); // ok because Circle is a
// subclass of Shape
36
Another Example:
Function Plotter
Define an abstract class FunctionPlotter
that plots a mathematical function f()
a method plot() plots a function f() by
evaluating f() on some x values
make f() an abstract method, i.e.,
public abstract double f(double x);
Next, define classes that extend
FunctionPlotter and complete the
definition of f()
37
Function Plotter, continued
LinePlotter defines f() as follows:
public double f(double x) { return x; }
SquarePlotter defines f() as follows:
public double f(double x) { return x*x; }
Note: LinePlotter, SquarePlotter (and Circle,
in the previous example) are called
concrete classes
38
Why Use Abstract
Classes?
More robust code
no need to use “new” on anything it
shouldn’t be used on
Enforces discipline
Abstract classes cannot be instantiated;
they are meant to be extended
Anyone who extends an abstract class is
now forced to define the incomplete parts
39
Interface
None of the methods have bodies
Instance variables not allowed
Syntax
interface not class
no need to put abstract before method
headers
implements not extends on the complete
(concrete) class
40
Rules on Interfaces
May declare variables whose type is an
interface
objects that are instances of classes that
implement the interface may be referred to
by such variables
Instantiation not possible
Implementing class must define all
methods
41
Example
public interface Switch {
public void turnOn();
public void turnOff();
public boolean isOn();
}
public class Computer implements Switch {
// must define turnOn(), turnOff(), and isOn() in this class
...
}
42
Notes on Interfaces
Interface variables can be declared
e.g., Switch s;
Interfaces cannot be instantiated
Interface variables may refer to objects of
classes that implement the interface
e.g., s = new Computer();
A class may implement several interfaces
43
Multiple Inheritance
Other OO languages such as C++ allow
several superclasses for a given class
not possible in Java
Implementation problems
common members in superclasses
In Java
use interfaces
it is possible to implement several interfaces
with no “conflicts”
44
Anonymous Classes
Feature available in JDK 1.1 or higher
versions of Java
Useful when
Only one object of the concrete class needs
to be created
It is not too important to have a name for
the concrete class
45
Back to FunctionPlotter
Example
Without anonymous classes, the
LinePlotter class would look like this
public class LinePlotter extends FunctionPlotter {
public double f(double x) { return x; }
}
And then, in some main program …
LinePlotter lp = new LinePlotter();
lp.plot();
46
Using Anonymous Classes
FunctionPlotter lp = new FunctionPlotter() {
public double f(double x) { return x; }
}
lp.plot();
// no need to explicitly define a LinePlotter class
47
Syntax Summary
Anonymous classes
abstractclassorinterface var =
new abstractclassorinterface() {
// complete the definitions of abstract
// methods here
}
48
The Java Event Models
49
Event-Driven Programming
in Java
Specifying actions for events performed
on the GUI
most common example: clicking on a button
The Java Event Models
JDK 1.0.2 (deprecated)
JDK 1.1 and the new event model
50
Sample Applet:
HideAndShow
Visual objects
text field with some text
two buttons
Actions performed
hide button causes text field to disappear
show button makes text field reappear
51
JDK 1.0.2
What needs to be done
init() method: create visual components and
add them to the applet
action(): determine which button was clicked
and indicate associated action
Problems
nested if-statement in action() inefficient
code associated with visual object far from
its definition
52
Listeners and JDK 1.1
Listener
responsible for processing UI events
specifies actions that corresponds to an
event
JDK 1.1
code for listeners made explicit
need to associate a listener for every visual
object that the user interacts with
listener should implement method(s) that
specify corresponding actions
53
The Applet as the Listener
Follows JDK 1.0.2 event model
What needs to be done
init() method: as before but associate applet
as listener for both buttons
(addActionListener(this))
applet implements ActionListener interface
define actionPerformed() instead of action()
use e.getSource() instead of e.target to
distinguish between buttons pressed
Problems not addressed
54
“Third party” Listener
Different listener for each button
Listeners are separate objects
Two different definitions of
actionPerformed()
No need to distinguish between buttons
What needs to be done
create listener objects
add the objects as listeners for the buttons
use anonymous classes
55
The Button as the Listener
Create a new class (ActiveButton)
class extends Button and implements
ActionListener (contains actionPerformed())
actionPerformed() contains call to onClick()
addActionListener(this) in constructor of
class
Applet instantiates ActiveButton
onClick() or actionPerformed() is overridden
as appropriate
56
Who should be the
Listener?
The applet
no advantage except that old jdk1.0.2 code
translates easily to this technique
Third party
clearly indicates the role of the listeners
ActiveButton
encapsulates listener-related activity
applet code easier to read
57