Java Reference
In-Depth Information
To cater for this, Java has
abstract classes
. An abstract class is a class in which one or more methods are
declared, but not defined. The bodies of these methods are omitted, because, as in the case of the method
sound()
in our class
Animal
, implementing the methods does not make sense. Since they have no
definition and cannot be executed, they are called
abstract methods
. The declaration for an abstract method
ends with a semi-colon and you specify the method with the keyword
abstract
to identify it as such. To
define an abstract class you use the keyword
abstract
in front of the class name.
We could have defined the class
Animal
as an abstract class by amending it as follows:
public abstract class Animal {
public abstract void sound(); // Abstract method
public Animal(String aType) {
type = new String(aType);
}
public String toString() {
return "This is a " + type;
}
private String type;
}
The previous program will work just as well with these changes. It doesn't matter whether you prefix the
class name with
public abstract
or
abstract
public
, they are equivalent, but you should be
consistent in your usage. The sequence
public abstract
is typically preferred. The same goes for
the declaration of an abstract method, but both
public
and
abstract
must precede the return type
specification, which is
void
in this case.
An
abstract
method cannot be
private
since a
private
method cannot be inherited, and
therefore cannot be redefined in a subclass.
You cannot instantiate an object of an abstract class, but you can declare a variable of an abstract class
type. With our new abstract version of the class
Animal
, we can still write:
Animal thePet; // Declare a variable of type Animal
just as we did in the
TryPolymorphism
class. We can then use this variable to store objects of the
subclasses,
Dog
,
Spaniel
,
Duck
and
Cat
.
When you derive a class from an abstract base class, you don't have to define all the abstract methods in
the subclass. In this case the subclass will also be abstract and you won't be able to instantiate any
objects of the subclass either. If a class is abstract, you must use the
abstract
keyword when you
define it, even if it only inherits an abstract method from its superclass. Sooner or later you must have a
subclass that contains no abstract methods. You can then create objects of this class.