abstract classes, type conversion Nov. 23, 2016 1 RECALL: - - PowerPoint PPT Presentation

abstract classes type conversion
SMART_READER_LITE
LIVE PREVIEW

abstract classes, type conversion Nov. 23, 2016 1 RECALL: - - PowerPoint PPT Presentation

COMP 250 Lecture 31 abstract classes, type conversion Nov. 23, 2016 1 RECALL: interfaces interface Shape float getArea() float getPerimeter() : implements implements class Rectangle class Circle Rectangle() { } Circle() {


slide-1
SLIDE 1

1

COMP 250

Lecture 31

abstract classes, type conversion

  • Nov. 23, 2016
slide-2
SLIDE 2

interface Shape

float getArea() float getPerimeter()

:

RECALL: interfaces

class Rectangle

Rectangle() { …} float getArea() { …. } float getArea() { …. } implements

class Circle

Circle() { …} float getArea() { …. } float getArea() { …. } implements

2

slide-3
SLIDE 3

classes

(tree, parent links only)

interfaces

3

slide-4
SLIDE 4

classes

(tree, parent links only)

interfaces

A subclass can extend one superclass. A class can implement multiple interfaces. An interface can extend multiple interfaces.

extends extends implements

4

slide-5
SLIDE 5

Example: Circular

Circle Sphere Cylinder

5

slide-6
SLIDE 6

interface Circular

double getRadius() void setRadius(double) double getArea()

:

implements implements

class Circle

double radius double getRadius(){ … } void setRadius(double){…} double getArea() { … }

class Sphere

 same 

class Cylinder

double radius double getRadius() {…} void setRadius(double){…} double getArea(){….}

implements

Can we avoid repeating these method definitions?

6

slide-7
SLIDE 7

Abstract Class

  • Like a class, it can have fields and methods with

bodies

  • Like an interface, it can have methods with only

signatures.

7

slide-8
SLIDE 8

abstract class Circular

double radius double getRadius() { return radius; } void setRadius(double r) { radius = r…} abstract double getArea()

:

extends extends

class Circle

Circle( double radius){ … } double getArea() { … }

class Sphere

Sphere( double radius) { … } double getArea() { …. }

class Cylinder

double length Cylinder (double radius, double len){ …} double getArea(){ … }

extends

8

slide-9
SLIDE 9

abstract class Circular {

double radius; // field Circular(double radius){ // constructor this.radius = radius; } double getRadius(){ // implemented methods return radius; } void setRadius(double r){ this.radius = r; } abstract double getArea(); // abstract method }

9

slide-10
SLIDE 10

class Circle extends Circular{

Circle(double radius){ // constructor super(radius); // superclass field } double getArea(){ double r = this.getRadius(); return Math.PI * r*r; } }

10

slide-11
SLIDE 11

class Cylinder extends Circular{

double height; Cylinder(double radius, double h){ // constructor super(radius); this.height = h; } double getArea(){ double r = this.getRadius(); return 2 * Math.PI * radius * height; } }

11

slide-12
SLIDE 12

abstract class Shape

double getArea() { return 0; }

:

class Circle

Circle( double radius){ … } double getArea() { … }

class Square

Square( double width) { … } double getArea() { …}

class Triangle

Triangle(double height, double base){ …} double getArea(){ … }

MY BAD Example: Assignment 4

extends extends extends

12

slide-13
SLIDE 13

interface Shape

double getArea()

:

class Circle

Circle( double radius){ … } double getArea() { … }

class Square

Square( double width) { … } double getArea() { …}

class Triangle

Triangle(double height, double base){ …} double getArea(){ … }

implements implements implements

It should have been:

13

slide-14
SLIDE 14

14

COMP 250

Lecture 31

abstract classes, type conversion

  • Nov. 23, 2016
slide-15
SLIDE 15

Primitive Type Conversion

double float long int short char byte boolean

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html In COMP 273, you will learn exactly how these number representations are related to each other. But you should have some intuitive ideas….

15

slide-16
SLIDE 16

Primitive Type Conversion

narrower wider double float long int short char byte boolean 8 4 8 4 2 2 1 1

Wider usually (but not always) means more bytes.

number

  • f bytes

16

slide-17
SLIDE 17

int i = 3; double d = 4.2; d = i; // widening d = 5.3 * i; // widening (by "promotion") i = (int) d; // narrowing (by casting) float f = (float) d; // narrowing (by casting) char c = 'g'; int index = c; // widening c = (char) index; // narrowing For narrowing conversions, you get a compiler error if you don’t cast.

Examples

17

slide-18
SLIDE 18

class Dog

extends

class Beagle

narrower wider

Heads up! Although the subclass is narrower, it has more bytes than the superclass.

18

slide-19
SLIDE 19

Dog myDog = new Beagle(); // upcast, widening This is similar to: double myDouble = 3; // from int to double.

class Dog

extends

class Beagle

19

slide-20
SLIDE 20

Dog myDog = new Beagle(); // Upcasting. Poodle myPoodle = myDog; // Compiler error. // implicit downcast Dog to Poodle not allowed. myDog.show() // Compiler error. // Poodle has show() method, // but Dog does not.

20

slide-21
SLIDE 21

Dog myDog = new Beagle(); // Upcasting. Poodle myPoodle = (Poodle) myDog; // allowed by compiler myPoodle.show() // allowed by compiler // Runtime error: Dog object // does not have show() method ((Poodle) myDog).show() // allowed by compiler, but will generate runtime // error if actual object doesn’t have a show method.

21

slide-22
SLIDE 22

How to avoid such runtime errors?

if (myDog instanceOf Poodle){ ( (Poodle) myDog ).show(); } if (myPoodle instanceOf Poodle){ myPoodle.show(); }

22