6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel...

28
6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Transcript of 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel...

Page 1: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

6.092: Thursday Lecture

Lucy Mendel MIT EECS

MIT 6.092 IAP 2006 1

Page 2: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Topics

z Interfaces, abstract classes

z Exceptions z Inner classes

MIT 6.092 IAP 2006 2

Page 3: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Abstract Classes

z Use when subclasses have some code in common

abstract class Person {private String name = “”;public String getName() { return name; }public void setName(String n) { name=n; } abstract public String sayGreeting();

} class EnglishPerson extends Person {

public String sayGreeting() { return "Hello"; } } MIT 6.092 IAP 2006 3

Page 4: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Interfacesz Use to make distinct or unknown or unspecified

components plug-and-play

public interface Dragable {public void drag();

} public class Icon implements Dragable {

public void drag() { … } } Public class Chair implements Dragable {

public void drag() { … } }

MIT 6.092 IAP 2006 4

Page 5: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Another reason to use Interfaces Public abstract class Cowboy {

/*kill something*/ public void draw() {…}

}

Public abstract class Curtain { /*let in sunshine*/

public void draw() {…} } MIT 6.092 IAP 2006 5

Page 6: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Cowboy Curtain

public class CowboyCurtain extends Cowboy, Curtain {

… }

CowboyCurtain cowboy = new CowboyCurtain();Cowboy.draw();// does it get brighter or does something die?

MIT 6.092 IAP 2006 6

Page 7: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Multiple implements, single extends

interface Drawable {public void draw(); class Icon implements

} Drawable, Clickable, Draggable {

interface Clickable { public void draw() { public void click(); SOP("drawing..."); }

} public void click() {SOP("clicking..."); }

interface Draggable { public void drag() { public void drag(); SOP("dragging..."); }

} }

MIT 6.092 IAP 2006 7

Page 8: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Subtyping

class Square { Should: public int width; Square extend Rectangle?

} Rectangle extend Square?class Rectangle {

public int width,height; } …int calculateArea (Square x) {

return (x.width)*(x.width); } int calculateCircumference (Rectangle x) {

return 2*(x.width+x.height); }

MIT 6.092 IAP 2006 8

Page 9: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Rectangle extends Squareclass Square {

public int width; Square( int x ) { width = x; }

} class Rectangle extends Square {

public int height; Rectangle( int width, int height ) {

super(width); this.height = height; }

} …Rectangle rect = new Rectangle( 2, 3 );calculateArea( rect ) ; // returns 4, not 6 !MIT 6.092 IAP 2006 9

Page 10: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Square extends Rectangle

class Rectangle { public int width, height;

} class Square extends Rectangle {

public int side; } … Square square = new Square( 3 ); calculateCircumference( sq ) ; // w.t.f. no height! MIT 6.092 IAP 2006 10

Page 11: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Square extends Rectangleclass Rectangle {

public int width, height; Rectangle( int width, int height ) {

this.width = width; this.height = height; } } class Square extends Rectangle {

Square( int x ) { super( x, x ); } } … Square square = new Square( 3 ); calculateCircumference( sq ) ; // 12, ok

MIT 6.092 IAP 2006 11

Page 12: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

True Subtyping

z Inheritance (extending classes) re-uses codez A true subtype will behave the right way when used

by code expecting its supertype.

class B { Bicycle myMethod(Bicycle arg) {…}

} class A {

RacingBicycle myMethod(Vehicle arg) {…} } MIT 6.092 IAP 2006 12

Page 13: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Composite

z Contain a class, rather than extend it

class ListSet { // might want to implement Set private List myList = new ArrayList(); void add(Object o) {

if (!myList.contains(o)) myList.add(o); }

… MIT 6.092 IAP 2006 13

