ufce3t-15-m programming part 1 ufce3t-15-m object-oriented design and programming block2:...

Post on 20-Dec-2015

213 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1UFCE3T-15-M Programming part

UFCE3T-15-M Object-oriented Design and Programming

Block2: Inheritance, Polymorphism, Abstract Classes and Interfaces

Jin Sa

2UFCE3T-15-M Programming part

Objectives To understand the concept of inheritance. To develop a subclass from a superclass through inheritance. To invoke the superclass’s constructors and methods using the super

keyword. To override methods in the subclass. To comprehend polymorphism. To understand casting. To restrict access to data and methods using the protected visibility

modifier. To understand the concepts of abstract classes and interfaces To design and use abstract classes. To declare interfaces to model weak inheritance relationships. To know the similarities and differences between an abstract class and

interface

3UFCE3T-15-M Programming part

Inheritance and Polymorphism

4UFCE3T-15-M Programming part

Superclasses and Subclasses

Student - -name --- +getName +…

MScStudent

-supervisor +chooseSup

Subclass Superclass

5UFCE3T-15-M Programming part

Examples of Inheritance

• Student.java

• MScStudent.java

• TestStudentHierarchy.java

6UFCE3T-15-M Programming part

Student classpublic class Student {

private String name;

Student(String nm ){ name=nm;} public String getName() { return name;} public String toString() {

// return info about the object return name;}

}

7UFCE3T-15-M Programming part

MScStudent class public class MScStudent extends Student { private String supervisor; MScStudent(String nm) { super(nm); } public void chooseSupervisor(String nm) { supervisor=nm; } public String toString(){ return (super.toString()+

"\n Supervisor is: "+supervisor); }

}

8UFCE3T-15-M Programming part

TestStudentHierarchy class

public class TestStudentHierarchy { public static void main(String [] args) {

Student s1=new Student("jane"); MScStudent ms1 = new MScStudent("mike"); System.out.println(s1.toString()); System.out.println(ms1.toString());

s1=ms1; System.out.println(s1.toString()); //((MScStudent)s1).chooseSupervisor("jj"); System.out.println(s1.toString()); }

}

9UFCE3T-15-M Programming part

Using the Keyword super

• To call a superclass constructor

• To call a superclass method

See the MSc example.

The keyword super refers to the superclass of the class in which super appears. This keyword can be used in two ways:

10UFCE3T-15-M Programming part

Declaring a SubclassA subclass extends properties and methods from the superclass. You can also:

Add new properties

Add new methods

Override the methods of the superclass

11UFCE3T-15-M Programming part

Overriding Methods in the Superclass

•A subclass inherits methods from a superclass.

•Sometimes it is necessary for the subclass to modify the implementation of a method defined in the superclass.

•This is referred to as method overriding.

12UFCE3T-15-M Programming part

NOTE•An instance method can be overridden only if it is accessible.

•Thus a private method cannot be overridden, because it is not accessible outside its own class.

•If a method defined in a subclass is private in its superclass, the two methods are completely unrelated.

13UFCE3T-15-M Programming part

The Object Class

Every class in Java is descended from the java.lang.Object class. If no inheritance is specified when a class is defined, the superclass of the class is Object.

public class Circle { ... }

Equivalent public class Circle extends Object { ... }

14UFCE3T-15-M Programming part

The toString() method in Object

The toString() method returns a string representation of the object. The default implementation returns a string consisting of a class name of which the object is an instance, the at sign (@), and a number representing this object.

The code displays something like Circle@15037e5. This message is not very helpful or informative. Usually you should override the toString method so that it returns a digestible string representation of the object.

Circle c = new Circle(2.0);

System.out.println(c.toString());

15UFCE3T-15-M Programming part

Object References and Class Hierarchy

• In Java an object reference that is declared of a particular class can be used to refer to an object of any subclass. See the TestStudentHierarchy example.

Student s1=new Student("jane");MScStudent ms1 = new MScStudent("mike");…s1=ms1;//s1 points to an MScStudentSystem.out.println(s1.toString());

16UFCE3T-15-M Programming part

Polymorphism

• Polymorphism means “many forms”.• s1 was a polymorphic reference. It can

refer to different kinds of objects.• An example of polymorphism is the

technique by which a reference that is used to invoke a method can actually invoke different methods at different times depending on what it is referring to at the time.

17UFCE3T-15-M Programming part

Polymorphism

• In the TestStudetnHierarch example, the reference s1 uses the type of the object it points to determine which toString() method to use. If it is pointing to a Student, it uses the toString() method in the Student class; if it is pointing to an MScStudent, it uses the method defined in the MScStudent.

18UFCE3T-15-M Programming part

Casting Objects

Casting can be used to convert an object of one class type to another within an inheritance hierarchy. In the statement

s1=new MScStudent(“jane”);

assigns the object new MscStudent() to a reference of the Student type. This statement is involves an implicit casting.

This is legal because an instance of MScStudent is an instance of Student.

19UFCE3T-15-M Programming part

Casting Object

Explicit casting must be used when casting an object from a superclass to a subclass. On the previous slide we have assigned an MScStudent to the reference s1. So let’s try

s1.chooseSupervisor(“jj”);

s1 is still a reference of type Student. Student does not have the method chooseSupervisor. So, we have to explicitly cast s1 to MScStudent.

((MScStudent)s1).chooseSupervisor(“jj”);

20UFCE3T-15-M Programming part

Example 8.1Demonstrating Polymorphism

and CastingSee the TestStudentHierarchy example.

21UFCE3T-15-M Programming part

The protected Modifier• The protected modifier can be applied on

data and methods in a class. A protected data or a protected method in a public class can be accessed by any class in the same package or its subclasses, even if the subclasses are in a different package.

• private, default, protected, public

private, none (if no modifier is used), protected, public

Visibility increases

22UFCE3T-15-M Programming part

Accessibility Summary

Modifier on members in a class

Accessed from the same class

Accessed from the same package

Accessed from a subclass

Accessed from a different package

public

protected -

default - -

private - - -

23UFCE3T-15-M Programming part

Visibility Modifiers

public class C1 { public int x; protected int y; int z; private int u; protected void m() { } }

public class C2 { C1 o = new C1(); can access o.x; can access o.y; can access o.z; cannot access o.u; can invoke o.m(); }

public class C3 extends C1 { can access x; can access y; can access z; cannot access u; can invoke m(); }

package p1;

public class C4 extends C1 { can access x; can access y; cannot access z; cannot access u; can invoke m(); }

package p2;

public class C5 { C1 o = new C1(); can access o.x; cannot access o.y; cannot access o.z; cannot access o.u; cannot invoke o.m(); }

24UFCE3T-15-M Programming part

The final Modifier• The final class cannot be extended: final class Math { ... }

• The final variable is a constant: final static double PI = 3.14159;

• The final method cannot beoverridden by its subclasses.

25UFCE3T-15-M Programming part

The equals MethodThe equals() method compares thecontents of two objects. The default implementation of the equals method in the Object class is as follows:

public boolean equals(Object obj) {

return (this == obj);}

For example, the equals method is overridden in the Circle class.

public boolean equals(Object o) { if (o instanceof Circle) { return radius == ((Circle)o).radius; } else return false;}

26UFCE3T-15-M Programming part

NOTE• The == comparison operator is used for comparing

two primitive data type values or for determining whether two objects have the same references.

• The equals method is intended to test whether two objects have the same contents, provided that the method is modified in the defining class of the objects.

• The == operator is stronger than the equals method, in that the == operator checks whether the two reference variables refer to the same object.

27UFCE3T-15-M Programming part

Abstract Classes and Interfaces

28UFCE3T-15-M Programming part

Abstract Methods and Classes

• Consider an application that deals with different shapes, we may need to define a circle class, a square class and a triangle class etc.

• All have some common features, e.g. colour, area

• So we want to define a shape class which includes these common features. Circle, Square etc can inherit from Shape and add additional information.

29UFCE3T-15-M Programming part

Abstract Methods

• How do we define findArea() of Shape?

• Need to know what shape it is in order to know the formula.

• Abstract methods provide “place holders” for methods that can sensibly mentioned at one level, but that are going to be implemented in a variety of ways in the subclasses.

30UFCE3T-15-M Programming part

Abstract Methods

• In the Shape class, we know there is a common concept, findArea, but it does nto make sense to provide the detailled description. Hence we have the concept of Abstract Methods.

• In Java, the syntax ispublic abstract double findArea();

31UFCE3T-15-M Programming part

Abstract Classes

• An abstract class is any class with at least one abstract method. An abstract class cannot be used to declare objects any more. The presence of the abstract method means that it is incomplete.

32UFCE3T-15-M Programming part

The abstract Modifier• The abstract class

– Cannot be instantiated– Should be extended and implemented in

subclasses

• The abstract method– Method signature without

implementation

33UFCE3T-15-M Programming part

NOTE

An abstract class cannot be instantiated using the new operator, but you can still define its constructors, which are invoked in the constructors of its subclasses. For instance, the constructors of Shape are invoked in the Circle class and the Square class.

34UFCE3T-15-M Programming part

NOTE

It is possible to declare an abstract class that contains no abstract methods. In this case, you cannot create instances of the class using the new operator. This class is used as a base class for defining a new subclass.

35UFCE3T-15-M Programming part

NOTE•You cannot create an instance from an abstract class using the new operator, but an abstract class can be used as a data type.

•Therefore, the following statement, which creates an array whose elements are of Shape type, is correct.

Shape [] collection = new Shape[5];

Each collection[i] can point to an instance of Square, Circle

36UFCE3T-15-M Programming part

Example 9.1 Using the Shape Class

• Objective: This example creates two shape objects: a circle, and a square, check if the which object has the bigger area.

• TestShapes.java

TestShapes.java

37UFCE3T-15-M Programming part

InterfacesAn interface is a class like construct that contains only constants and abstract methods. In many ways, an interface is similar to an abstract class, but an abstract class can contain variables and concrete methods as well as constants and abstract methods.

To define an interface, Java uses the following syntax to declare an interface:

public interface InterfaceName { constant declarations; method signatures;}

38UFCE3T-15-M Programming part

Implementing Interfaces

• A class implements an interface by providing method implementations for each of the methods in the interface declaration.

• Classes implement an interface use the implements keyword.

Class classname implements interfacename {attributes and methods for this classimplementation of methods named in the interfacce

}

39UFCE3T-15-M Programming part

Interface example

public interface ComfyLife { void havePlentyFood(); void haveGoodTime();

}

40UFCE3T-15-M Programming part

Implementing Interfaces

• Consider the Student class described in the case study in block1

public class Student implements ComfyLife { …

public void havePlentyFood() { System.out.println("lots of beer in the fridge"); } public void haveGoodTime() { System.out.println("partying all nights"); } }

41UFCE3T-15-M Programming part

Implements interface

public class MScStudent extends Student implements ComfyLife { …

public void havePlentyFood() { System.out.println("lots of healthy food in the fridge");} public void haveGoodTime() { System.out.println("really enjoyning the course");}

}

42UFCE3T-15-M Programming part

Test the example

public class TestStudentHierarchy { public static void main(String [] args) {

Student s1=new Student("jane"); MScStudent ms1 = new MScStudent("mike"); s1.havePlentyFood(); s1.haveGoodTime(); ms1.haveGoodTime(); s1.haveGoodTime(); s1=ms1; s1.haveGoodTime(); }

}

43UFCE3T-15-M Programming part

Interfaces vs. Abstract Classes

In an interface, the data must be constants; an abstract class can have all types of data.

Each method in an interface has only a signature without implementation; an abstract class can have concrete methods.

44UFCE3T-15-M Programming part

Interfaces vs. Abstract Classes, cont.

All data fields are public final static and all methods are public abstract in an interface. For this reason, these modifiers can be omitted, as shown below:

public interface T1 { public static final int K = 1; public abstract void p(); }

Equivalent public interface T1 { int K = 1; void p(); }

45UFCE3T-15-M Programming part

Whether to use an interface or a class?

In general, a strong is-a relationship that clearly describes a parent-child relationship should be modeled using classes. For example, a staff member is a person. So their relationship should be modeled using class inheritance.

A weak is-a relationship, also known as an is-kind-of relationship, indicates that an object possesses a certain property. A weak is-a relationship can be modeled using interfaces.

46UFCE3T-15-M Programming part

Interface to partially support multiple inheritance

You can use interfaces to circumvent single inheritance restriction if multiple inheritance is desired. In the case of multiple inheritance, you have to design one as a superclass, and others as interface.

47UFCE3T-15-M Programming part

Enhance design using abstract classes and interfaces

• By using abstract classes and interfaces, a programmer can identify the boundaries of different parts of a software system without having to provide details about their implementations.

• Because abstract classes and interfaces do not specify how something is to be done, but rather something must be done, they are a good mechanism for determining parts early in the project. After defining a set of interfaces and abstract classes, various programmers can work in parallel.

top related