-
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