ITI Introduction to Computing II

Similar documents
ITI Introduction to Computing II

1 ListElement l e = f i r s t ; / / s t a r t i n g p o i n t 2 while ( l e. next!= n u l l ) 3 { l e = l e. next ; / / next step 4 } Removal

Computer Science Introductory Course MSc - Introduction to Java

More About Methods. Hsuan-Tien Lin. Deptartment of CSIE, NTU. OOP Class, March 8-9, 2010

Constructors - Cont. must be distinguished by the number or type of their arguments.

CS Exam 1 Study Guide and Practice Exam

Basic Java OOP 10/12/2015. Department of Computer Science & Information Engineering. National Taiwan University

1 Trees. Listing 1: Node with two child reference. public class ptwochildnode { protected Object data ; protected ptwochildnode l e f t, r i g h t ;

Comp 11 Lectures. Mike Shah. July 12, Tufts University. Mike Shah (Tufts University) Comp 11 Lectures July 12, / 33

More on Methods and Encapsulation

1. Write a program to calculate distance traveled by light

Hoare Logic: Reasoning About Imperative Programs

DARN: A Matrix Manipulation Language

Introduction to Programming (Java) 3/12

INTRODUCTION. This is not a full c-programming course. It is not even a full 'Java to c' programming course.

A Short Introduction to Hoare Logic

Data Structures and Algorithms Winter Semester

Measuring Goodness of an Algorithm. Asymptotic Analysis of Algorithms. Measuring Efficiency of an Algorithm. Algorithm and Data Structure

Programming Language Concepts, CS2104 Lecture 3

Outline. policies for the first part. with some potential answers... MCS 260 Lecture 10.0 Introduction to Computer Science Jan Verschelde, 9 July 2014

Class versus Instance (Section 5.1)

Hoare Examples & Proof Theory. COS 441 Slides 11

ECEN 651: Microprogrammed Control of Digital Systems Department of Electrical and Computer Engineering Texas A&M University

Lecture 20: Analysis of Algorithms

6.001 Recitation 22: Streams

Course Announcements. John Jannotti (cs32) Scope, Collections & Generics Feb 8, / 1

Clojure Concurrency Constructs, Part Two. CSCI 5828: Foundations of Software Engineering Lecture 13 10/07/2014

CSE 331 Winter 2018 Reasoning About Code I

Analysis of Algorithms

Enrico Nardelli Logic Circuits and Computer Architecture

1 Java Night Countdown (30%)

10: Analysis of Algorithms

FACULTY OF SCIENCE ACADEMY OF COMPUTER SCIENCE AND SOFTWARE ENGINEERING OBJECT ORIENTED PROGRAMMING DATE 07/2014 SESSION 8:00-10:00

Sharing Objects. Pieter van den Hombergh. Fontys Hogeschool voor Techniek en Logistiek. February 15, 2017

Program Verification Using Separation Logic

CS5371 Theory of Computation. Lecture 7: Automata Theory V (CFG, CFL, CNF)

MiniMat: Matrix Language in OCaml LLVM

CSE332: Data Structures & Parallelism Lecture 2: Algorithm Analysis. Ruth Anderson Winter 2019

EDA045F: Program Analysis LECTURE 10: TYPES 1. Christoph Reichenbach

Introduction to Computing II (ITI 1121) FINAL EXAMINATION

Deterministic Finite Automaton (DFA)

Automata Theory CS S-12 Turing Machine Modifications

Unit 8: Sequ. ential Circuits

Program Analysis Part I : Sequential Programs

Functional Programming with F# Overview and Basic Concepts

20.1 2SAT. CS125 Lecture 20 Fall 2016

CSE373: Data Structures and Algorithms Lecture 3: Math Review; Algorithm Analysis. Catie Baker Spring 2015

EECS 144/244: Fundamental Algorithms for System Modeling, Analysis, and Optimization

Tou has been released!

Formal Reasoning CSE 331. Lecture 2 Formal Reasoning. Announcements. Formalization and Reasoning. Software Design and Implementation

Outline Resource Introduction Usage Testing Exercises. Linked Lists COMP SCI / SFWR ENG 2S03. Department of Computing and Software McMaster University

Topic 1: Propositional logic

Latches. October 13, 2003 Latches 1

Deductive Verification

CS 163/164 - Exam 1 Study Guide and Practice Exam

COMS 6100 Class Notes

Introduction to Computing II (ITI1121) FINAL EXAMINATION

CompA - Complex Analyzer

Solutions. Prelim 2[Solutions]

Algorithmic verification

Solving Equations by Adding and Subtracting

Comp 11 Lectures. Mike Shah. June 20, Tufts University. Mike Shah (Tufts University) Comp 11 Lectures June 20, / 38

Introducing Proof 1. hsn.uk.net. Contents

CSE370: Introduction to Digital Design

CSE 20. Lecture 4: Introduction to Boolean algebra. CSE 20: Lecture4

Lecture 8 : Structural Induction DRAFT

QUIZ - How Well Do You Know RPN? Richard J. Nelson

CSE 200 Lecture Notes Turing machine vs. RAM machine vs. circuits

Static Program Analysis

INF Models of concurrency

Prelim 2[Solutions] Solutions. 1. Short Answer [18 pts]

Softwaretechnik. Lecture 13: Design by Contract. Peter Thiemann University of Freiburg, Germany

Description of the ED library Basic Atoms

A particle system takes small time-steps and updates each particle's location and velocity based on the forces acting on it.

Computational complexity and some Graph Theory

CSE332: Data Structures & Parallelism Lecture 2: Algorithm Analysis. Ruth Anderson Winter 2018

Information and Entropy. Professor Kevin Gold

Softwaretechnik. Lecture 13: Design by Contract. Peter Thiemann University of Freiburg, Germany

CMSC 132, Object-Oriented Programming II Summer Lecture 10:

Finite Automata Part Two

MAT2345 Discrete Math

CSE332: Data Structures & Parallelism Lecture 2: Algorithm Analysis. Ruth Anderson Winter 2018

Comp487/587 - Boolean Formulas

Computer Science. Questions for discussion Part II. Computer Science COMPUTER SCIENCE. Section 4.2.

Elementary Sorts 1 / 18

From Greek philosophers to circuits: An introduction to boolean logic. COS 116, Spring 2011 Sanjeev Arora

Abstract & Applied Linear Algebra (Chapters 1-2) James A. Bernhard University of Puget Sound

On my honor, as an Aggie, I have neither given nor received unauthorized aid on this academic work

Simply Typed Lambda Calculus

Axiomatic Semantics. Operational semantics. Good for. Not good for automatic reasoning about programs

Algebra Year 9. Language

Where linguistic meaning meets non-linguistic cognition

Lab 2: Static Response, Cantilevered Beam

Automata-Theoretic Model Checking of Reactive Systems

Midterm sample questions

Python. chrysn

Universal Turing Machine. Lecture 20

Limitations of OCAML records

CSC236 Week 10. Larry Zhang

Example: Fib(N) = Fib(N-1) + Fib(N-2), Fib(1) = 0, Fib(2) = 1

Transcription:

(with contributions from R. Holte) School of Electrical Engineering and Computer Science University of Ottawa Version of January 9, 2019 Please don t print these lecture notes unless you really need to!

Great coders are today s rock stars Will.I.Am Watch the video at code.org!

Review Objectives: 1. Discussing concepts related to data types 2. Understanding the implications of the differences between primitive and reference types 3. Reviewing call-by-value 4. Understanding the concept of scope Lectures: Pages 597 631 of E. Koffman and P. Wolfgang.

Plan 1. What are variables and data types 2. Primitive vs reference 3. (primitive vs reference) 4. Auto-boxing/auto-unboxing; 5. Passing parameters 6. 7. Memory management

Variables What is a variable? A variable is a place in memory, to hold a value, which we refer to with help of a label 0,000,000,000 0,000,123,455 (i) 0,000,123,456 0,000,123,457 33 4,294,967,296 byte i = 3 3 ;

Variables I will be using Greek letters to designate memory locations (addresses) since in Java we don t know the location of objects and should not care! (i) α 1 α α +1 33 byte i = 3 3 ;

What are data types for? Yes, it tells the compiler how much memory to allocate: double f o r m u l a ; // 8 b y t e s char c ; // 2 b y t e s But it also? It gives information about the meaning (semantic) of the data: which operations are allowed, which data are compatible. Hence the following statement, c = f l a g f o r m u l a ; will produce an error at compile time; data types are therefore also useful to help detect errors in programs early on.

Primitive types Type Size Maximum Examples boolean 1 true,false char 16 \uffff a, A, 1, * byte 8 127-128, -1, 0, 1, 127 short 16 32767-128, -1, 0, 1, 127 int 32 2147483647-128, -1, 0, 1, 127 long 64 9223372036854775807-128L, 0L, 127L float 32 3.4028235E38-1.0f, 0.0f, 1.0f double 64 1.7976931348623157E308-1.0, 0.0, 1.0

(contd) To be more precise, there are concrete data types and abstract data types Concrete data types specify both, the allowed operations and the representation of the data Abstract Data Types (ADTs) specify only the allowed operations

Type declaration type identifier int age ; One must declare the type of each variable and parameter, as well as that of the returned value.

Compile-time error: cannot find symbol p u b l i c c l a s s Test { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { age = 2 1 ; In the above example, the variable age has not been declared. Test.java:3: error: cannot find symbol age = 21; ^ symbol: variable age location: class Test 1 error

Solution One must declare the type of the variable, here int (line 3), before using the variable (line 4). 1 p u b l i c c l a s s Test { 2 p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { 3 i n t age ; 4 age = 2 1 ; 5 6

Type declaration: methods type type type public int sum( int a, int b ) { return a+b ; One must declare the type of each parameter, as well as that of the returned value.

Compile-time error: returned value and parameters p u b l i c c l a s s Test { p u b l i c sum ( a, b ) { r e t u r n a+b ; Test.java:2: error: invalid method declaration; return type required public sum(a, b) { ^ Test.java:2: error: <identifier> expected public sum(a, b) { ^ Test.java:2: error: <identifier> expected public sum(a, b) { ^ 3 errors

Type of the returned value: void Some methods do not return a result, this is the case for the method swap below, the type must then be void (returns nothing). p u b l i c s t a t i c void swap ( i n t [ ] xs ) { i n t tmp ; tmp = xs [ 0 ] ; xs [ 0 ] = xs [ 1 ] ; xs [ 1 ] = tmp ;

Data Types in Java In Java, we have primitive and reference data types: Primitive are: numbers, characters (but not Strings) and booleans the value is stored at the memory location designated by the label of the variable References: Predefined: Arrays Strings User defined, reference to an instance of a class; The value of a reference variable is a memory location, which points/references to the location of an object; it is a pointer, a link, it s a reference The declaration of a reference variable does not create an object, does not allocate space for an object, it only allocates memory to store the address of an object

Primitive vs reference and the TC-1101 i n t pos ; pos = 5 ; i n t [ ] xs ; xs = new i n t [ ] {1, 2, 3 ;

Memory Microprocessor 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 91 00 08 10 39 00 09 64 5 00 12 90 1 2 3 91 27 12 MAR MDR R/W Control OpCode OpAddr A H Z N PC ALU 9999 The variable pos is of type int, a primitive type, if pos designates the memory location 00 08, then value 5 is stored at the address 00 08.

Memory Microprocessor 0000 91 0001 00 0002 08 0003 10 0004 39 0005 00 0006 09 0007 64 0008 5 0009 00 0010 12 0011 90 0012 1 0013 2 0014 3 0015 91 0016 27 0017 12 MAR MDR R/W Control OpCode OpAddr A H Z N PC ALU 9999 The variable xs is of type reference to an array of integers, if xs designates the memory location 00 09, and the content of memory locations 00 09 and 00 10 (addresses are large enough that two cells are needed!) is 00 12, then, the array designated by xs can be found at memory location 00 12.

(a) α null > i n t [ ] a ; a = new i n t [ 5 ] ; The declaration of a reference variable only allocates memory to hold a reference (sometimes called pointer or address), null is a special value (literal), which does not reference an object

(a) α null i n t [ ] a ; > a = new i n t [ 5 ] ; (instance) β 0 0 0 0 0 The creation of a new instance, new int[ 5 ], allocates memory to hold 5 integer values (and the housekeeping information). Each cell of the array is initialized with the default int value, which is 0.

(a) α β i n t [ ] a ; > a = new i n t [ 5 ] ; (instance) β 0 0 0 0 0 Finally, the reference of the newly created object is assigned to the location designed by the label a.

Memory diagram Because we don t know (and shouldn t care) about the actual memory layout, we often use memory diagrams such as the following, (a) α β a (a) (instance) α β β 0 0 0 (instance) β 0 0 0 0 0 0 0 0 0 0 0 0

Memory diagram In a memory diagram, I want to see: a box for every reference variable with an arrow pointing a the designated object a box for every primitive variable with the value inside the box a box for every object a i n t [ ] a ; a = new i n t [ 5 ] ; 0 0 0 0 0

Memory diagram Given the following class declaration: p u b l i c c l a s s Constant { p r i v a t e f i n a l S t r i n g name ; p r i v a t e f i n a l double v a l u e ; p u b l i c Constant ( S t r i n g name, double v a l u e ) { t h i s. name = name ; t h i s. v a l u e = v a l u e ; Draw the memory diagram for the following statments: Constant c ; c = new Constant ( g o l d e n r a t i o, 1.61803399 ) ;

Memory diagram c value name 1.6180339887 a reference variable of type Constant "golden ratio" an instance of the class Constant an instance of the class String

Memory diagram c value name 1.6180339887 a reference variable of type Constant "golden ratio" an instance of the class Constant an instance of the class String

Remember Variables have types Objects have classes

Class Integer In the following examples, we ll be using our own class Integer: c l a s s I n t e g e r { i n t v a l u e ; Usage: I n t e g e r a ; a = new I n t e g e r ( ) ; a. v a l u e = 3 3 ; a. v a l u e ++; System. out. p r i n t l n ( a. v a l u e = + a. v a l u e ) ; We use the dot notation to access the value of an instance variable. Java has a pre-defined class named Integer. It is called a wrapper class; it wraps an int value into an object.

Class Integer Adding a constructor c l a s s I n t e g e r { i n t v a l u e ; I n t e g e r ( i n t v ) { v a l u e = v ; Usage: I n t e g e r a ; a = new I n t e g e r ( 33 ) ;

Primitive vs reference variables i 33 i null alias null i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; At compile time the necessary memory to hold the reference is allocated

Primitive vs reference variables i 33 i null alias null α value 33 i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; Creating an object (new Integer( 33 ))

Primitive vs reference variables i 33 i α alias null α value 33 i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; Assigning the reference of that object to the reference variable i

Primitive vs reference variables i 33 i α alias α α value 33 i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; Copying the value of the reference variable i into alias

Primitive vs reference variables i 33 i alias value 33 i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; i and alias are both designating the same object!

Primitive vs reference variables i alias i 33 value 33 i n t i = 3 3 ; I n t e g e r i, a l i a s ; i = new I n t e g e r ( 33 ) ; a l i a s = i ; Using the memory diagram representation

Wrappers For every primitive type there is an associated wrapper class For instance, Integer is the wrapper class for the primitive type int A wrapper stores a value of a primitive type inside an object This will be paramount for stacks, queues, lists and trees Besides holding a value, the wrapper classes possess several class methods, mainly to convert values from/to other types, e.g. Integer.parseInt( 33 )

Quiz This is valid Java statement, true or false? I n t e g e r i = 1 ; If this is a valid statement, what are the implications? Okay, 1 is a value of a primitive type, int, but i is a reference variable, of type Integer In Java 1.4 or older, this would cause a compile-time error! However, in Java 5, 6 or 7, this is a valid statement! Why?

Auto-boxing This is because Java 5, 6 and 7 automagically transform the following statement I n t e g e r i = 1 ; into I n t e g e r i = new I n t e g e r ( 1 ) ; This is called auto-boxing.

Auto-unboxing Similarly, the statement i = i + 5 I n t e g e r i = 1 ; i = i + 5 ; is transformed into i = new I n t e g e r ( i. i n t V a l u e ( ) + 5 ) ; where the value of the wrapper object designated by i is extracted, unboxed, with the method call, i.intvalue().

Boxing/unboxing Primitive byte short int long float double bool char Reference Byte Short Integer Long Float Double Boolean Character All 8 primitive types have a corresponding wrapper class. The automatic conversion from primitive to reference type is called boxing, and the conversion from reference to primitive type is called unboxing.

Does it matter? l o n g s1 = ( l o n g ) 0 ; f o r ( j =0; j <10000000; j++ ) { s1 = s1 + ( l o n g ) 1 ; Long s2 = ( l o n g ) 0 ; f o r ( j =0; j <10000000; j++ ) { s2 = s2 + ( l o n g ) 1 ; 49 milliseconds 340 milliseconds Why? On the right side, s2 is declared as a Long, hence, the line, s2 = s2 + ( long ) 1 ; is rewritten as, s2 = new Long ( s2. l o n g V a l u e ( ) + ( long ) 1 ) ;

Programming tip: benchmarking your code long s t a r t, stop, e l a p s e d ; s t a r t = System. c u r r e n t T i m e M i l l i s ( ) ; // s t a r t the c l o c k f o r ( j =0; j <10000000; j++ ) { s2 += ( long ) 1 ; // s t a n d s f o r s2 = s2 + ( l o n g ) 1 s t o p = System. c u r r e n t T i m e M i l l i s ( ) ; // s t o p the c l o c k e l a p s e d = s t o p s t a r t ; where System.currentTimeMillis() returns the number of milliseconds elapsed since midnight, January 1, 1970 UTC (Coordinated Universal Time). System.nanoTime() also exists.

Billion-dollar mistake (Null reference) I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years. Tony Hoare

primitive data types Variables of primitive data types can be compared directly i n t a = 5 ; i n t b = 1 0 ; i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; What will be printed out on the output? Prints a < b

a α 5 i n t a = 5 ; i n t b = 1 0 ; b β 10 i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ;

: primitive and reference types What will happen and why? i n t a = 5 ; I n t e g e r b = new I n t e g e r ( 5 ) ; i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; References.java:7: operator < cannot be applied to int,java.lang.integer if (a < b) ^ References.java:9: operator == cannot be applied to int,java.lang.integer else if (a == b) ^ 2 errors

a α 5 i n t a = 5 ; I n t e g e r b = new I n t e g e r ( 5 ) ; b β γ γ i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; value 5 References.java:7: operator < cannot be applied to int,java.lang.integer if (a < b) ^ References.java:9: operator == cannot be applied to int,java.lang.integer else if (a == b) ^ 2 errors

i n t a = 5 ; I n t e g e r b = new I n t e g e r ( 5 ) ; i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; a b value 5 5 References.java:7: operator < cannot be applied to int,java.lang.integer if (a < b) ^ References.java:9: operator == cannot be applied to int,java.lang.integer else if (a == b) ^ 2 errors

a 5 i n t a = 5 ; I n t e g e r b = new I n t e g e r ( 5 ) ; b i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; value 5 References.java:7: operator < cannot be applied to int,java.lang.integer if (a < b) ^ References.java:9: operator == cannot be applied to int,java.lang.integer else if (a == b) ^ 2 errors

and reference types What will be the result? MyInteger a = new MyInteger ( 5 ) ; MyInteger b = new MyInteger ( 10 ) ; i f ( a < b ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not e q u a l b ) ; Less.java:14: operator < cannot be applied to MyInteger,MyInteger if ( a < b ) { ^ 1 error

Remarks These error messsages are produced by pre-1.5 Java compilers Starting with Java 1.5, autoboxing masks the problem In order to get same behaviour with the two environments, let s use our wrapper, MyInteger

Class MyInteger c l a s s MyInteger { i n t v a l u e ; MyInteger ( i n t v ) { v a l u e = v ;

a 5 i n t a = 5 ; MyInteger b = new MyInteger ( 5 ) ; b i f ( a < b ) { System. out. p r i n t l n ( a < b ) ; e l s e i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a > b ) ; value 5 Fix this!

Solution i n t a = 5 ; MyInteger b = new MyInteger ( 5 ) ; i f ( a < b. v a l u e ) { System. out. p r i n t l n ( a i s l e s s than b ) ; e l s e i f ( a == b. v a l u e ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a i s g r e a t e r than b ) ; Prints a equals b.

and reference types What will happen and why? MyInteger a = new MyInteger ( 5 ) ; MyInteger b = new MyInteger ( 5 ) ; i f ( a == b ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not e q u a l b ) ; The result is a does not equal b.

a b MyInteger a = new MyInteger ( 5 ) ; MyInteger b = new MyInteger ( 5 ) ; i f ( a == b ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not e q u a l s b ) ; value value 5 5 The result is a does not equal b.

a b MyInteger a = new MyInteger ( 5 ) ; MyInteger b = new MyInteger ( 5 ) ; i f ( a == b ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not e q u a l s b ) ; value value 5 5 The result is a does not equal b.

Solution MyInteger a = new MyInteger ( 5 ) ; MyInteger b = new MyInteger ( 5 ) ; i f ( a. e q u a l s ( b ) ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not b ) ; where equals could have been defined as an instance method: p u b l i c boolean e q u a l s ( MyInteger o t h e r ) { r e t u r n s t h i s. v a l u e == o t h e r. v a l u e ; Would print a equals b.

What will happen? MyInteger a = new MyInteger ( 5 ) ; MyInteger b = a ; i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a!= b ) ; Prints a == b, why? because a and b reference the same object (instance), in other words, the two memory locations are the same; we say that b is an alias for a.

and reference types What will happen? MyInteger a = new MyInteger ( 5 ) ; MyInteger b = a ; i f ( a. e q u a l s ( b ) ) { System. out. p r i n t l n ( a e q u a l s b ) ; e l s e { System. out. p r i n t l n ( a does not e q u a l b ) ; prints a equals b because the two values are equal.

a MyInteger a = new MyInteger ( 5 ) ; MyInteger b = a ; b i f ( a == b ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a!= b ) ; value 5

a MyInteger a = new MyInteger ( 5 ) ; MyInteger b = a ; b i f ( a. e q u a l s ( b ) ) { System. out. p r i n t l n ( a == b ) ; e l s e { System. out. p r i n t l n ( a!= b ) ; value 5

Remarks Two reference variables designate objects that are logically equivalent if these objects have the same content, use the method equals to test for content or logical equality In order to test if two reference variables designate the same object, use the comparison operators == and!= i f ( a. e q u a l s ( b ) ) {... vs i f ( a == b ) {... We will continue the discussion when learning about inheritance!

Exercises Experiment comparing these objects using equals and ==, you might be surprised by the results. S t r i n g a = new S t r i n g ( H e l l o ) ; S t r i n g b = new S t r i n g ( H e l l o ) ; i n t c [ ] = { 1, 2, 3 ; i n t d [ ] = { 1, 2, 3 ; S t r i n g e = H e l l o ; S t r i n g f = H e l l o ; S t r i n g g = f + ; In particular, try a == b and e == f.

Definitions Primitive data types Reference data types Definition: arity The arity of a method is simply the number of parameters; a method may have no parameter, one parameter or many. MyInteger ( ) { t h i s. v a l u e = 0 ; MyInteger ( i n t v ) { t h i s. v a l u e = v ; i n t sum ( i n t a, i n t b ) { r e t u r n a + b ;

Definitions Primitive data types Reference data types Definition: formal parameter A formal parameter is a variable which is part of the definition of the method; it can be seen as a local variable of the body of the method. i n t sum ( i n t a, i n t b ) { r e t u r n a + b ; a and b are formal parameters of sum.

Definitions Primitive data types Reference data types Definition: actual parameter An actual parameter is the variable which is used when the method is called to supply the value for the formal parameter. i n t sum ( i n t a, i n t b ) { r e t u r n a + b ;... i n t midterm, finalexam, t o t a l ; t o t a l = sum ( midterm, f i n a l E x a m ) ; midterm and finalexam are actual parameters of sum, when the method is called the value of the actual parameters is copied to the location of the formal parameters.

Definitions Primitive data types Reference data types Concept: call-by-value In Java, when a method is called, the values of the actual parameters are copied to the location of the formal parameters. When a method is called: the execution of the calling method is stopped an activation frame (activation block or record) is created (it contains the formal parameters as well as the local variables) the value of the actual parameters are copied to the location of the formal parameters the body of the method is executed a return value or (void) is saved (the activation frame is destroyed) the execution of the calling method restarts with the next instruction

Definitions Primitive data types Reference data types p u b l i c c l a s s Test { p u b l i c s t a t i c void i n c r e m e n t ( i n t a ) { a = a + 1 ; p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { i n t a = 5 ; System. out. p r i n t l n ( b e f o r e : + a ) ; i n c r e m e n t ( a ) ; System. out. p r i n t l n ( a f t e r : + a ) ; What will printed? b e f o r e : 5 a f t e r : 5

Definitions Primitive data types Reference data types p u b l i c s t a t i c v o i d i n c r e m e n t ( i n t a ) { a = a + 1 ; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { > i n t a = 5 ; i n c r e m e n t ( a ) ; args a 5 activation frame for main Each method call has its own activation frame, which holds the parameters and local variables (here, args and a)

Definitions Primitive data types Reference data types p u b l i c s t a t i c v o i d i n c r e m e n t ( i n t a ) { a = a + 1 ; a p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t a = 5 ; > i n c r e m e n t ( a ) ; args a 5 activation frame for increment activation frame for main When increment is called a new activation frame is created

Definitions Primitive data types Reference data types p u b l i c s t a t i c v o i d i n c r e m e n t ( i n t a ) { a = a + 1 ; a 5 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t a = 5 ; > i n c r e m e n t ( a ) ; args a 5 activation frame for increment activation frame for main The value of the actual parameter is copied to the location of the formal parameter

Definitions Primitive data types Reference data types p u b l i c s t a t i c v o i d i n c r e m e n t ( i n t a ) { > a = a + 1 ; a 6 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t a = 5 ; i n c r e m e n t ( a ) ; args a 5 activation frame for increment activation frame for main The execution of a = a + 1 changes the content of the formal parameter a, which is a distinct memory location the local variable a of the main method

Definitions Primitive data types Reference data types p u b l i c s t a t i c v o i d i n c r e m e n t ( i n t a ) { a = a + 1 ; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t a = 5 ; i n c r e m e n t ( a ) ; args > a 5 activation frame for main Control returns to the main method, the activation frame for increment is destroyed

Definitions Primitive data types Reference data types References and method calls c l a s s M yinteger { i n t v a l u e ; MyInteger ( i n t v ) { v a l u e = v ; c l a s s Test { public s t a t i c void increment ( MyInteger a ) { a. v a l u e ++; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MyInteger a = new MyInteger ( 5 ) ; System. out. p r i n t l n ( b e f o r e : + a. v a l u e ) ; i n c r e m e n t ( a ) ; System. out. p r i n t l n ( a f t e r : + a. v a l u e ) ; What will be printed out?

Definitions Primitive data types Reference data types s t a t i c v o i d i n c r e m e n t ( M yinteger a ) { a. v a l u e ++; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { > MyInteger a = new M y Integer ( 5 ) ; i n c r e m e n t ( a ) ; args a value 5 The local variable a of the main method is a reference to an instance of the class MyInteger

Definitions Primitive data types Reference data types s t a t i c v o i d i n c r e m e n t ( M yinteger a ) { a. v a l u e ++; a p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MyInteger a = new M y Integer ( 5 ) ; > i n c r e m e n t ( a ) ; args a value 5 Calling increment, creating a new activation frame

Definitions Primitive data types Reference data types s t a t i c v o i d i n c r e m e n t ( M yinteger a ) { a. v a l u e ++; a p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MyInteger a = new M y Integer ( 5 ) ; > i n c r e m e n t ( a ) ; args a value 5 Copying the value of the actual parameter into the formal parameter of increment

Definitions Primitive data types Reference data types s t a t i c v o i d i n c r e m e n t ( M yinteger a ) { > a. v a l u e ++; a p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MyInteger a = new M y Integer ( 5 ) ; args i n c r e m e n t ( a ) ; a value 6 Executing a.value++

Definitions Primitive data types Reference data types s t a t i c v o i d i n c r e m e n t ( M yinteger a ) { a. v a l u e ++; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { MyInteger a = new M y Integer ( 5 ) ; i n c r e m e n t ( a ) ; args > a value 6 Returning the control to the main method

Definitions Examples Definition: scope The scope of a declaration is the region of the program within which the entity declared by the declaration can be referred to using a simple name The Java Language Specification, Third Edition, Addison Wesley, p. 117.

Definitions Examples Definition: scope of a local variable in Java The scope of a local variable declaration in a block is the rest of the block in which the declaration appears, starting with its own initializer and including any further declarators to the right in the local variable declaration statement The Java Language Specification, Third Edition, Addison Wesley, p. 118. A.K.A. static or lexical scope

Definitions Examples Definition: scope of a parameter Java The scope of a parameter of a method or constructor is the entire body of the method or constructor The Java Language Specification, Third Edition, Addison Wesley, p. 118. A.K.A. static or lexical scope

Definitions Examples p u b l i c c l a s s Test { p u b l i c s t a t i c void d i s p l a y ( ) { System. out. p r i n t l n ( a = + a ) ; p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { i n t a ; a = 9 ; // v a l i d a c c e s s, w i t h i n the same b l o c k i f ( a < 10) { a = a + 1 ; // a n o t h e r v a l i d a c c e s s d i s p l a y ( ) ; Is this a valid program?

Definitions Examples p u b l i c c l a s s Test { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { System. out. p r i n t l n ( sum ) ; f o r ( i n t i =1; i <10; i++ ) { System. out. p r i n t l n ( i ) ; i n t sum = 0 ; f o r ( i n t i =1; i <10; i++ ) { sum += i ; Is this a valid program?

Definitions Examples p u b l i c c l a s s Test { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { f o r ( i n t i =1; i <10; i++ ) { System. out. p r i n t l n ( i ) ; i n t sum = 0 ; f o r ( i n t i =1; i <10; i++ ) { sum += i ; Is this a valid program?

Definitions Examples Memory management What happens to objects when they are not referenced? Here what happens to the object that contains the value 99? MyInteger a = new MyInteger ( 7 ) ; MyInteger b = new MyInteger ( 99 ) ; b = a ; The JVM recuperates the memory space This process is called garbage collection Not all programming languages manage memory automatically Java is not immune to memory leaks as will see in a few weeks...

Definitions Examples Summary Strong typing help detecting certain kinds of errors early always compare the value of the expressions When comparing references we check that two references designate the same object or not The method equals should be used to compare the content of the objects In Java, call-by-value is the mechanism that is used for method calls The scope of variable and parameter names is static in Java

Definitions Examples Next lecture Introduction to object-oriented programming Role of abstractions Activities of software development UML Unified Modeling Language Example: Counter

Definitions Examples References I E. B. Koffman and Wolfgang P. A. T. Data Structures: Abstraction and Design Using Java. John Wiley & Sons, 2e edition, 2010. P. Sestoft. Java Precisely. The MIT Press, second edition edition, August 2005. James Gosling, Bill Joy, Guy Steele, and Gilad Bracha. Java Language Specification. Addison Wesley, 3rd edition, 2005.

Definitions Examples Please don t print these lecture notes unless you really need to!