Chapter 7—Objects and Memory

Slides:



Advertisements
Similar presentations
Names and Bindings.
Advertisements

Dynamic Allocation Eric Roberts CS 106B February 4, 2013.
The Assembly Language Level
CERTIFICATION OBJECTIVES Use Class Members Develop Wrapper Code & Autoboxing Code Determine the Effects of Passing Variables into Methods Recognize when.
Cmput Lecture 8 Department of Computing Science University of Alberta ©Duane Szafron 2000 Revised 1/26/00 The Java Memory Model.
10-Jun-15 Introduction to Primitives. 2 Overview Today we will discuss: The eight primitive types, especially int and double Declaring the types of variables.
Road Map Introduction to object oriented programming. Classes
Level ISA3: Information Representation
1 The first step in understanding pointers is visualizing what they represent at the machine level. In most modern computers, main memory is divided into.
2.1 2 Number Systems Foundations of Computer Science  Cengage Learning.
Real Numbers and the Decimal Number System
© Janice Regan, CMPT 128, Jan CMPT 128: Introduction to Computing Science for Engineering Students Integer Data representation Addition and Multiplication.
Introduction to Java Appendix A. Appendix A: Introduction to Java2 Chapter Objectives To understand the essentials of object-oriented programming in Java.
© 2006 Pearson Addison-Wesley. All rights reserved Reference Types A variable of reference type refers to (is bound to) an object Data of reference.
Memory and C++ Eric Roberts CS 106B February 1, 2013.
Chapter 6—Objects and Classes The Art and Science of An Introduction to Computer Science ERIC S. ROBERTS Java Objects and Classes C H A P T E R 6 To beautify.
Chapter 7 Objects and Memory. Structure of memory The fundamental unit of memory is called a bit, either 0 or 1. In most modern architectures, the smallest.
Chapter 7—Objects and Memory The Art and Science of An Introduction to Computer Science ERIC S. ROBERTS Java Objects and Memory C H A P T E R 7 Yea, from.
1 CSCE3193: Programming Paradigms Nilanjan Banerjee Programming Paradigms University of Arkansas Fayetteville, AR
IT-101 Section 001 Lecture #3 Introduction to Information Technology.
Chapter 7—Objects and Memory The Art and Science of An Introduction to Computer Science ERIC S. ROBERTS Java Objects and Memory C H A P T E R 7 Yea, from.
Chapter 7—Objects and Memory The Art and Science of An Introduction to Computer Science ERIC S. ROBERTS Java Objects and Memory C H A P T E R 7 Yea, from.
Slides prepared by Rose Williams, Binghamton University Chapter 5 Defining Classes II.
Comp 248 Introduction to Programming Chapter 4 & 5 Defining Classes Part C Dr. Aiman Hanna Department of Computer Science & Software Engineering Concordia.
These notes were originally developed for CpSc 210 (C version) by Dr. Mike Westall in the Department of Computer Science at Clemson.
Pointers: Basics. 2 What is a pointer? First of all, it is a variable, just like other variables you studied  So it has type, storage etc. Difference:
Copyright Curt Hill Variables What are they? Why do we need them?
Chapter 7 C supports two fundamentally different kinds of numeric types: (a) integer types - whole numbers (1) signed (2) unsigned (b) floating types –
Programming Fundamentals. Overview of Previous Lecture Phases of C++ Environment Program statement Vs Preprocessor directive Whitespaces Comments.
CMSC 202 Advanced Section Classes and Objects: Object Creation and Constructors.
Chapter 5 Defining Classes II Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
Characters and Strings
Data Representation Eric Roberts CS 106A February 10, 2016.
Lecture 3: More Java Basics Michael Hsu CSULA. Recall From Lecture Two  Write a basic program in Java  The process of writing, compiling, and running.
Five-Minute Review 1.What are local/instance/class variables? What about constants? 2.What is an array? 3.How do we locally declare an array of 5 integers?
© 2004 Pearson Addison-Wesley. All rights reserved August 27, 2007 Primitive Data Types ComS 207: Programming I (in Java) Iowa State University, FALL 2007.
Object Lifetime and Pointers
Five-Minute Review What are local/instance/class variables? What about constants? What is an array? How do we locally declare an array of 5 integers? How.
Week 2 - Wednesday CS 121.
Numbers Mar 27, 2013.
User-Written Functions
The Machine Model Memory
Java Primer 1: Types, Classes and Operators
Primitive Data Types August 28, 2006 ComS 207: Programming I (in Java)
Data Representation in Computer Systems
Variables and Primative Types
Please visit
Binary Representation
Objects and Memory Eric Roberts CS 106A February 5, 2010.
Variables ,Data Types and Constants
IDENTIFIERS CSC 111.
Chapter 3 Introduction to Classes, Objects Methods and Strings
Bases and Representations, Memory, Pointers, Arrays, For-Loops
Mechanics of Functions
INPUT & OUTPUT scanf & printf.
Chapter 7—Objects and Memory
Chapter 7—Objects and Memory
Chapter 3 DataStorage Foundations of Computer Science ã Cengage Learning.
Binary Representation
Overloading functions
Copyright © Cengage Learning. All rights reserved.
Introduction to Primitives
Object Oriented Programming in java
Introduction to Primitives
William Stallings Computer Organization and Architecture 10th Edition
Numbers 6-May-19.
Classes and Objects Object Creation
CHAPTER 69 NUMBER SYSTEMS AND CODES
CMSC 202 Constructors Version 9/10.
Five-Minute Review What are local/instance/class variables? What about constants? What is an array? How do we locally declare an array of 5 integers? How.
Presentation transcript:

