messages, instances, and initialization (methods) cmps 2143

31
Messages, Instances, and Initialization (Methods) CMPS 2143

Upload: adrian-casey

Post on 16-Jan-2016

255 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Messages, Instances, and Initialization (Methods) CMPS 2143

Messages, Instances, and Initialization (Methods)

CMPS 2143

Page 2: Messages, Instances, and Initialization (Methods) CMPS 2143

2

Terms

•Creation – allocation of memory space for a new object and the binding of that space to a name

• Initialization – setting initial data values for the object and establishing initial conditions for manipulating it

•Message passing (method lookup, method call) – dynamic process of asking an object to perform a specific action.

Page 3: Messages, Instances, and Initialization (Methods) CMPS 2143

3

Messages

•A message is always given to some object, called the receiver

•Different objects may accept the same message and yet perform different actions ▫eg. circle.getArea() and square.getArea()

•3 parts to a message-passing expression▫aGame.displayCard (aCard, 42, 27) receiver message selector arguments

Page 4: Messages, Instances, and Initialization (Methods) CMPS 2143

4

Variations in Messages Syntax

•Most common syntax uses period to separate receiver from selector / some use a space

•Requiring ( ) when they are empty (known as a unary message)

•Messages may require keyword notations▫aGame displayCard: aCard atLocation: 45 and: 56.

•Might use brackets▫ int cardRank = [aCard getRank];

Page 5: Messages, Instances, and Initialization (Methods) CMPS 2143

5

Examples:•C++, C#, Java, Python, Ruby aCard.flip (); aCard.setFaceUp (true);

•Pascal, Delphi, Eiffel, Oberon aCard.flip; aCard.setFaceUp (true);•Smalltalk aCard flip. aCard setFaceUp: true.•Objective-C [aCard flip.] [aCard setFaceUp: true].•CLOS (flip aCard) (setFaceUp aCard true)

Page 6: Messages, Instances, and Initialization (Methods) CMPS 2143

6

Statically vs Dynamically Typed Languages• IMPORTANT in regards to message passing

• Java, C++, C#, and Pascal are statically typed▫Use the type of the receiver to check at compile time that

a receiver will understand the message selector•Smalltalk, CLOS and Python are dynamically typed▫No way to do this at compile time, so may generate a run

time error if receiver does not understand the message selector

•Objective-C – you have a choice on a variable by variable basis

Page 7: Messages, Instances, and Initialization (Methods) CMPS 2143

7

Accessing Receiver within Method

•Message is ALWAYS passed to a receiver in OOP•Receiver (in most languages) does NOT appear in the

arguments - it is implicit within the method

•When necessary, can be explicit and use a pseudo-variable ▫Java, C++, C# use this▫Eiffel uses Current▫Smalltalk, Obj-C, Object Pascal – use self▫Python, CLOS, Oberon require explicit

Page 8: Messages, Instances, and Initialization (Methods) CMPS 2143

8

C++ Example of thisPlayingCard::PlayingCard (Suits suitValue, int rankValue) { this.suitValue = suitValue; this.rankValue = rankValue;}

•Rarely needed, unless you need to pass this to another method.

•Some Java guidelines suggest this style.

Page 9: Messages, Instances, and Initialization (Methods) CMPS 2143

9

Java Example

