cs 106a, lecture 22 more classes - stanford university...ipod blueprint (class) state: current song...

44
This document is copyright (C) Stanford Computer Science and Marty Stepp, licensed under Creative Commons Attribution 2.5 License. All rights reserved. Based on slides created by Keith Schwarz, Mehran Sahami, Eric Roberts, Stuart Reges, and others. CS 106A, Lecture 22 More Classes suggested reading: Java Ch. 6

Upload: others

Post on 14-Feb-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Thisdocumentiscopyright(C)StanfordComputerScienceandMartyStepp,licensedunderCreativeCommonsAttribution2.5License.Allrightsreserved.BasedonslidescreatedbyKeithSchwarz,MehranSahami,EricRoberts,StuartReges,andothers.

    CS106A,Lecture22MoreClasses

    suggestedreading:JavaCh.6

  • 2

    Learning Goals• Knowhowtodefineourownvariabletypes• Knowhowtodefinevariabletypesthatinheritfromothertypes• Beabletowriteprogramsconsistingofmultipleclasses

  • 3

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 4

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 5

    What Is A Class?

    Aclassdefinesanewvariabletype.

  • 6

    Classes Are Like BlueprintsiPodblueprint(class)

    state:currentsongvolumebatterylifebehavior:poweron/offchangestation/songchangevolumechooserandomsong

    iPod(variable)#1state:song="1,000,000Miles"volume=17batterylife=2.5hrsbehavior:poweron/offchangestation/songchangevolumechooserandomsong

    iPod(variable)#2state:song="LettingYou"volume=9batterylife=3.41hrsbehavior:poweron/offchangestation/songchangevolumechooserandomsong

    iPod(variable)#3state:song="Discipline"volume=24batterylife=1.8hrsbehavior:poweron/offchangestation/songchangevolumechooserandomsong

    constructs

  • 7

    What if…Whatifwecouldwriteaprogramlikethis:

    BankAccount nickAccount = new BankAccount();nickAccount.setName(“Nick”);nickAccount.deposit(50);

    BankAccount rishiAccount = new BankAccount();rishiAccount.setName(“Rishi”);rishiAccount.deposit(50);boolean success = rishiAccount.withdraw(10);if (success) {

    println(“Rishi withdrew $10.”);}

  • 8

    Creating A New Class1. Whatinformationisinsidethisnewvariabletype? Theseareitsprivateinstancevariables.

  • 9

    Example: BankAccount// In file BankAccount.javapublic class BankAccount {

    // Step 1: the data inside a BankAccountprivate String name;private double balance;

    }

    Each BankAccount object has its own copyof all instance variables.

  • 10

    Creating A New Class1. Whatinformationisinsidethisnewvariabletype? Theseareitsinstancevariables.

    2. Whatcanthisnewvariabletypedo?Theseareitspublicmethods.

  • 11

    Example: BankAccountpublic class BankAccount {

    // Step 1: the data inside a BankAccountprivate String name;private double balance;

    // Step 2: the things a BankAccount can dopublic void deposit(double amount) {

    balance += amount;}

    public boolean withdraw(double amount) {if (balance >= amount) {

    balance -= amount;return true;

    }return false;

    }}

  • 12

    Defining Methods In ClassesMethodsdefinedinclassescanbecalledonaninstanceofthatclass.

    Whenoneofthesemethodsexecutes,itcanreferencethatobject’scopy ofinstancevariables.

    ba1.deposit(0.20);ba2.deposit(1000.00);

    Thismeanscallingoneofthesemethodsondifferentobjectshasdifferenteffects.

    name = "Marty"balance = 1.45deposit(amount) {

    balance += amount;}

    name = "Mehran"balance = 901000.00deposit(amount) {

    balance += amount;}

    ba1

    ba2

  • 13

    Getters and SettersInstancevariablesinaclassshouldalwaysbeprivate.Thisissoonlytheobjectitselfcanmodifythem,andno-oneelse.

    Toallowtheclienttoreferencethem,wedefinepublicmethodsintheclassthatset aninstancevariable’svalueandget (return)aninstancevariable’svalue.Thesearecommonlyknownasgetters andsetters.

    account.setName(“Nick”);String accountName = account.getName();

    Gettersandsetterspreventinstancevariablesfrombeingtamperedwith.

  • 14

    Example: BankAccountpublic class BankAccount {

    private String name;private double balance;

    ...public void setName(String newName) {

    if (newName.length() > 0) {name = newName;

    }}

    public String getName() {return name;

    }}

  • 15

    Creating A New Class1. Whatinformationisinsidethisnewvariabletype? Theseareitsinstancevariables.

    2. Whatcanthisnewvariabletypedo?Theseareitspublicmethods.

    3. Howdoyoucreateavariableofthistype?Thisistheconstructor.

  • 16

    ConstructorsBankAccount ba1 = new BankAccount();

    BankAccount ba2 = new BankAccount(“Nick”, 50);

    The constructor is executed when a new object is created.

  • 17

    Example: BankAccountpublic class BankAccount {// Step 1: the data inside a BankAccountprivate String name;private double balance;

    // Step 2: the things a BankAccount can do (omitted)// Step 3: how to create a BankAccountpublic BankAccount(String accountName, double startBalance) {

    name = accountName;balance = startBalance;

    }

    public BankAccount(String accountName) {name = accountName;balance = 0;

    }}

  • 18

    Using ConstructorsBankAccount ba1 =

    new BankAccount("Marty", 1.25);

    BankAccount ba2 =new BankAccount("Mehran", 900000.00);

    • Whenyoucallaconstructor(withnew):– Javacreatesanewobjectofthatclass.– Theconstructorruns,onthatnewobject.– Thenewlycreatedobjectisreturnedtoyourprogram.

    name = "Marty"balance = 1.25BankAccount(nm, bal) {

    name = nm;balance = bal;

    }

    name = "Mehran"balance = 900000.00BankAccount(nm, bal) {

    name = nm;balance = bal;

    }

    ba1

    ba2

  • 19

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 20

    Printing Variables• Bydefault,Javadoesn'tknowhowtoprintobjects.

    // ba1 is BankAccount@9e8c34BankAccount ba1 = new BankAccount("Marty", 1.25);println("ba1 is " + ba1);

    // better, but cumbersome to write// ba1 is Marty with $1.25println("ba1 is " + ba1.getName() + " with $"

    + ba1.getBalance());

    // desired behaviorprintln("ba1 is " + ba1); // ba1 is Marty with $1.25

  • 21

    The toString MethodAspecialmethodinaclassthattellsJavahowtoconvertanobjectintoastring.

    BankAccount ba1 = new BankAccount("Marty", 1.25);println("ba1 is " + ba1);

    // the above code is really calling the following:println("ba1 is " + ba1.toString());

    • EveryclasshasatoString,evenifitisn'tinyourcode.– Default:class'sname@ object'smemoryaddress(base16)

    BankAccount@9e8c34

  • 22

    The toString Methodpublic String toString() {

    code that returns a Stringrepresenting this object;

    }

    – Methodname,return,andparametersmustmatchexactly.

    – Example:// Returns a String representing this account.public String toString() {

    return name + " has $" + balance;}

  • 23

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 24

    The “this” Keywordthis:Referstotheobjectonwhichamethodiscurrentlybeingcalled

    BankAccount ba1 = new BankAccount();ba1.deposit(5);

    // in BankAccount.javapublic void deposit(double amount) {

    // for code above, “this” -> ba1...

    }

  • 25

    Using “this”Sometimeswewanttonameparametersthesameasinstancevariables.

    public class BankAccount {private double balance;private String name;...

    public void setName(String newName) {name = newName;

    }}

    – Here,theparametertosetName isnamednewName tobedistinctfromtheobject'sfieldname .

  • 26

    Using “this”public class BankAccount {

    private double balance;private String name;...

    public void setName(String name) {name = name;

    }}

  • 27

    Using “this”Wecanuse“this”tospecifywhichoneistheinstancevariableandwhichoneisthelocalvariable.

    public class BankAccount {private double balance;private String name;...

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

    }}

  • 28

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 29

    Practice: EmployeeLet’sdefineanewvariabletypecalledEmployeethatrepresentsasingleEmployee.

    WhatinformationwouldanEmployeestore?

    WhatcouldanEmployeedo?

    HowwouldyoucreateanewEmployeevariable?

  • 30

    Plan for today•Recap:Classes•toString•this•Example: Employee•Inheritance

  • 31

    Inheritance

    Inheritanceletsusrelateourvariable

    typestooneanother.

  • 32

    Inheritance

    Employee

    Programmer

    KarelProgrammer

    Variabletypescanseemto“inherit”fromeachother.Wedon’twanttohavetoduplicatecodeforeachone!

  • 33

    Example: GObjects• TheStanfordlibraryusesaninheritancehierarchyofgraphicalobjectsbasedonacommonsuperclassnamedGObject.

  • 34

    Example: GObjects• GObject definesthestateandbehaviorcommontoallshapes:

    contains(x, y)getColor(), setColor(color)getHeight(), getWidth(), getLocation(), setLocation(x, y)getX(), getY(), setX(x), setY(y), move(dx, dy)setVisible(visible), sendForward(), sendBackward()toString()

    • Thesubclassesaddstateandbehavioruniquetothem:GLabel GLine GPolygon

    get/setFont get/setStartPoint addEdgeget/setLabel get/setEndPoint addVertex

    get/setFillColor... ... ..

  • 35

    Using Inheritancepublic class Name extends Superclass {

    – Example:

    public class Programmer extends Employee {...

    }

    • ByextendingEmployee,thistellsJavathatProgrammer candoeverythinganEmployeecando,plusmore.

    • ProgrammerautomaticallyinheritsallofthecodefromEmployee!• ThesuperclassisEmployee,thesubclass isProgrammer.

  • 36

    Example: Programmerpublic class Programmer extends Employee {

    private int timeCoding;...public void code() {

    timeCoding += 10;}

    }

    ...

    Programmer rishi = new Programmer(“Rishi”);rishi.code(); // from Programmerrishi.promote(); // from Employee!

  • 37

    Example: KarelProgrammerpublic class KarelProgrammer extends Programmer {

    private int numBeepersPicked;...public void pickBeepers() {

    numBeepersPicked += 2;}

    }

    ...KarelProgrammer nick = new KarelProgrammer(“Nick”);nick.pickBeepers(); // from KarelProgrammernick.code(); // from Programmer!nick.promote(); // From Employee!

  • 38

    GCanvas• AGCanvas isthecanvasareathatdisplaysallgraphicalobjectsinaGraphicsProgram.

    • WhenyoucreateaGraphicsProgram,itautomaticallycreatesaGCanvas foritself,putsitonthescreen,andusesittoaddallgraphicalshapes.

    • GCanvas istheonethatcontainsmethodslike:– getElementAt– add– remove– getWidth– getHeight– …

  • 39

    GCanvaspublic class Graphics extends GraphicsProgram {

    public void run() {// A GCanvas has been created for us!GRect rect = new GRect(50, 50);add(rect); // adds to the GCanvas!

    ...// Checks our GCanvas for elements!GObject obj = getElementAt(25, 25);

    }}

  • 40

    Extending GCanvaspublic class Graphics extends Program {

    public void run() {// We have to make our own GCanvas nowMyCanvas canvas = new MyCanvas();add(canvas);

    // Can’t do this anymore, because we are // not using GraphicsProgram’s provided // canvasGObject obj = getElementAt(…);

    }}

  • 41

    Extending GCanvaspublic class MyCanvas extends GCanvas {

    public void addCenteredSquare(int size) {GRect rect = new GRect(size, size);int x = getWidth() / 2.0 –

    rect.getWidth() / 2.0;int y = getHeight() / 2.0 –

    rect.getHeight() / 2.0;add(rect, x, y);

    }}

  • 42

    Extending GCanvaspublic class Graphics extends Program {

    public void run() {// We have to make our own GCanvas nowMyCanvas canvas = new MyCanvas();add(canvas);

    canvas.addCenteredSquare(20);}

    }

  • 43

    Extending GCanvas•Sometimes,wewanttobeabletohaveallofourgraphics-relatedcodeinaseparatefile.

    •Todothis,insteadofusingtheprovidedGraphicsProgram canvas,wedefineourownsubclassofGCanvas, haveourprogramextendProgram,andaddourowncanvasourselves.

    •Then,allgraphics-relatedcodecangoinourGCanvas subclass.

  • 44

    Recap•Classesletusdefineourownvariabletypes,withtheirowninstancevariables,methodsandconstructors.

    •Wecanrelate ourvariabletypestooneanotherbyusinginheritance.Oneclasscanextend anothertoinherititsbehavior.

    •WecanextendGCanvas inagraphicalprogramtodecomposeallofourgraphics-relatedcodeinoneplace.

    Nexttime: InteractorsandGUIs