Chapter 7—Objects and Memory The Art and Science of An Introduction to Computer Science ERIC S. ROBERTS Java C H A P T E R 7 Objects and Memory Yea, from the table of my memory I’ll wipe away all trivial fond records. —William Shakespeare, Hamlet, c. 1600  7.1 The structure of memory 7.2 The allocation of memory to variables 7.3 Primitive types vs. objects Chapter 7—Objects and Memory

The Structure of Memory The fundamental unit of memory inside a computer is called a bit, which is a contraction of the words binary digit. A bit can be in either of two states, usually denoted as 0 and 1. 1 The hardware structure of a computer combines individual bits into larger units. In most modern architectures, the smallest unit on which the hardware operates is a sequence of eight consecutive bits called a byte. The following diagram shows a byte containing a combination of 0s and 1s: Numbers are stored in still larger units that consist of multiple bytes. The unit that represents the most common integer size on a particular hardware is called a word. Because machines have different architectures, the number of bytes in a word may vary from machine to machine.

Binary Notation Bytes and words can be used to represent integers of different sizes by interpreting the bits as a number in binary notation. Binary notation is similar to decimal notation but uses a different base. Decimal numbers use 10 as their base, which means that each digit counts for ten times as much as the digit to its right. Binary notation uses base 2, which means that each position counts for twice as much, as follows: 1 0 x = 128 0 x = 64 1 x = 32 0 x = 16 1 x = 8 0 x = 1 And so on . . . The next digit gives the number of 4s. The next digit gives the number of 2s. The rightmost digit is the units place. 1 x = 2 0 x = 4 42

Numbers and Bases The calculation at the end of the preceding slide makes it clear that the binary representation 00101010 is equivalent to the number 42. When it is important to distinguish the base, the text uses a small subscript, like this: 001010102 = 4210 Although it is useful to be able to convert a number from one base to another, it is important to remember that the number remains the same. What changes is how you write it down. The number 42 is what you get if you count how many stars are in the pattern at the right. The number is the same whether you write it in English as forty-two, in decimal as 42, or in binary as 00101010. Numbers do not have bases; representations do.

Octal and Hexadecimal Notation Because binary notation tends to get rather long, computer scientists often prefer octal (base 8) or hexadecimal (base 16) notation instead. Octal notation uses eight digits: 0 to 7. Hexadecimal notation uses sixteen digits: 0 to 9, followed by the letters A through F to indicate the values 10 to 15. The following diagrams show how the number forty-two appears in both octal and hexadecimal notation: 2 x = 2 1 5 x 40 8 5 42 10 x 10 02 x 32 16 A octal hexadecimal The advantage of using either octal or hexadecimal notation is that doing so makes it easy to translate the number back to individual bits because you can convert each digit separately.

Exercises: Number Bases What is the decimal value for each of the following numbers? 100012 1778 AD16 1 x = 1 0 x 2 4 8 16 17 17 7 x = 7 1 56 8 127 1 x 64 127 173 13 x = 13 1 10 x 160 16 A D 173 As part of a code to identify the file type, every Java class file begins with the following sixteen bits: 1 How would you express that number in hexadecimal notation? 1 A F E CAFE16

