Inheritance

Advanced Programming

SUT • Spring 2019

Outline

  • Inheritance

  • Class Hierarchies

  • is-a relationship

  • UML Class Diagram

  • protected members

  • Abstract Methods

  • super keyword

  • Initialization in inheritance

Introduction to Inheritance

Class Hierarchies

Class Hierarchies (2)

Class Hierarchies (3)

General and Specific Types

  • Faculty and Employee are both classes

  • Faculty is a more specific type of Employee

  • Employee is a more general type of Faculty

  • A Faculty instance is also a Employee instance

    • Dr. Felani is a faculty member

    • He is also an employee of university

is-a Relationship

  • More general class : Superclass

  • More specific class : Subclass

  • Subclass is inherited from superclass

  •  

  • Faculty is inherited from Employee

  • Rectangle is inherited from Shape

    • A rectangle is also a shape

  • Cat is inherited from Animal

    • Maloos is a cat, she is also an animal

Inheritance (2)

  • Name some other hierarchies…

  • Note: More specific type is also a class

    • Not an object

    • Ali Karimi is not a more specific type of FootballPlayer

      • He is an object

      • Not a class

Class Implementation

  • How do you implement Employee class?

  • How do you implement Faculty class?

Sample

public class Employee {
    private int salary;
    private Date birthDate;

    public void setName(String name) {
        // ....
    }

    public void setNationalID(String id) {
        // ....
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public int getSalary() {
        return salary;
    }
}

Sample

public class Faculty {
    private int salary;
    private Date birthDate;

    public void setName(String name) {
        // ....
    }

    public void setNationalID(String id) {
        // ....
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public int getSalary() {
        return salary;
    }

    // Faculty variables and methods
    private Course[] courses;
    public Course[] getOfferedCourses(){
        return courses;
    }
}

Inheritance in OOP

  • Java offers inheritance

  • like any object oriented programming language

  • Inheritance is used for implementing more specific classes

    • Duplicate code is eliminated

  • Inheritance provides code reuse

  • is-a relationship

Faculty & Employee

  • Faculty is inherited from Employee

  • Faculty extends Employee

  • Attributes and behaviors of Employee is inherited to Faculty

  • Inheritance provides code reuse

public class Faculty extends Employee{
    // Faculty variables and methods
    private Course[] courses;
    public Course[] getOfferedCourses(){
        return courses;
    }
}

UML Class Diagram

UML Class Diagram

Sample

class Shape {
    int color;
    int positionX, positionY;
}

class Circle extends Shape {
    private int radius;

    public double getArea() {
        return 3.14 * radius * radius;
    }
}

class Rectangle extends Shape {
    private int width, length;

    public double getArea() {
        return width * length;
    }
}

Terminology

  • Class Rectangle is inherited from class Shape

  • Rectangle is a subclass of Shape

  • Rectangle is a child of Shape

  • Rectangle is a derived class of Shape

  • Shape is the super-class of Rectangle

  • Shape is the parent of Rectangle

  • Shape is the base-class of Rectangle

  • Rectangle is-a Shape

Inheritance in java

  • Every class is inherited from class Object

    • Primitive-types are not objects

  • Object class has some operations

    • equals()

    • toString()

  • Every class adds some operations

  • And may changes some operations

    • toString()

Inheritance

  • Software reusability

  • Create new class from existing class

    • Absorb existing class’s data and behaviors

    • Enhance with new capabilities

  • Subclass extends superclass.

  • Subclass:

    • More specialized group of objects

    • Behaviors inherited from superclass

      • Or changed and customized

    • Additional behaviors

Class Hierarchy

  • Direct superclass

    • Inherited explicitly (one level up hierarchy)

  • Indirect superclass

    • Inherited two or more levels up hierarchy

  • Single inheritance

    • Inherits from one superclass

  • Multiple inheritance

    • Inherits from multiple superclasses

      • Java does not support multiple inheritance

is-a relationship

  • Object of subclass “is a” object of super-class

    • Example: Rectangle is quadrilateral.