class QuitButton extends Button implements ActionListener {

public QuitButton ( ) { :

//install ourself as a listener for button //events addActionListener (this); } :}

Page 10: Messages, Instances, and Initialization (Methods) CMPS 2143

10

Creating Primitive objects•Most languages, variables created in a declaration

statement – some can combine initialization• Pascal

var sum : integer; begin sum := 0;

• Java, C++, C# int sum = 0;

• Primitive variables exist within block they are declared

Page 11: Messages, Instances, and Initialization (Methods) CMPS 2143

11

Creating Objects•Usually process of naming and creating Objects separate

• JavaPlayingCard aCard;aCard = new PlayingCard (Heart, 3);

•or

PlayingCard aCard = new PlayingCard (Heart, 3);

Page 12: Messages, Instances, and Initialization (Methods) CMPS 2143

12

Creating Objects

•C++ - you have a choicePlayingCard aCard(Heart, 3);

•orPlayingCard * aCard;aCard = new PlayingCard (Heart, 3);

Page 13: Messages, Instances, and Initialization (Methods) CMPS 2143

13

Creation of Array of Objects

•Create/allocate array•Create/allocate array elements

•C++ - can be combined PlayingCard cardArray [52]; //all will have default values Heart, 0

• JavaPlayingCard cardArray[ ] = new PlayingCard [52];for (int i = 0; i < 13; i++) cardArray[i] = new PlayingCard (Spade, i+1);

Draw Picture

Page 14: Messages, Instances, and Initialization (Methods) CMPS 2143

14

Memory Allocation

•All OO languages use pointers in underlying representation – not all expose this rep to the programmer

• Java “has no pointers” in contrast to C++ (that is they can’t be seen by the programmer)

•C++PlayingCard aCard; //automatic variable

PlayingCard * aCard = new PlayingCard; //dynamically allocated

Page 15: Messages, Instances, and Initialization (Methods) CMPS 2143

15

Memory Recovery

•Primitive variables are automatically recovered on procedure/method exit

•Automatic variables are automatically recovered on procedure/method exit

•Dynamically allocated variables are recovered▫Using delete or free

Fast, but programmer could forget and create memory leaks▫Automatic garbage collection

Slow, but no memory leaks and not possible to accidently try to use memory after freed or try to free memory already freed

Page 16: Messages, Instances, and Initialization (Methods) CMPS 2143

16

Examples

•Ojective-C [acard free];•C++ delete aCard•Arrays▫C++ delete [ ] cardArray;

• Java, C#, Smalltalk, CLOS – auto garbage collection

Page 17: Messages, Instances, and Initialization (Methods) CMPS 2143

17

Constructors

•Constructor is a special method used to initialize a newly created object

•Want to guarantee that an object can never be used before it has been initialized

•Do NOT construct twice!!!▫You’ll get a redefinition error or memory leak

•Constructors have same name as class•Never have a return type

Page 18: Messages, Instances, and Initialization (Methods) CMPS 2143

18

Example• Java declaration/definition

class PlayingCard { public PlayingCard (int s, int r) { suit = s; rank = r; faceup = true; } : }

•UseaCard = new PlayingCard (PlayingCard.Diamong, 3);

Page 19: Messages, Instances, and Initialization (Methods) CMPS 2143

19

Overloaded Constructors•C++, C#, Java allow several methods with same name,

as long as signature is different

class PlayingCard { public: PlayingCard () { suit = Diamond; rank = 1; faceUp = true;}

PlayingCard (Suit s, int r) { suit = s; rank = r; faceUp = true;}

PlayingCard ( PlayingCard & other) { suit = other.suit; rank = other.rank; }};

Page 20: Messages, Instances, and Initialization (Methods) CMPS 2143

20

Calling Constructors in C++

PlayingCard cardOne; //invokes defaultPlayingCard * cardTwo = new PlayingCard; //defaultPlayingCard cardThree (PlayingCard.Heart, 3); //param.PlayingCard cardFour (cardThree); //copy

CAREFUL!!!

//creates a new cardPlayingCard cardFive;

//forward definition for function called cardSix that//returns a PlayingCardPlayingCard cardSix (); //

Page 21: Messages, Instances, and Initialization (Methods) CMPS 2143

21

Calling Constructors in Java

PlayingCard cardOne = new PlayingCard(); //defaultPlayingCard cardTwo = new PlayingCard(); //defaultPlayingCard cardThree = new PlayingCard(PlayingCard.Heart, 3); //param.PlayingCard cardFour = cardThree.clone(); //copy

CAREFUL!!!

//only creates referencePlayingCard cardFive;

//syntax error??PlayingCard cardSix ();

Page 22: Messages, Instances, and Initialization (Methods) CMPS 2143

22

Other languages

•Objective-C constructors do not have to have same name, use + sign

•Apple Object Pascal has none (create using new)•Delphi Pascal closer to C++•Python uses __init__

Page 23: Messages, Instances, and Initialization (Methods) CMPS 2143

23

Constant values

•Data fields that can be assigned once and thereafter are not allowed to change

•Constructors give us the ability to assign the values

• Java – it is a final variable

class ShippingCo implements IShippingCo { //max packages public final int MAX = 100; :}

Page 24: Messages, Instances, and Initialization (Methods) CMPS 2143

24

Java•Final value can be assigned in the constructor (s)

class Game implements IGame { public Game (int maxPlayers ) { MAXPLAYERS = maxPlayers; : } : public final int MAXPLAYERS;}

Page 25: Messages, Instances, and Initialization (Methods) CMPS 2143

25

C++• Just uses const instead

•One difference between C++ and Java▫C++ are truly constant▫Java finals asserts that the associated variable cannot be

assigned a new value – nothing prevents it from changing its own internal state

final aBox = new Box(); //aBox can be assigned only //once

aBox.setHeight (10); //can change internal state

Page 26: Messages, Instances, and Initialization (Methods) CMPS 2143

26

Orthodox canonical class form

•C++ Guidelines on Style say you should define 4 important methods1. A default constructor2. A copy constructor3. An overloaded assignment operator4. A destructor (even if it is an empty method)

• We have already seen the first two

Page 27: Messages, Instances, and Initialization (Methods) CMPS 2143

27

Destructors and Finalizers•Actions to perform at the end of a variable’s lifetime

•Performed in C++ with a destructor easily▫Invoked automatically

On block exit for automatic variables On delete for dynamic variables

▫Destructor is the name of the class preceded by a tilde (~) Has no arguments

•Should always provide one, even if empty▫There is a system default one

Page 28: Messages, Instances, and Initialization (Methods) CMPS 2143

28

C++

class ShippingCo {

public: : ~ShippingCo ( ) { delete [] items;}

private: Package [ ] packages;

int numPackages; int coID;}

Page 29: Messages, Instances, and Initialization (Methods) CMPS 2143

29

Other languages

•Delphi Pascal uses keyword destructor, called when memory is freed

• Java and Eiffel have similar facilities, although both languages use garbage collection.

Page 30: Messages, Instances, and Initialization (Methods) CMPS 2143

30

Java finalizer

Class FinalizeExample { : public void finalize () { System.out.printline (“finally doing finalization”); System.exit (0); }

Object x = new FinalizeExample (); //Superclass Objectx = new Integer (3); //redefining x releases memory . : //at any point the gc will get it

Page 31: Messages, Instances, and Initialization (Methods) CMPS 2143

31

Metaclasses

•Hidden classes•Ha! Classes are objects▫Contain static member data and static methods▫To access these members

ClassName.methodName (args);

double y = Math.sqrt (4.4);