Memory and Addresses Every byte inside the primary memory of a machine is identified by a numeric address. The addresses begin at 0 and extend up to the number of bytes in the machine, as shown in the diagram on the right. 0000 0004 0008 000C 0010 0014 0018 001C 0020 0024 0028 002C FFD0 FFD4 FFD8 FFDC FFE0 FFE4 FFE8 FFEC FFF0 FFF4 FFF8 FFFC 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B FFF4 FFF5 FFF6 FFF7 FFF8 FFF9 FFFA FFFB FFFC FFFD FFFE FFFF In these slides as well as in the diagrams in the text, memory addresses appear as four-digit hexadecimal numbers, which makes addresses easy to recognize. . . In Java, it is impossible to determine the address of an object. Memory addresses used in the examples are therefore chosen completely arbitrarily. Memory diagrams that show individual bytes are not as useful as those that are organized into words. The revised diagram on the right now includes four bytes in each of the memory cells, which means that the address numbers increase by four each time.

The Allocation of Memory to Variables When you declare a variable in a program, Java allocates space for that variable from one of several memory regions. One region of memory is reserved for variables that are never created or destroyed as the program runs, such as named constants and other class variables. This information is called static data. static data 0000 Whenever you create a new object, Java allocates space from a pool of memory called the heap. heap In classical architectures, the stack and heap grow toward each other to maximize the available space. stack FFFF Each time you call a method, Java allocates a new block of memory called a stack frame to hold its local variables. These stack frames come from a region of memory called the stack.

Heap-Stack Diagrams It is easier to understand how Java works if you have a good mental model of its use of memory. The text illustrates this model using heap-stack diagrams, which show the heap on the left and the stack on the right, separated by a dotted line. Whenever your program creates a new object, you need to add a block of memory to the heap side of the diagram. That block must be large enough to store the instance variables for the object, along with some extra space, called overhead, that is required for any object. Overhead space is indicated in heap-stack diagrams as a crosshatched box. Whenever your program calls a method, you need to create a new stack frame by adding a block of memory to the stack side. For method calls, you need to add enough space to store the local variables for the method, again with some overhead information that tracks what the program is doing. When a method returns, Java reclaims the memory in its frame.

Object References Internally, Java identifies an object by its address in memory. That address is called a reference. Rational r1 = new Rational(1, 2); heap 2 den 1 num 1008 1004 1000 it allocates heap space for the new Rational object. For this example, imagine that the object is created at address 1000. As an example, when Java evaluates the declaration stack 1000 r1 FFFC The local variable r1 is allocated in the current stack frame and is assigned the value 1000, which identifies the object. The next slide traces the execution of the TestRational program from Chapter 6 using heap-stack model.

A Complete Heap-Stack Trace TestRational 1/2 + 1/3 + 1/6 = 1 public void run() { Rational a = new Rational(1, 2); Rational b = new Rational(1, 3); Rational c = new Rational(1, 6); Rational sum = a.add(b).add(c); println(a + " + " + b + " + " + c + " = " + sum); } 1 den num 6 5 3 2 heap stack a b c sum FFFC FFF8 FFF4 FFF0 FFEC 1000 100C 1018 1030 1038 1034 102C 1028 1024 1020 101C 1014 1010 1008 1004 public void run() { Rational a = new Rational(1, 2); Rational b = new Rational(1, 3); Rational c = new Rational(1, 6); Rational sum = a.add(b).add(c); println(a + " + " + b + " + " + c + " = " + sum); } public Rational add(Rational r) { return new Rational( this.num * r.den + r.num * this.den , this.den * r.den ); } public Rational add(Rational r) { return new Rational( this.num * r.den + r.num * this.den , this.den * r.den ); } 36 5 1 3 1 2 6 36 heap stack TestRational 2 den 1 num All objects are created in the heap. 1008 1004 1000 1/2 + 1/3 + 1/6 = 1 3 den 1 num 1014 1010 100C This object is a temporary value used only during the calculation. 6 den 1 num 1020 101C 1018 1000 100C this r FFE8 FFE4 FFE0 This stack frame is created for the add method. 1018 100C 1000 1024 6 den 5 num 102C 1028 1024 a b c sum FFFC FFF8 FFF4 FFF0 FFEC This stack frame is created for the run method. 1030 1018 1 den num 1038 1034 1030 100C 1000 skip simulation