    • Class Rectangle inherits from class Quadrilateral

    • Quadrilateral: superclass

    • Rectangle: subclass

  • Superclass typically represents larger set of objects than subclasses

    • superclass: Vehicle

    • subclass: Car

      • Smaller, more-specific subset of vehicles

More Examples

Superclass Subclass
Student GraduteStudent, UnderGraduateStudent
Shape Circle, Triangle, Rectangle
Loan CarLoan, HomeImprovementLoan, MortgageLoan
Employee Faculty, Staff
BankAccount CheckingAccount, SavingAccount

Subclasses may…

  • Add new functionality

    • New members

  • Use inherited functionality

    • Software reuse

  • Override inherited functionality

    • Change parent methods

Software reuse

  • Software reuse is at the heart of inheritance

  • Using existing software components to create new ones

  • Capitalize on all the effort that went into the

    • design

    • implementation

    • and testing of the existing software

Bad smell

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Avoid Copy & Paste!

  • Please, Avoid Copy & Paste!

Sample

public class Person {
    private String name;
    private Long nationalID;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getNationalID() {
        return nationalID;
    }

    public void setNationalID(Long nationalID) {
        this.nationalID = nationalID;
    }

    public void show() {
        System.out.println("example.Person: name=" + name
                + ",nationalID=" + nationalID);
    }
}

Sample

class Student extends Person {
    private String studentID;

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }

    public String getStudentID() {
        return studentID;
    }

    public void takeCourse(Course course) {
    }

    public void show() {
        System.out.println("example.Student: name=" + getName()
                + ",nationalID=" + getNationalID()
                + ",studentID=" + studentID);
    }
}

new properties

new methods (more behaviour)

change parrent methods (override)

Sample

Person p1 = new Person();
p1.setName("Ali Alavi");
p1.setNationalID(1498670972L);
p1.show();


Student st = new Student();
st.setName("Ali Alavi");
st.setNationalID(1498670972L);
st.setStudentID("89072456");
st.show();

Defined in parent

Added in child

Changed in child

More About Inheritance

Abstract Behaviors

  • Does any animal swim?

    • No. So “to swim” is not a behavior of animals.

  • Any animal has a voice

  • “to talk” is a behavior of animals

  • But what is the voice of an animal?

  • How does an animal “talk”?

    • It depends to the specific type of animal

      • Dog: Hop! Hop!

      • Cat: Mewww!

Abstract Behaviors (2)

  • “talk” is an abstract behaviour of Animal

    • All animals can “talk”

    • But we can not specify how an animal talks

    • It depends to the specific class of animal

  • “talk” is a concrete behaviour of Dog

    • Hop! Hop!

  • “swim” is not a behaviour of Animal

    • All animals can not swim

    • “swim” is a concrete behaviour of Fish

Remember Shape Classes

Sample

public class Circle {
    private double radius;
    
    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return Math.pow(radius, 2) * Math.PI;
    }

    public double getPerimeter() {
        return 2 * radius * Math.PI;
    }
}

Sample

public class Rectangle {
    private double width, length;
    
    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getArea() {
        return length * width;
    }

    public double getPerimeter() {
        return 2 * (length + width);
    }
}

Sample

public class Square {
    private double length;
    
    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getArea() {
        return length * length;
    }

    public double getPerimeter() {
        return 4 * length;
    }
}

Shapes Example

  • Shape is an abstract class

  • Some methods are undefined in Shape

  • Some methods should be defined in sub-classes

    • getArea()

    • getPerimeter()

  • These methods are abstract methods

    • Remember abstract behaviours

Abstract Methods

  • Shape classes

    • getArea()

    • draw()

  • Animals

    • Talk()

    • getName()

      • is not abstract!

  • How do you implement an abstract method?

  • We can implement these methods by simple dummy operations

  • Better way : abstract methods

Abstract Methods (2)

  • abstract method: no implementation

  • A class containing abstract methods: an abstract class

  • You can not instantiate abstract classes

    • Why?

  • If a sub-class do not implement the abstract method

    • It will be abstract too

