ay17/18 sem 2cs2030/1718-s2/cs2030-lec03.pdf · ay17/18 sem 2 object reference instance fields...

54

Upload: others

Post on 17-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Page 2: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Lecture 3Inheritance (Continued)

Page 3: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Lab starts tomorrow

Page 4: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

Lab• Lab 0: ungraded

• Submit anyway, by Friday midnight

• BYOD: Bring your own device

• Get ready:

• install Java 9

• familiarize with UNIX

Page 5: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Last week, in cs2030..

Page 6: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Java uses late binding for methods

invocation

Page 7: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

object reference

instance fields

pointer to method table

pointer to class fields

pointer to print()

{ : }

Circle

object reference

pointer to method table

instance fields

{ : }

Point

pointer to class fields

pointer to print()

object reference

objectsToPrint[ ]

0

1

2

pointer to method table

instance fields

:

:

Page 8: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Polymorphism

Page 9: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

“Each significant piece of functionality in a program should be implemented in just one place in the source code. “

Page 10: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

PaintedShape

PaintedCircle

- fillWith- setBorderColor- setBorderThickness

- getArea- getPerimeter- contains

PaintedSquare

- getArea- getPerimeter- contains

Page 11: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Inheritance

Page 12: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Circle

- getArea- getPerimeter- contains- equals

Object- equals- toString- …

Page 13: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

object reference

c: (0, 0) r: 10

pointer to method table

pointer to class fields

pointer to print()

{ : }

Circle

object reference

pointer to method table

c: (0, 0) r: 10

object reference

circles[ ]

0

1

2

:

Page 14: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

@Overridepublic boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof Circle) { Circle circle = (Circle) obj; return (circle.center.equals(center) && circle.radius == radius); } else return false;}

Page 15: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

c

c: (0, 0) r: 10

pointer to method table

getArea(){ : }

Circle

:

getPerimeter()

{ : }

toString( )

equals(Object)

:{ : }

{ : }

Object

Object

Page 16: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

c

c: (0, 0) r: 10

pointer to method table

getArea(){ : }

Circle

:

getPerimeter()

{ : }

toString( )

equals(Object)

:{ : }

{ : }

Object

Object

Page 17: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

c

c: (0, 0) r: 10

pointer to method table

getArea(){ : }

Circle

:

getPerimeter()

{ : }

toString( )

equals(Object)

:{ : }

{ : }

Object

Object

{ : }

equals(Circle)

Page 18: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

boolean equals(Circle c)

enough?

Page 19: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

• To call equals(Circle c), the caller needs to know the existence of Circle

• Code that calls equals(Circle c) can’t be very general

Page 20: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

• Everyone should call equals(Object c)

• Example: ArrayList’s method contains(Object o)

Page 21: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Circle

- getArea- getPerimeter- contains- equals

Object- equals- toString- …

Page 22: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

We have the power to change how existing code behave

through overriding and polymorphism.

Page 23: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Abstraction Barrier between parent and

child

Page 24: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Abstraction Barrier

implementation of circle

usage of circleclient

implementer

Page 25: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Abstraction Barrierclass PaintedCircle extends Circle { :}

client

implementerclass Circle { : :}

class Point { : :}

Page 26: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

object reference

instance fields

pointer to class info

pointer to class fields

method table

class fields

inherited method

method

method

object

class

inherited instance

fields

inherited method

Only non-private fields / methods are accessible by the subclass

Page 27: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Everyone Same class

public Yes Yes

private No Yes

Page 28: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Everyone Same class Subclass

public Yes Yes Yes

private No Yes No

protected No Yes Yes

Page 29: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Abstraction Barrier

implementation of a package (set of related

classes and interfaces)

usage of the packageclient

implementer

Page 30: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Everyone Same class Subclass Package

public Yes Yes Yes Yes

private No Yes No No

protected No Yes Yes Yes

No Yes No Yes

Page 31: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Inheritance (done right)

Page 32: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Point- double x, y

Object-

Circle- double radius

Cylinder- double height

Page 33: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

cylinder.getPerimeter()circle.contains(cylinder)

it gets weird!

Page 34: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Point- double x, y- ..

Object-

Circle

- Point center- double radius- ..

Cylinder

- Circle base- double height- ..

Page 35: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

A circle has a point as its center

A cylinder has a circle as its base

Page 36: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

A circle is composed of a point as its center and a radius

A cylinder is composed of a circle as its base and a height

Page 37: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Composition

Page 38: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

A PaintedShape is composed of style information and geometric information

Page 39: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Style- Color fillColor- ..

Object-

Shape- getArea()- getPerimeter()- ..

PaintedShape- Style style- Shape shape

Page 40: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Inheritance is better for “is a” relationship

Page 41: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Circle

- getArea()- getPerimeter()- contains()- equals()

PaintedCircle

- Style style

Page 42: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

A painted circle is a type of circle

Everywhere where a circle is used, we can replace it with another circle (with style)

Page 43: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

cylinder.setBase(circle)paintedCircle.contains(p)

not weird

Page 44: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

A square is a rectangle

Page 45: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

square.setSize(w, h)

it’s weird

Page 46: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

void fillScreen(Rectangle r) { r.setSize(1280, 960);}

Page 47: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

hey! who messes with my rectangle?

Page 48: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

“if S is a subclass of T, then an object of type T can be replaced by an object of type S without changing the desirable property of the program “

Liskov Substitution Principle (LSP)

Page 49: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Barbara Liskov, MIT

Page 50: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

We have the power to change how existing code behave

through overriding and polymorphism.

Page 51: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

With great power comes great responsibility “ “

Page 52: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Uncle Ben

Page 53: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

It is our responsibility to ensure that LSP is observed when we inherit a class, so that we don’t break other’s

people code

Page 54: AY17/18 Sem 2cs2030/1718-s2/cs2030-lec03.pdf · AY17/18 Sem 2 object reference instance fields pointer to method table pointer to class fields pointer to print() { : } Circle object

AY17/18 Sem 2

Preventing Inheritance and

overriding with final