The Pointer Model The heap-stack diagram at the lower left shows the state of memory at the end of the run method from TestRational. The diagram at the lower right shows exactly the same state using arrows instead of numeric addresses. This style of diagram is said to use the pointer model. 1 den num 6 5 3 2 a b c sum heap stack heap stack 2 den 1 num 1008 1004 1000 3 den 1 num 1014 1010 100C 6 den 1 num 1020 101C 1018 6 den 5 num 102C 1028 1024 a b c sum FFFC FFF8 FFF4 FFF0 FFEC 1030 1018 1 den num 1038 1034 1030 100C 1000

Addresses vs. Pointers The two heap-stack diagram formats—the address model and the pointer model—describe exactly the same memory state. The models, however, emphasize different things: The address model makes it clear that references have numeric values. The pointer model emphasizes the relationship between the reference and the object and makes the diagram easier to follow. 1 den num 6 5 3 2 heap stack a b c sum FFFC FFF8 FFF4 FFF0 FFEC 1000 100C 1018 1030 1038 1034 102C 1028 1024 1020 101C 1014 1010 1008 1004 1 den num 6 5 3 2 a b c sum heap stack

Garbage Collection One fact that the pointer model makes clear in this diagram is that there are no longer any references to the Rational value 5/6. That value has now become garbage. From time to time, Java runs through the heap and reclaims any garbage. This process is called garbage collection. heap stack 2 den 1 num 3 den 1 num 6 den 1 num This object was used to hold a temporary result and is no longer accessible. 6 den 5 num sum c 1 den num b a

Exercise: Stack-Heap Diagrams Suppose that the classes Point and Line are defined as follows: public class Point { public Point(int x, int y) { cx = x; cy = y; } . . . other methods appear here . . . private int cx; private int cy; public class Line { public Line(Point p1, Point p2) { start = p1; finish = p2; } . . . other methods appear here . . . private Point start; private Point finish; Draw a heap-stack diagram showing the state of memory just before the following run method returns. public void run() { Point p1 = new Point(0, 0); Point p2 = new Point(200, 200); Line line = new Line(p1, p2); }

Solution: Stack-Heap Diagrams Address Model Pointer Model 100C finish 1000 start 200 cy cx heap stack p1 p2 line FFFC FFF8 FFF4 FFF0 1018 1020 101C 1014 1010 1008 1004 finish start 200 cy cx p1 p2 line heap stack

Primitive Types vs. Objects At first glance, Java’s rules for passing objects as arguments seem to differ from the rules Java uses with arguments that are primitive types. When you pass an argument of a primitive type to a method, Java copies the value of the argument into the parameter variable. As a result, changes to the parameter variable have no effect on the argument. When you pass an object as an argument, there seems to be some form of sharing going on. Although changing the parameter variable itself has no effect, any changes that you make to the instance variables inside an object—usually by calling setters—have a permanent effect on the object. Stack-heap diagrams make the reason for this seeming asymmetry clear. When you pass an object to a method, Java copies the reference but not the object itself.

Wrapper Classes The designers of Java chose to separate the primitive types from the standard class hierarchy mostly for efficiency. Primitive values take less space and allow Java to use more of the capabilities provided by the hardware. Even so, there are times in which the fact that primitive types are not objects gets in the way. There are many tools in the Java libraries—several of which you will encounter later in the book—that work only with objects. To get around this problem, Java includes a wrapper class to correspond to each of the primitive types: boolean Boolean byte Byte char Character double Double float Float int Integer long Long short Short

Using Wrapper Classes You can create an instance of a wrapper class by calling its constructor with the primitive value. For example, the line Integer five = new Integer(5); creates a new Integer object containing the value 5: heap stack 1000 5 1004 five 1000 FFFC To value stored in the variable five is a real object, and you can use it in any contexts that require objects. For each of the wrapper classes, Java defines a method to retrieve the primitive value, as illustrated below: int underlyingValue = five.intValue();

Boxing and Unboxing As of Java Standard Edition 5.0, Java automatically converts values back and forth between a primitive type and the corresponding wrapper class. For example, if you write Integer five = 5; Java will automatically call the Integer constructor. Similarly, if you then write int six = five + 1; Java will automatically call intValue before the addition. These operations are called boxing and unboxing. Although boxing and unboxing can be quite convenient, this feature can generate confusion and should be used with care.