Page 14: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Exceptionsz Goal: help programmers report and handle errorsz What happens when an exception is thrown? z Normal program control flow halts z Runtime environment searches for handler: try {

statement(s) that might throw exception} catch (exceptiontypeA name) {

handle or report exceptiontypeA} catch (exceptiontypeB name) {

handle or report exceptiontypeB} finally {

clean-up statement(s) }

MIT 6.092 IAP 2006 14

Page 15: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Exceptions

MIT 6.092 IAP 2006 15

Page 16: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Exception Catchingclass Editor {

public boolean openFile( String filename ) { try {

boolean fileOpen = true; File f = new File(filename); // do stuff with f return true;

} catch (FileNotFoundException e) { e.printStackTrace(); return false;

} finally { fileOpen = false;

} System.out.println(“ bar “);

} } MIT 6.092 IAP 2006 16

Page 17: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Exception Throwing

public class File { public File(String filename) throws FileNotFoundException {

if ( can’t find file ) {throw new FileNotFoundException();

} }

}

MIT 6.092 IAP 2006 17

Page 18: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Nested (or Inner) Classes

class EnclosingClass { ... class ANestedClass {

... } Why use nested

classes? …

}

MIT 6.092 IAP 2006 18

Page 19: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Nested Classes

MIT 6.092 IAP 2006 19

Page 20: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Nested Class Properties

z Have access to all members of the enclosing class,even private members

z can be declared static (and final, abstract) z Non-static (or instance) nested classes are called

inner classes

class EnclosingClass { static class StaticNestedClass { ... } class InnerClass { … }

}

MIT 6.092 IAP 2006 20

Page 21: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

IAP 2006

Inner Classes (non-static nested classes)

z Associated with an instance of the enclosing class z Cannot declare static members

z Can only be instantiated within context of enclosing class

MIT 6.092 21

Page 22: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Local Anonymous Inner Classpublic class Stack {

private ArrayList items; public Iterator iterator() {

private class StackIterator implements Iterator { int currentItem = items.size() - 1; public boolean hasNext() { ... } public ArrayList<Object> next() { ... } public void remove() { ... }

} return new StackIterator();

} /* or declare here */

} MIT 6.092 IAP 2006 22

Page 23: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Anonymous Inner Classpublic class Stack {

private ArrayList items; public Iterator iterator() {

return new Iterator() { int currentItem = items.size() - 1; public boolean hasNext() { ... } public ArrayList<Object> next() { ... } public void remove() { ... }

} ; }

} MIT 6.092 IAP 2006 23

Page 24: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Floating Point Precision

System.out.println(1.00 - .42); // 0.6100000000000000001

System.out.println(1.00 - 9*.10) ;// 0.0999999999999999995

z BigDecimal z Pain of using Objects

z int or long z keep track of decimal yourself, eg, put money in terms of

pennies

MIT 6.092 IAP 2006 24

Page 25: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Defensive Programming

MIT 6.092 IAP 2006 25

Page 26: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

public class Man { private Wallet myWallet; public Money payPaperboy() {

return myWallet.money;}

} public class Paperboy {

public Money payment; public void getPaid( Man m ) {

payment += m.payPaperboy(); }

} MIT 6.092 IAP 2006 26

Page 27: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Minimize Accessibility

public class Man {public Wallet myWallet;

} public class Paperboy {

public Money payment; public void getPaid( Man m ) {

payment += m.myWallet.money; }

} MIT 6.092 IAP 2006 27

Page 28: 6.092: Thursday Lecture - MIT OpenCourseWare · 2020-01-03 · 6.092: Thursday Lecture Lucy Mendel MIT EECS MIT 6.092 IAP 2006 1

Keep field references uniquez Copy parameters before assigning them to fieldsz Copy fields before returning them

public final class Period { private final Date start; private final Date end; public Period(Date satrt, Date end) {

if (start.compareTo(end) > 0) throw new IllegalArgumentException(start + " after " + end);

this.start = start; this.end = end;

}public Date start() { return start; }public Date end() { return end; }

} MIT 6.092 IAP 2006 28