Unit 6 - Inheritance and Interfaces with Review

advertisement
Unit 6
Textbook Chapter 9
The software crisis
• software engineering: The practice of developing, designing,
documenting, testing large computer programs.
• Large-scale projects face many issues:
•
•
•
•
•
getting many programmers to work together
getting code finished on time
avoiding redundant code
finding and fixing bugs
maintaining, improving, and reusing existing code
• code reuse: The practice of writing program code once and
using it in many contexts.
Object-Oriented Languages - OOP
• For a whirlwind tour of OOP, an object-oriented language is
supposed to include three major concepts:
• Encapsulation - is the ability to hide and protect data.
• Covered in Unit 6
• Inheritance - lets you design a class by deriving it from an existing
one. This feature allows you to reuse existing code without doing
copy and paste.
• Covered today
• Polymorphism - that there can be different forms of the same thing,
so that you could have one variable that could store several different
types of objects; or a method that accepts no arguments and
another method with the exact same name that accepts an integer
argument (and maybe another that accepts a string and a doubleprecision argument, etc.).
• Covered next class
Inheritance
• inheritance: A way to form new classes based on existing classes,
taking on their attributes/behavior.
• a way to group related classes
• a way to share code between two or more classes
• One class can extend another, absorbing its data/behavior.
• superclass: The parent class that is being extended.
• subclass: The child class that extends the superclass and inherits its
behavior.
• Subclass gets a copy of every field and method from superclass
Inheritance syntax
public class name extends superclass {
• Example:
public class ElectricCar extends Car {
...
}
• By extending Car, each ElectricCar object now:
• receives a xpos, ypos, direction, radioVolumeLevel,
fuelState private fields and turn, drive, addFuel,
changeRadioVolume, and getRadioVolume methods
automatically
• can be treated as an Car by client code (seen later)
The Object Class
• The Object class sits at the top of the class hierarchy tree in
the Java development environment.
• Every class in the Java system is a descendent (direct or
indirect) of the Object class.
• The Object class defines the basic state and behavior that all
objects must have,
•
•
•
•
such as the ability to compare oneself to another object,
to convert to a string, to wait on a condition variable,
to notify other objects that a condition variable has changed,
return the object's class.
The Object Class cont.
• Everything in Java is a class. If a class has fields that are
instance variables, then they are stored inside dynamically
allocated objects created by new to represent instances of the
class. However, when Java documentation uses the name
"Object" capitalized like a proper name, then it is referencing a
special class built into the language.
• The Object class is the parent of all other classes. When any
new class definition omits the extends keyword, it implicitly
extends the Object class. A reference variable declared to
designate member of the Object class can actually point to
any dynamically allocated object from any class.
Overriding methods
• override: To write a new version of a method in a subclass that
replaces the superclass's version.
• No special syntax required to override a superclass method.
Just write a new version of it in the subclass.
public class ElectricCar extends Car {
// overrides toString method in Car/Object class
public String toString() {
return “Electric: State of Charge: “ + charge;
}
...
}
Class Object
• All types of objects have a superclass named Object.
• Every class implicitly extends Object
• The Object class defines several methods:
• public String toString()
Returns a text representation of the object,
often so that it can be printed.
• public boolean equals(Object other)
Compare the object to any other for equality.
Returns true if the objects have equal state.
Recall: comparing objects
• The == operator does not work well with objects.
== compares references to objects, not their state.
It only produces true when you compare an object to itself.
Point p1 = new Point(5, 3);
Point p2 = new Point(5, 3);
if (p1 == p2) {
// false
System.out.println("equal");
}
p1
p2
x
5
y
3
5
y
3
...
x
...
The equals method
• The equals method compares the state of objects.
if (str1.equals(str2)) {
System.out.println("the strings are
equal");
}
• But if you write a class, its equals method behaves like ==
if (p1.equals(p2)) {
// false :-(
System.out.println("equal");
}
• This is the behavior we inherit from class Object.
• Java doesn't understand how to compare Points by default.
Flawed equals method
• We can change this behavior by writing an equals method.
• Ours will override the default behavior from class Object.
• The method should compare the state of the two objects and
return true if they have the same x/y position.
• A flawed implementation:
public boolean equals(Point other) {
if (x == other.x && y == other.y) {
return true;
} else {
return false;
}
}
Flaws in our method
• The body can be shortened to the following:
return x == other.x && y == other.y;
• It should be legal to compare a Point to any object
(not just other Points):
// this should be allowed
Point p = new Point(7, 2);
if (p.equals("hello")) {
// false
...
• equals should always return false if a non-Point is passed.
equals and Object
public boolean equals(Object name) {
statement(s) that return a boolean value ;
}
• The parameter to equals must be of type Object.
• Object is a general type that can match any object.
• Having an Object parameter means any object can be passed.
• If we don't know what type it is, how can we compare it?
Type-casting objects
• Solution: Type-cast the object parameter to a Point.
public boolean equals(Object o) {
Point other = (Point) o;
return x == other.x && y == other.y;
}
• Casting objects is different than casting primitives.
• Really casting an Object reference into a Point reference.
• Doesn't actually change the object that was passed.
• Tells the compiler to assume that o refers to a Point object.
Another flawed version
• Another flawed equals implementation:
public boolean equals(Object o) {
return x == o.x && y == o.y;
}
• It does not compile:
Point.java:36: cannot find symbol
symbol : variable x
location: class java.lang.Object
return x == o.x && y == o.y;
^
• The compiler is saying,
"o could be any object. Not every object has an x field."
The instanceof keyword
if (variable instanceof type) {
statement(s);
}
• Asks if a variable refers
to an object of a given type.
• Used as a boolean test.
expression
result
s instanceof Point
false
s instanceof String
true
p instanceof Point
true
p instanceof String
String s = "hello";
Point p = new Point(); p instanceof Object
s instanceof Object
false
true
true
null instanceof String false
null instanceof Object false
Final equals method
// Returns whether o refers to a Point object
with
// the same (x, y) coordinates as this Point.
public boolean equals(Object o) {
if (o instanceof Point) {
// o is a Point; cast and compare it
Point other = (Point) o;
return x == other.x && y == other.y;
} else {
// o is not a Point; cannot be equal
return false;
}
}
Summary
• What is inheritance?
• A way to form new classes based on existing classes, taking on their
attributes/behavior.
• a way to group related classes
• a way to share code between two or more classes
• Why use inheritance?
• Code reuse
• What class does every class inherit from?
• Object
• What does it mean to override a method?
• To write a new version of a method in a subclass that replaces the
superclass's version.
• How do you compare two objects?
• equals method
• How do you determine the type of an object?
• instanceof method
Inheritance – Exercise
Background
• This assignment demonstrates the notion of inheritance using Java.
Your boss has requested that you design an application that needs a
Car class. Later that same day, the designers tell you that you now need
a Truck class. Your gut tells you that they will probably want a golf cart
class by the end of the week. How can you leverage the common
pieces of these three types of objects by using one generic base class?
Objective for this Lab
• You are going to create four small Java classes; a driver class that has
the static main method, a regular Java class named Vehicle, then two
classes named Car and Truck, respectively that inherit from Vehicle
• class.
•
•
•
•
Driver
Vehicle
Car
Truck
Your Test Harness class with the static main method
Your generic primary super class
Your car class that inherits the vehicle class
Your truck class that inherits the vehicle class
Inheritance – Exercise Cont.
• Required Methods
• Your application needs the following methods.
•
•
•
•
•
•
•
•
•
•
•
start()
stop()
turn()
getSpeed()
setSpeed()
increaseSpeed()
decreaseSpeed()
openTrunk()
closeTrunk()
openTailgate()
closeTailgate()
• The generic Vehicle only contains the generic methods, start, stop, getSpeed, etc. The
Car class contains the trunk methods and the Truck class contains the tailgate methods.
• Most methods simply need to display a simple message so you know it is being
executed, like this:
•
•
•
•
public void stop()
{
System.out.println("Stopping");
}
• The setSpeed, getSpeed and increaseSpeed methods need a little Java code to set
instance variables.
Learning Objectives
• Create a method that uses the super keyword.
• Develop a constructor that calls its superclass’s constructor.
• Differentiate between inheritance and polymorphism.
Review from last class
• What is inheritance?
• A way to form new classes based on existing classes, taking on
their attributes/behavior.
• a way to group related classes
• a way to share code between two or more classes
• Why use inheritance?
• Code reuse
• What class does every class inherit from?
• Object
• What does it mean to override a method?
• To write a new version of a method in a subclass that replaces the
superclass's version.
Calling overridden methods
• Subclasses can call overridden methods with super
super.method(parameters)
• Example:
public class Tabby extends Cat {
public String toString(){
return "Tabby";
}
public String makeSound(){
return super.makeSound() + " and Meowww";
}
}
Inheritance and constructors
• When you add a constructor to the superclass that has
parameters, your subclasses may not compile. For example,
public Animal(int age) {
this.age = age;
}
Implicit super constructor Animal() is undefined for default
constructor. Must define an explicit constructor
• The short explanation: Once we write a constructor (that requires
parameters) in the superclass, we must now write constructors
for our subclasses as well.
• The long explanation: (next slide)
The detailed explanation
• Constructors are not inherited.
• Subclasses don't inherit the Animal(int) constructor.
• Subclasses receive a default constructor that contains:
public Dog() {
super();
}
// calls Animal() constructor
• But our Animal(int) replaces the default Animal().
• The subclasses' default constructors are now trying to call a nonexistent default Animal constructor.
Calling superclass constructor
super(parameters);
• Example:
public class Lawyer extends Employee {
public Lawyer(int years) {
super(years); // calls Employee
constructor
}
...
}
• The super call must be the first statement in the constructor.
• Exercise: Make a similar modification to the Marketer class.
Polymorphism
• Why use it?
• Create extensible programs
• So that your program can more easily handle future changes
• Possibly, reduce the quantity of required code
Polymorphism
• polymorphism: Ability for the same code to be used with
different types of objects and behave differently with each.
• System.out.println can print any type of object.
• Each one displays in its own way on the console.
• CritterMain can interact with any type of critter.
• Each one moves, fights, etc. in its own way.
Coding with polymorphism
• A variable of type T can hold an object of any subclass of T.
Animal skyWireFox= new Dog();
• You can call any methods from the Animal class on
skyWireFox.
• When a method is called on critter, it behaves as a Dog.
System.out.println(skyWireFox);
// Woof
Polymorphism and parameters
• You can pass any subtype of a parameter's type.
public class EmployeeMain {
public static void main(String[] args) {
Lawyer lisa = new Lawyer();
Secretary steve = new Secretary();
printInfo(lisa);
printInfo(steve);
}
public static void printInfo(Employee empl) {
System.out.println("salary: " + empl.getSalary());
System.out.println("v.days: " + empl.getVacationDays());
System.out.println("v.form: " + empl.getVacationForm());
System.out.println();
}
}
OUTPUT:
salary: 50000.0
v.days: 15
v.form: pink
salary: 50000.0
v.days: 10
v.form: yellow
Polymorphism and arrays
• Arrays of superclass types can store any subtype as elements.
public class EmployeeMain2 {
public static void main(String[] args) {
Employee[] e = { new Lawyer(),
new Secretary(),
new Marketer(), new LegalSecretary() };
for (int i = 0; i < e.length; i++) {
System.out.println("salary: " + e[i].getSalary());
System.out.println("v.days: " + e[i].getVacationDays());
System.out.println();
}
}
}
Output:
salary:
v.days:
salary:
v.days:
salary:
v.days:
salary:
v.days:
50000.0
15
50000.0
10
60000.0
10
55000.0
10
Polymorphism problems
• 4-5 classes with inheritance relationships are shown.
• A client program calls methods on objects of each class.
• You must read the code and determine the client's output.
• Look for this on an exam near you.
•
A polymorphism problem
Suppose that the following four classes have been declared:
public class Foo {
public void method1() {
System.out.println("foo 1");
}
public void method2() {
System.out.println("foo 2");
}
public String toString() {
return "foo";
}
}
public class Bar extends Foo {
public void method2() {
System.out.println("bar 2");
}
}
public class Baz extends Foo {
public void method1() {
System.out.println("baz 1");
}
public String toString() {
return "baz";
}
}
public class Mumble extends Baz {
public void method2() {
System.out.println("mumble 2");
}
}
•
What would be the output of the following client code?
Foo[] pity = {new Baz(), new Bar(), new Mumble(), new Foo()};
for (int i = 0; i < pity.length; i++) {
System.out.println(pity[i]);
pity[i].method1();
pity[i].method2();
System.out.println();
}
Polymorphism answer
Foo[] pity = {new Baz(), new Bar(), new Mumble(), new
Foo()};
for (int i = 0; i < pity.length; i++) {
System.out.println(pity[i]);
pity[i].method1();
pity[i].method2();
System.out.println();
}
• Output:
baz
baz 1
foo 2
foo
foo 1
bar 2
baz
baz 1
mumble 2
foo
foo 1
foo 2
Diagramming the classes
• Add classes from top (superclass) to bottom (subclass).
• Include all inherited methods.
Finding output with tables
method
Foo
Bar
Baz
Mumble
method1
foo 1
foo 1
baz 1
baz 1
method2
foo 2
bar 2
foo 2
mumble 2
toString
foo
foo
baz
baz
Summary
• What keyword do you use to call methods in the superclass?
• super
• i.e. super.makeSound();
• When you add a constructor with parameters to the
superclass, why do you get a compiler error in your
subclasses?
• Subclasses don't inherit the parameter constructor.
• Subclasses get a constructor that calls the superclass parameter
less constructor, which doesn’t exist now.
• What is polymorphism?
• Ability for the same code to be used with different types of
objects and behave differently with each.
Review
• What is inheritance?
• A way to form new classes based on existing classes, taking on
their attributes/behavior.
• a way to group related classes
• a way to share code between two or more classes
• Why use inheritance?
• Code reuse
• What is polymorphism?
• Ability for the same code to be used with different types of
objects and behave differently with each.
INTERFACES
Relatedness of types
Write a set of Circle, Rectangle, and Triangle classes.
• Certain operations that are common to all shapes.
perimeter
area
- distance around the outside of the shape
- amount of 2D space occupied by the shape
• Every shape has them but computes them differently.
Shape area, perimeter
• Rectangle (as defined by width w and height h):
area
perimeter
=wh
= 2w + 2h
• Circle (as defined by radius r):
area
perimeter
=  r2
=2r
• Triangle (as defined by side lengths a, b, and c)
area
perimeter
= √(s (s - a) (s - b) (s - c))
where s = ½ (a + b + c)
=a+b+c
Common behavior
• Write shape classes with methods perimeter and area.
• We'd like to be able to write client code that treats different
kinds of shape objects in the same way, such as:
• Write a method that prints any shape's area and perimeter.
• Create an array of shapes that could hold a mixture of the various
shape objects.
• Write a method that could return a rectangle, a circle, a triangle,
or any other shape we've written.
Interfaces
• interface: A list of methods that a class can implement.
• Inheritance gives you an is-a relationship and code-sharing.
• A Lawyer object can be treated as an Employee, and
Lawyer inherits Employee's code.
• Interfaces give you an is-a relationship without code sharing.
• A Rectangle object can be treated as a Shape.
• Analogous to the idea of roles or certifications:
• "I'm certified as a CPA accountant. That means I know how
to compute taxes, perform audits, and do consulting."
• "I'm certified as a Shape. That means I know how
to compute my area and perimeter."
Declaring an interface
public interface name {
public type name(type name, ..., type name);
public type name(type name, ..., type name);
...
}
Example:
public interface Shape {
public double area();
public double perimeter();
}
• abstract method: A method header without an
implementation.
• The actual body is not specified, to allow/force different classes
to implement the behavior in its own way.
Implementing an interface
public class name implements interface {
...
}
• Example:
public class Bicycle implements Vehicle {
...
}
• A class can declare that it implements an interface.
• This means the class must contain each of the abstract methods
in that interface. (Otherwise, it will not compile.)
(What must be true about the Bicycle class for it to compile?)
Interface requirements
• If a class claims to be a Shape but doesn't implement the
area and perimeter methods, it will not compile.
• Example:
public class Banana implements Shape {
...
}
• The compiler error message:
Banana.java:1: Banana is not abstract and
does not override abstract method area() in
Shape
public class Banana implements Shape {
^
EXERCISE
Interface Example
public interface Shape {
public abstract double area();
public abstract double perimeter();
}
Complete Circle class
// Represents circles.
public class Circle implements Shape {
private double radius;
// Constructs a new circle with the given radius.
public Circle(double radius) {
this.radius = radius;
}
// Returns the area of this circle.
public double area() {
return Math.PI * radius * radius;
}
}
// Returns the perimeter of this circle.
public double perimeter() {
return 2.0 * Math.PI * radius;
}
Complete Rectangle class
// Represents rectangles.
public class Rectangle implements Shape {
private double width;
private double height;
// Constructs a new rectangle with the given
dimensions.
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// Returns the area of this rectangle.
public double area() {
return width * height;
}
}
// Returns the perimeter of this rectangle.
public double perimeter() {
return 2.0 * (width + height);
}
Complete Triangle class
// Represents triangles.
public class Triangle implements Shape {
private double a;
private double b;
private double c;
// Constructs a new Triangle given side lengths.
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
// Returns this triangle's area using Heron's
formula.
public double area() {
double s = (a + b + c) / 2.0;
return Math.sqrt(s * (s - a) * (s - b) * (s c));
}
}
// Returns the perimeter of this triangle.
public double perimeter() {
return a + b + c;
}
Interfaces + polymorphism
• Interfaces don't benefit the class so much as the client.
• Interface's is-a relationship lets the client use polymorphism.
public static void printInfo(Shape s) {
System.out.println("The shape: " + s);
System.out.println("area : " + s.area());
System.out.println("perim: " +
s.perimeter());
}
• Any object that implements the interface may be passed.
Circle circ = new Circle(12.0);
Rectangle rect = new Rectangle(4, 7);
Triangle tri = new Triangle(5, 12, 13);
printInfo(circ);
printInfo(tri);
printInfo(rect);
Shape[] shapes = {tri, circ, rect};
Summary
• What is an interface?
• A list of methods that a class can promise to implement.
• An interface is a collection of abstract methods.
• What is an abstract method?
• A method header without an implementation.
• The actual body is not specified, to allow/force different classes to
implement the behavior in its own way.
• What is required of a class implementing an interface?
• The class must contain each of the abstract methods in that interface.
(Otherwise, it will not compile.)
• How do interfaces let client’s use polymorphism?
•
Abstract Classes
• An abstract class is one that cannot be instantiated.
• You just cannot create an instance of the abstract class.
• If a class is abstract and cannot be instantiated, the class does not
have much use unless it is subclassed.
• This is typically how abstract classes come about during the design
phase. A parent class contains the common functionality of a
collection of child classes, but the parent class itself is too abstract
to be used on its own.
Abstract Classes
• Java Abstract classes are used to declare common
characteristics of subclasses.
• An abstract class cannot be instantiated.
• It can only be used as a superclass for other classes that
extend the abstract class. Abstract classes are declared with
the abstract keyword.
• All other functionality of the class still exists, and its fields,
methods, and constructors are all accessed in the same
manner.
• Abstract classes are used to provide a template or design for
concrete subclasses down the inheritance tree.
Declaring an abstract class
public abstract class name {
public abstract type name(type name, ..., type name);
public abstract type name(type name, ..., type name);
...
}
Example:
public abstract class Shape {
private String color;
public abstract double area();
public abstract double perimeter();
public Shape(){
color = "Red";
}
public Shape(String color){
this.color = color;
}
public String getFillColor(){
return color;
}
}
Abstract Classes vs Interfaces
• Similarities
• You cannot instantiate them.
• Contain abstract methods
• Differences
• A class can only derive from one class, whereas a class can
implement multiple interfaces
• Instance methods in an interface don’t require the abstract
keyword, as they are implicitly abstract, whereas in an abstract
class the abstract keyword is required for abstract methods.
• In abstract classes, you can declare fields that are not static and
final.
• Abstract classes can contain non-abstract methods, whose
implementation can be reused by subclasses.
Arraylist..
Java collections framework
Deciding between Abstract Class or Interface
• Consider using abstract classes if any of these statements apply to
your situation:
• You want to share code among several closely related classes.
• You expect that classes that extend your abstract class have many
common methods or fields, or require access modifiers other than
public (such as protected and private).
• You want to declare non-static or non-final fields. This enables you to
define methods that can access and modify the state of the object to
which they belong.
• Consider using interfaces if any of these statements apply to your
situation:
• You expect that unrelated classes would implement your interface.
For example, the interfaces Comparable and Cloneable are
implemented by many unrelated classes.
• You want to take advantage of multiple inheritance of type.
Summary
• What keyword do you use to designate a class is abstract?
• abstract
• Name two similarities of interfaces and abstract classes?
• They contain abstract methods
• You cannot instantiate them
• Name two differences of interfaces and abstract classes?
• A class can only derive from one class, whereas a class can
implement multiple interfaces
• Instance methods in an interface don’t require the abstract
keyword, as they are implicitly abstract, whereas in an abstract class
the abstract keyword is required for abstract methods.
• In abstract classes, you can declare fields that are not static and final.
• Abstract classes can contain non-abstract methods, whose
implementation can be reused by subclasses.
UNIT REVIEW
Topics
1. Inheritance
1.
2.
3.
4.
5.
6.
7.
8.
Superclass and subclass
Object class
Overriding methods
Type casting objects
Super keyword
Polymorphism
Interfaces
Abstract Classes
Inheritance
• inheritance: A way to form new classes based on existing classes,
taking on their attributes/behavior.
• a way to group related classes
• a way to share code between two or more classes
• One class can extend another, absorbing its data/behavior.
• superclass: The parent class that is being extended.
• subclass: The child class that extends the superclass and inherits its
behavior.
• Subclass gets a copy of every field and method from superclass
Inheritance syntax
public class name extends superclass {
• Example:
public class ElectricCar extends Car {
...
}
• By extending Car, each ElectricCar object now:
• receives a xpos, ypos, direction, radioVolumeLevel,
fuelState private fields and turn, drive, addFuel,
changeRadioVolume, and getRadioVolume methods
automatically
• can be treated as an Car by client code (seen later)
The Object Class
• The Object class sits at the top of the class hierarchy tree in
the Java development environment.
• Every class in the Java system is a descendent (direct or
indirect) of the Object class.
• The Object class defines the basic state and behavior that all
objects must have,
•
•
•
•
such as the ability to compare oneself to another object,
to convert to a string, to wait on a condition variable,
to notify other objects that a condition variable has changed,
return the object's class.
Overriding methods
• override: To write a new version of a method in a subclass that
replaces the superclass's version.
• No special syntax required to override a superclass method.
Just write a new version of it in the subclass.
public class ElectricCar extends Car {
// overrides toString method in Car/Object class
public String toString() {
return “Electric: State of Charge: “ + charge;
}
...
}
Type-casting objects
• Solution: Type-cast the object parameter to a Point.
public boolean equals(Object o) {
Point other = (Point) o;
return x == other.x && y == other.y;
}
• Casting objects is different than casting primitives.
• Really casting an Object reference into a Point reference.
• Doesn't actually change the object that was passed.
• Tells the compiler to assume that o refers to a Point object.
Calling overridden methods
• Subclasses can call overridden methods with super
super.method(parameters)
• Example:
public class Tabby extends Cat {
public String toString(){
return "Tabby";
}
public String makeSound(){
return super.makeSound() + " and Meowww";
}
}
Calling superclass constructor
super(parameters);
• Example:
public class Lawyer extends Employee {
public Lawyer(int years) {
super(years); // calls Employee
constructor
}
...
}
• The super call must be the first statement in the constructor.
• Exercise: Make a similar modification to the Marketer class.
Polymorphism
• polymorphism: Ability for the same code to be used with
different types of objects and behave differently with each.
• System.out.println can print any type of object.
• Each one displays in its own way on the console.
• CritterMain can interact with any type of critter.
• Each one moves, fights, etc. in its own way.
Coding with polymorphism
• A variable of type T can hold an object of any subclass of T.
Animal skyWireFox= new Dog();
• You can call any methods from the Animal class on
skyWireFox.
• When a method is called on critter, it behaves as a Dog.
System.out.println(skyWireFox);
// Woof
Interfaces
• interface: A list of methods that a class can implement.
• Inheritance gives you an is-a relationship and code-sharing.
• A Lawyer object can be treated as an Employee, and
Lawyer inherits Employee's code.
• Interfaces give you an is-a relationship without code sharing.
• A Rectangle object can be treated as a Shape.
• Analogous to the idea of roles or certifications:
• "I'm certified as a CPA accountant. That means I know how
to compute taxes, perform audits, and do consulting."
• "I'm certified as a Shape. That means I know how
to compute my area and perimeter."
Declaring an interface
public interface name {
public type name(type name, ..., type name);
public type name(type name, ..., type name);
...
}
Example:
public interface Shape {
public double area();
public double perimeter();
}
• abstract method: A method header without an
implementation.
• The actual body is not specified, to allow/force different classes
to implement the behavior in its own way.
Abstract Classes
• Java Abstract classes are used to declare common
characteristics of subclasses.
• An abstract class cannot be instantiated.
• It can only be used as a superclass for other classes that
extend the abstract class. Abstract classes are declared with
the abstract keyword.
• All other functionality of the class still exists, and its fields,
methods, and constructors are all accessed in the same
manner.
• Abstract classes are used to provide a template or design for
concrete subclasses down the inheritance tree.
Declaring an abstract class
public abstract class name {
public abstract type name(type name, ..., type name);
public abstract type name(type name, ..., type name);
...
}
Example:
public abstract class Shape {
private String color;
public abstract double area();
public abstract double perimeter();
public Shape(){
color = "Red";
}
public Shape(String color){
this.color = color;
}
public String getFillColor(){
return color;
}
}
Problem #1
public class Neck extends Head {
public void method2() {
System.out.println("Neck 2");
}
}
public class Head extends Arm {
public void method1() {
System.out.println("Head 1");
super.method2();
}
public void method2() {
System.out.println("Head 2");
}
}
public class Leg {
public void method2() {
System.out.println("Leg 2");
}
}
public class Arm extends Leg {
public void method3() {
System.out.println("Arm 3");
method2();
}
}
And assuming the following variables have been defined:
Arm var1 = new Neck();
Leg var2 = new Leg();
Leg var3 = new Arm();
Object var4 = new Head();
Arm var5 = new Head();
Head var6 = new Neck();
In the table below, indicate in the right-hand column the output
produced by the statement in the left-hand column. If the
statement produces more than one line of output, indicate the
line breaks with slashes as in "a/b/c" to indicate three lines of
output with "a" followed by "b" followed by "c". If the
statement causes an error, fill in the right-hand column with
either the phrase "compiler error" or "runtime error" to indicate
when the error would be detected.
Statement
Output
Extra Credit Statements
var1.method2();
((Neck)var5).method1();
var2.method2();
((Arm)var3).method3();
var3.method2();
((Arm)var4).method1();
var4.method2();
((Neck)var1).method1();
var5.method2();
((Head)var4).method1();
var6.method2();
((Arm)var2).method3();
var1.method3();
((Head)var3).method1();
var2.method3();
((Leg)var4).method2();
var3.method3();
var4.method3();
var5.method3();
var6.method3();
Problem #1 Answers
Statement
Output
Extra Credit Statements
var1.method2();
Neck 2
((Neck)var5).method1();
Runtime error
var2.method2();
Leg 2
((Arm)var3).method3();
Arm 3/Leg 2
var3.method2();
Leg 2
((Arm)var4).method1();
Compile error
var4.method2();
Compile error
((Neck)var1).method1();
Head 1/Leg 2
var5.method2();
Head 2
((Head)var4).method1();
Head 1/Leg 2
var6.method2();
Neck 2
((Arm)var2).method3();
Runtime error
var1.method3();
Arm 3/Neck 2
((Head)var3).method1();
Runtime error
var2.method3();
Compile error
((Leg)var4).method2();
Head 2
var3.method3();
Compile error
var4.method3();
Compile error
var5.method3();
Arm 3/ Head 2
var6.method3();
Arm 3/Neck 2
Problem #2
1. An Owl is a Bird whose noise is
“hoot”. The food it eats depends
on the type of Owl, which means
that getFood cannot be
implemented in the Owl Class.
Given the hierarchy shown
above, write a complete class
declaration for the class Owl,
including its constructor and any
method(s).
public abstract class Bird {
private String name;
private String noise;
public Bird(String name, String noise){
this.name = name;
this.noise = noise;
}
public String getName(){
return name;
}
public String getNoise(){
return noise;
}
public abstract String getFood();
}
2. A SnowyOwl is an Owl whose name is always “Snowy
Owl”. A SnowyOwl will randomly eat a hare, a lemming, or
a small bird (depending on what’s available!), where each
type is equally likely.. The SnowyOwl class should use a
random number to determine which food the SnowyOwl
will eat. Assuming that the Owl class has been correctly
defined, and given the class hierarchy, write a complete
declaration of the class SnowyOwl, including
implementation of its constructor and method(s).
Problem #3
• Consider the following partial declaration of class
BirdSanctuary
Download