Animal Example

abstract class Animal {
    private String name;

    protected Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public abstract String talk();
}

Animal Example

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public String talk() {
        return "Meowww";
    }
}

Access modifier in inheritance

  • You can not override a public method as a private method

    • Why?

  • It violates the “is-a” rule

  • You can not reduce accessibility of methods in subclasses

Accessibility of Members

  • Subclass has access to public members of parent class

    • Public methods and properties are accessible in subclass

    • Student used getName() and getStudentID()

  • Private members are not accessible in subclass

    • Student has no access to name and studentID properties

  • What if you want to let subclasses access a member, but not other classes?

Protected Members

  • Intermediate level of protection between public and packaged

  • protected members accessible by

    • subclass members

    • Class members in the same package

  • protected members are also package accessible

    • friendly

  • Protected variables and methods are shown with a # symbol in UML diagrams

Protected Members

Access Levels

  • Public

    • Accessible by all classes

  • Protected

    • Accessible by subclasses

    • Accessible by classes of the same package

  • Package access (friendly)

    • Accessible by classes of the same package

  • Private

    • No access

super Keyword

  • Access to parent members

  • The super reference can be used to refer to the parent class

  • super.f() invokes f() from parent class

  • Why we need it?

    • When the method is overridden in subclass

    • super is also used to invoke the parent's constructor

Application of super Keyword

class Student extends Person{
    public void show(){
	super.show();
	System.out.println(",studentID=" + studentID);
    }
}

Practice

class A {
    public int a;
}

public class B extends A {
    private in a;

    public void f() {
        int a;
        this.a = 5;
        super.a = 6;
        a = 4;

        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
    }

    public static void main(String[] args){
        new B().f();
    }
}

Object class methods

  • equals()

  • toString()

  • finalize()

  •  

  • We can override these methods in our classes

Multiple Inheritance

  • Java supports single inheritance

  • Derived class can have only one parent class

  • Multiple inheritance allows a class to be derived from two or more classes

    • inheriting the members of all parents

  • Collisions, such as the same variable name in two parents, have to be resolved

  • Java does not support multiple inheritance

  • The use of interfaces usually gives us aspects of multiple inheritance without the overhead

Initialization

  • Constructors are not inherited

    • even though they have public visibility

  • We often want to use the parent's constructor to set up the "parent's part" of the object

super("Ali");

Constructors

  • A child’s constructor is responsible for calling the parent’s constructor

  • It is done using super keyword

  • The first statement of a child’s constructor should be the super reference to call the parent constructor

  • Otherwise, default constructor is implicitly invoked

  • If default constructor does not exist? (how?!)

    • A syntax error

    • You should explicitly call an appropriate parent constructor

Sample

class Person {
    private String name;
    private Long nationalID;

    public Person(String name, Long nationalID) {
        this.name = name;
        this.nationalID = nationalID;
    }
}

class Student extends Person {
    private String studentID;

    public Student(String name, Long naID, String stID) {
        super(name, naID);
        this.studentID = stID;
    }
}


public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println(p1.toString());
        Student st = new Student("Ali Alavi", 1498670972L, "89072456");
    }
}

Order of initialization

  • Once per class

    • Static variable declaration of parent

    • Static block of parent

    • Static variable declaration

    • Static block

  • Once per object

    • variable declaration of parent

    • Initialization block of parent

    • Constructor of parent

    • variable declaration

    • Initialization block

    • Constructor

Practice

public class Parent {
    static int a = A();
    static{
    	a=B();
    }
    int b = E();
    {
    	b = F();
    }
    public Parent(){
    	b = G();
    }
}
class Child extends Parent{
    static int c = C();
    static{
    	c=D();
    }
    int b = H();
    {
    	b = I();
    }
    public Child(){
    	b = J();
    }
}

What happens if we invoke: new Child();

Title Text

Inheritance

By Behnam Hatami

Inheritance

Inheritance / Advanced Programming Course @ SUT, Spring 2019

  • 1,212