Java Programming
Java Class Design
1 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Overview
This lesson covers the following topics:
• Model business problems using Java classes
• Make classes immutable
• Compare access levels default and public
• Use the instanceof operator to compare object types
• Use virtual method invocation
• Use upward and downward casts
2 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Classes
A Java class is a template that defines the features of one
or more objects.
• A class can be thought of as a category used to define
groups of things.
• Classes:
– Define and implement methods.
– Implement methods from implemented interfaces.
3 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
What Classes Can and Cannot Do
Classes can:
• Declare constants and variables.
• Inherit methods from another class.
• Define and implement methods.
• Override inherited methods when the method is public or
protected.
4 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
What Classes Can and Cannot Do (cont.)
Classes can:
• Be instantiated by:
– A public or protected constructor.
– A public or protected static method or nested class.
Classes cannot:
• Override inherited methods when the method is final.
5 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
When Classes Can be Subclassed or Made
Immutable
A class can be subclassed when:
• The class is not declared final.
• The methods are public or protected.
A class can be immutable by:
• Making it final.
• Limiting instantiation to the class constructors.
• Eliminating any methods that change instance variables.
6 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
super() Method Call
The super() method call lets you call the parent class in a
class hierarchy. In this case, the static nested class
extends the behavior of the containing class.
The static nested class also provides the means for
instantiating a containing class when its constructor is
configured as private access. This is the second way to
instantiate a class that has a restricted or private access
qualifier for its class constructors.
7 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Interface
An interface is a Java construct that helps define the roles
that an object can assume. It is implemented by a class or
extended by another interface.
• Interfaces define collections of related methods without
implementations.
• All methods in a Java interface are abstract.
8 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Possibilities of Interfaces
Interfaces give developers two possibilities:
• They can develop a concrete class that just implements
the interface and then use that class by creating a
variable of that type.
– This means the class that is a copy of the class and has its
behaviors through aggregation.
– Aggregation is simply the process of gaining access to the
behaviors of an object type when you declare a variable of
that type in a class.
• They can develop a concrete class that implements one
or many interfaces.
9 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
What An Interface Can Do
An interface:
• Can declare public constants.
• Defines methods without implementation.
• Can only refer to its constants and defined methods.
• Can be used with the instanceof operator.
10 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
What An Interface Can Do (cont.)
While a class can only inherit a single superclass, a class
can implement more than one interface.
public class className implements interfaceName{
...class implementation...}
Implement is a keyword in Java that is used when a class inherits
an interface.
11 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Interface Method
An interface method:
• In an interface, each method is public even when you
forget to declare it as public.
• Is implicitly abstract but you can also use the abstract
keyword.
12 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Declaring an Interface
To declare a class as interface you must replace the
keyword class with the keyword interface.
This will declare your interface and force all methods to be
abstract and make the default access modifier public.
public interface Chassis Replace class with interface.
{
public final String chassis = "Generic";
... public Chassis getChassisType();
public void setChassisType(String vehicleFrameType);}
13 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Chassis Example 1
Classes that extend Chassis
will have to provide working
public interface Chassis methods for methods defined
{
here.
public final String chassis = "Generic";
... public Chassis getChassisType();
public void setChassisType(String vehicleFrameType);}
Class implementing the Chassis interface:
public class VehicleChassis implements Chassis {
private String chassisName;
public VehicleChassis() {
this.chassisName = Chassis.chassis; }
Classes implementing an
interface can access the
interface constants.
14 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Chassis Example 1 Explained
The keyword final means that the variable chassis is a
constant in the interface because you can only define
constants and method stubs in an interface.
this.chassisName = Chassis.chassis;
The assignment of the constant from an interface uses the
same syntax that you use when assigning a static variable
to another variable.
15 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Chassis Example 2
public interface Chassis Implementing classes must
{ provide the working method.
public final String chassis = "Generic";
... public Chassis getChassisType();
public void setChassisType(String vehicleFrameType);}
Class implementing the Chassis interface methods:
public Chassis getChassisType() {
return this; }
public void setChassisType(String vehicleChassis) {
this.chassisName = vehicleChassis; }
Classes using an interface
must provide
implementation for all
methods.
16 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Class Implements Interface: Steps 1-3
The steps to implementing an interface are shown in the
example below and on the next few slides.
public class ManufacturedEngine implements Engine {
Step 1: Implements Engine
...
interface as a Concrete
String engineManufacturer;
Date engineManufacturedDate; ManufacturedEngine class.
...
Step 2: Declare local
variables for the
ManufacturedEngine class.
public ManufacturedEngine() {
this.engineManufacturer = "Generic"; Step 3: Create a default
this.engineManufacturedDate = new Date(); constructor that assigns
this.engineMake = "Generic";
default values to all instance
this.engineModel = "Generic";
... } variables.
17 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Class Implements Interface: Steps 4-5
Step 4: Declare overloaded
constructor.
public class ManufacturedEngine implements Engine {
...
public ManufacturedEngine(
String engineManufacturer
, Date engineManufacturedDate
, String engineMake
, String engineModel
Step 5: Assign call
, DriveTrain driveTrain parameters to local instance
, int engineCylinders variables.
, Fuel engineType ) {
this.engineManufacturer = engineManufacturer;
this.engineManufacturedDate = engineManufacturedDate;
this.engineMake = engineMake;
this.engineModel = engineModel;
... }
18 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Class Implements Interface: Step 6
public class ManufacturedEngine implements Engine {
Step 6: Implement final methods for all methods in
the interface, which makes them non-subclassable.
...
public final void setEngineManufacturedDate(
Date manufacturedDate) {
this.engineManufacturedDate = manufacturedDate; }
public final void setEngineManufacturer(
String manufacturer) {
this.engineManufacturer = manufacturer; }
public void setEngineMake(String engineMake) {
this.engineMake = engineMake; }
...
19 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Class Implements Interface: Step 7-12
Step 7: Implements Engine interface a Vehicle class.
public class Vehicle implements Engine { Step 9: Create a default
Step 8: Declare an instance instance of a class that
... variable using Engine interface. implements only the Engine
interface inside the Vehicle
private Engine vehicleEngine;
...
constructor.
this.vehicleEngine = new ManufacturedEngine();
... Step 10: Final prevents subclassing of the method. Step 11: Implement
methods from the
Engine interface.
public final void setEngineManufacturedDate(
Date manufacturedDate) {
vehicleEngine.setEngineManufacturedDate(
manufacturedDate);
...
Step 12: Call the implementation of the interface method from
the ManufacturedEngine because you can't call it from the
Engine interface and the methods can't be subclassed.
20 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Why Use an Interface?
You may be wondering why you would ever want to create
a class that has no implementation.
One reason could be to force all classes that implement
the interface to have specific qualities.
21 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Store Example
A store owner wants to create a website that displays all
items in the store. We know:
• Each item has a name.
• Each item has a price.
• Each item is organized by department.
It would be in the store owner's best interest to create an
interface for what defines an item. This will serve as the
blueprints for all items in the store, requiring all items to at
least have the defined qualities above.
22 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Adding a New Item to Store Example
The owner adds a new item to his store named cookie:
• Each costs 1 US dollar.
• Cookies can be found in the Bakery department.
• Each cookie is identified by a type.
The owner may create a Cookie class that implements the
Item interface such as shown to the right, adding a
method or two that is specific to cookie items.
23 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Create Cookie Class
The owner may create a Cookie class that implements the
Item interface, such as shown below, adding a method or
two specific to cookie items.
public class Cookie implements Item{
public String cookieType;
private int price;
public Cookie(String type){
cookieType = type;
price = 1;
}
public String getItemName()
{return “Cookie”;}
public int getPrice()
{return price;}
public void setPrice(int price)
{this.price = price};
public String getDepartment()
{return “Bakery”;}
public String getType()
{return type;}
}
24 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Add Chocolate Chip Cookies to Store
The owner wants to add Chocolate Chip Cookies to his
online store. He would create a cookie such as shown
below:
Cookie chocChip = new Cookie(“Chocolate Chip”);
• He can use the Item interface in a similar way with all of
the other items in his store to assure that every item has
the qualities that makes it an item.
• This will help him as he creates his online store, by
allowing for things such as searching items by
departments or by price.
25 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Abstract Classes
An abstract class provides a base class from which other
classes extend.
• Abstract classes can provide:
– Implemented methods: Those that are fully implemented
and their child classes may use some.
– Abstract methods: Those that have no implementation and
require child classes to implement them.
• Abstract classes do not allow construction directly but
you can create subclasses or static nested classes to
instantiate them.
26 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Abstract Classes (cont.)
An abstract class:
• Must be defined by using the abstract keyword.
• Cannot be instantiated into objects.
• Can have local declared variables.
• Can have method definitions and implementations.
• Must be subclassed rather than implemented.
27 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Abstract Classes (cont.)
An instance can be created by:
• Using a static method inside the abstract class to return
an instance of the class.
• Using a static nested class inside the abstract class.
28 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
More Information about Abstract Classes
If a concrete class uses an abstract class, it must inherit it.
Inheritance precludes inheriting from another class. As a
rule, interfaces are superior solutions to abstract classes.
Abstract classes are important when all derived classes
should share certain methods.
• The alternative is to use an interface, then define at least
one concrete class that implements the interface.
• This means you can use the concrete class as an object
type for a variable in any number of programs which
provides much greater flexibility.
29 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Abstract Class Code
public abstract class Chassis Implementing classes must
{ provide the working
public final String chassis = "Generic"; method for abstract
... classes.
public abstract Chassis getChassisType();
public abstract void setChassisType(
String vehicleFrameType);}
Class implementing the Chassis interface methods:
public Chassis getChassisType() {
return this; }
public void setChassisType(String vehicleChassis) {
this.chassisName = vehicleChassis; }
Classes using an abstract class
must provide implementation for all
methods.
30 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Immutable Classes
Immutable classes:
• Make the class final, which means that other classes
can't extend its behavior.
• Only allow instance variable assignments in the default
or overloaded constructor.
...
public final class Car extends Vehicle {
...
31 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
The instanceOf Operator
The instanceof operator allows you determine the type of
an object. It takes an object on the left side of the operator
and a type on the right side of the operator and returns a
boolean value indicating whether the object belongs to
that type or not.
For example:
• (String instaneOf Object) would return true.
• (String instanceOf Integer) would return false.
32 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Using the instanceOf Operator
This could be useful when you desire to have different
object types call methods specific to their type. In this
code, Feature is an interface and InteriorFeature and
ExteriorFeature both extend Feature.
The InteriorFeature and
public final class Car extends Vehicle {
private Feature[] feature = new Feature[10];
ExteriorFeature are instances
... of concrete classes that
public Car() { implement the Feature
Super(); ... interface.
Feature[] f =
{ new InteriorFeature("No Interior Features")
, new ExteriorFeature("No Exterior Features")};
this.feature = f;
...
33 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
instanceOf Operator Example
In this example, the instanceOf operator is used to find all
of the exterior features in an array and add them to a
String called list.
...
public String getExteriorFeatures() {
String list = "";
for (int i = 0; i < this.feature.length; i++) {
if (this.feature[i] instanceof ExteriorFeature) {
if (list.length() == 0) {
list += this.feature[i]; }
else {
list += ", " + this.feature[i]; }}}
return list; }
...
34 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
instanceOf Operator Example Explained
In the previous instanceof operator example:
• The array is defined using the Feature interface. It can
hold any class that solely implements its methods and
extends them with other specialization methods and
variables.
• As the program reads through the array, it assigns the
string value from the toString() method to the list
variable.
• You should always consider overridding the toString(),
hash(), and equals() methods in your user-defined
classes.
35 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Virtual Method Invocation
Virtual method invocation is the process where Java
identifies the type of subclass and calls its implementation
of a method.
When the Java virtual machine invokes a class method, it
selects the method to invoke based on the type of the
object reference, which is always known at compile time.
36 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Virtual Method Invocation (cont.)
On the other hand, when the virtual machine invokes an
instance method, it selects the method to invoke based on
the actual class of the object, which may only be known at
runtime.
37 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Virtual Method Invocation Example
...
public String toString() { Assigning the object
String list = ""; to the String calls that
for (int i = 0; i < this.feature.length; i++) { object's toString
if (list.length() == 0) { method.
list += this.feature[i]; }
else {
list += "\n : " +this.feature[i];}
}
return super.toString() + "\n" +
"Features : " + list + "\n" +
"Car Axle : " + carAxle; }
...
38 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Virtual Method Invocation Example Explained
The toString() method uses virtual method invocation by
calling the toString() method of the different subclasses.
• The decision is made by JVM to call the toString method
implemented in the subclasses rather than the toString
method in the superclass or the Object class.
• One prints External before the feature and the other
prints Internal before the feature.
39 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Upcasting and Downcasting
Casting is the principal of changing the object type during
assignment.
• Upcasting loses access to specialized methods in the
subclassed object instance.
• Downcasting gains access to specialized methods of the
subclass.
40 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Upcasting and Downcasting Example
Casting objects works somewhat like casting primitives.
• For example, when downcasting a double to an int, the
values to the right of the decimal point are lost. This is a
loss of precision.
• For that reason, you must explicitly specify the downcast
type. For example:
double complexNumber = 45.75L;
int simpleNumber = 34;
simpleNumber = (int) complexNumber;
41 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Upcasting and Downcasting Example (cont.)
• Upcasting does not risk the loss of precision nor require
you to specify the new data type in parentheses.
42 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Upcasting Example
Even though vehicle is a Car, it was upcast to Vehicle so it
lost access to its Car-specific methods and fields.
Attempts to access subclass methods fail at compile time.
Vehicle is a superclass.
...
Car is a subclass of Vehicle.
Vehicle vehicle =
(Vehicle) new Car("Honda",new Date(1325599999999L)
,"Honda","Prelude","Coupe"
, new VehicleChassis("Unibody")
, new ManufacturedEngine("Honda"
, new Date(), "H-Series","H23A1"
, DriveTrain.TWO_WHEEL_DRIVE,4
, Fuel.MIDGRADE_GASOLINE),f,2);
...
vehicle.getExternalFeatures(); Fails because the method belongs to
... the Car subclass and access to it is
lost when upward casting.
43 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Upcasting Example Explained
The loss of precision in object assignments differs from
primitive data types. Upcasting from a specialized
subclass to a generalized superclass loses access to the
specialized variables and methods.
...
Car is a subclass of Vehicle.
Vehicle vehicle =
(Vehicle) new Car("Honda",new Date(1325599999999L)
,"Honda","Prelude","Coupe"
Vehicle is a superclass.
, new VehicleChassis("Unibody")
, new ManufacturedEngine("Honda"
, new Date(), "H-Series","H23A1"
, DriveTrain.TWO_WHEEL_DRIVE,4
, Fuel.MIDGRADE_GASOLINE),f,2);
...
vehicle.getExternalFeatures(); Fails because the method belongs to
... the Car subclass and access to it is
lost when upward casting.
44 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Downcasting Example
Downcasting the superclass works here because the
runtime object is actually a Car instance. The Vehicle
instance is first cast to a subclass of itself before running
the Car instance method.
Vehicle is a superclass.
... Car is a subclass of Vehicle.
Vehicle vehicle =
(Vehicle) new Car("Honda",new Date(1325599999999L)
,"Honda","Prelude","Coupe"
, new VehicleChassis("Unibody")
, new ManufacturedEngine("Honda"
, new Date(), "H-Series","H23A1"
, DriveTrain.TWO_WHEEL_DRIVE,4
, Fuel.MIDGRADE_GASOLINE),f,2);
...
((Car) vehicle).getExternalFeatures();
Succeeds because the
... method belongs to the Car
subclass.
45 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Downcasting Example Explained
Downcasting from a generalized to specialized subclass
returns access to the specialized variables and methods if
they were there from a previous upcast.
Vehicle is a superclass.
... Car is a subclass of Vehicle.
Vehicle vehicle =
(Vehicle) new Car("Honda",new Date(1325599999999L)
,"Honda","Prelude","Coupe"
, new VehicleChassis("Unibody")
, new ManufacturedEngine("Honda"
, new Date(), "H-Series","H23A1"
, DriveTrain.TWO_WHEEL_DRIVE,4
, Fuel.MIDGRADE_GASOLINE),f,2);
...
((Car) vehicle).getExternalFeatures();
Succeeds because the
... method belongs to the Car
subclass.
46 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Terminology
Key terms used in this lesson included:
• Abstract class
• Abstract constructor
• Casting
• Downward cast
• Immutable classes
• instanceof
• Interface
• Upward cast
• Virtual method invocation
47 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.
Java Class Design
Summary
In this lesson, you should have learned how to:
• Model business problems using Java classes
• Make classes immutable
• Compare access levels default and public
• Use the instanceof operator to compare object types
• Use virtual method invocation
• Use upward and downward casts
48 Copyright © 2013, Oracle and/or its affiliates. All rights
reserved.