References (Section 5.2)
Hsuan-Tien Lin
Deptartment of CSIE, NTU
OOP Class, March 15-16, 2010
Fun Time (1)
What happens in memory?
1 i n t i ;
2 s h o r t j ;
3 double k ;
4 char c = ’ a ’ ;
5 i = 3 ; j = 2 ;
6 k = i ∗ j ;
Life Cycle of a Primitive Variable (C/Java)
declared and created
1 i n t c oun t ;
used and modified
1 co unt += 1 ;
destroyed
–automatically (when out of scope)
Fun Time (2)
What happens in memory?
1 S t r i n g s = " l a l a l a " ;
2 S t r i n g t = " abc " ;
3 S t r i n g a = s + t ;
Fun Time (3)
What happens in memory?
1 Record r 1 ; / / r 1 . name , r 1 . sc or e
2 Record r 2 ;
3 r 1 = new Record ( ) ;
4 r 2 = r 1 ; / / how many r e c o r d s are t h e r e ?
5 r 1 . name = " HTLin " ;
6 r 2 . sc or e = 9 8 ;
Fun Time (4)
What happens in memory?
1 c l a s s Person { S t r i n g name ; Person spouse ; }
2
3 Person George ;
4 Person Marry ;
5 George = new Person ( ) ;
6 George . name = " George " ;
7 Marry = new Person ( ) ;
8 Marry . name = " Marry " ;
9 Mary . spouse = George ;
10 George . spouse = Marry ;
Fun Time (5)
What happens in memory?
1 c l a s s Person { S t r i n g name ; Person spouse ; }
2
3 Person George ;
4 George = new Person ( ) ;
5 George . name = " George " ;
6 George . spouse = new Person ( ) ;
7 George . spouse . name = " Marry " ;
8 George . spouse = new Person ( ) ;
9 George . spouse . name = " L i s a " ;
Life Cycle of an Object Instance (Java)
reference declared
1 Record r ;
instance created
1 r = new Record ( ) ;
used and modified
1 System . o u t . p r i n t l n ( r . name ) ;
destroyed
–automatically (when out of use)
Reference: Key Point
a instance occupies a space in the memory;
老太太住在屏東一個房子裡面
reference (a.k.a. safe pointer): the “address” to the instance;
用"海角七號"就可以找到老太太
class-type variable: holds the reference;
一個"信封",上面寫著海角七號
any operation on the instance goes thru the reference;
要請老太太"回憶"時,拿個信封上寫"海角七 號",接著寫"回憶",阿Ja就會使命必達了
老人 信封= new 老人(老太太的身家資料);
信封.回憶();
null Revisited (1/2)
1 c l a s s Record {
2 S t r i n g name ;
3 S t r i n g ID ;
4 i n t sc or e ;
5 }
6
7 p u b l i c c l a s s RecordDemo {
8 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
9 Record r 1 = new Record ( ) ;
10 System . o u t . p r i n t l n ( r 1 . sc or e ) ;
11 System . o u t . p r i n t l n ( r 1 . name ) ;
12 }
13 }
null: Java’s reserved word of saying “no reference”
default initial value for extended types (if initialized automatically)
0, NULL, anything equivalent to integer 0: C’s way of saying “no
reference”
null Revisited (2/2)
1 c l a s s Record {
2 S t r i n g name ;
3 S t r i n g ID ;
4 i n t sc or e ;
5 }
6
7 p u b l i c c l a s s RecordDemo {
8 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
9 Record r 1 = n u l l;
10 System . o u t . p r i n t l n ( r 1 . sc or e ) ;
11 System . o u t . p r i n t l n ( r 1 . name ) ;
12 }
13 }
null pointer exception (run time error): accessing the component
of “no reference”
null Revisited: Key Point
null: Java’s special way of saying “no reference”
Reference Equal (1/2)
1 c l a s s Record {
2 S t r i n g name ;
3 i n t sc or e ;
4 }
5
6 p u b l i c c l a s s RecordDemo {
7 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
8 Record r1 , r 2 ;
9 r 1 = new Record ( ) ; r 2 = new Record ( ) ;
10 r 1 . name = " HTLin " ; r 1 . s co re = 9 5 ;
11 r 2 . name = " HTLin " ; r 2 . s co re = 9 5 ;
12 System . o u t . p r i n t l n ( r 1 == r 2 ) ;
13 r 2 = r 1 ;
14 System . o u t . p r i n t l n ( r 1 == r 2 ) ;
15 }
16 }
reference equal: comparison by “reference value”
Reference Equal (2/2)
1 c l a s s Record {
2 S t r i n g name ;
3 i n t sc or e ;
4 }
5
6 p u b l i c c l a s s RecordDemo {
7 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
8 Record r1 , r 2 ;
9 r 1 = n u l l; r 2 = new Record ( ) ;
10 System . o u t . p r i n t l n ( r 1 == r 2 ) ;
11 r 2 = r 1 ;
12 System . o u t . p r i n t l n ( r 1 == r 2 ) ;
13 }
14 }
null does not equal non-null ... o_O
null equals null ... O_o
Reference Equal: Key Point
==: reference equal rather than content equal for ex-
tended types
String Equal (1/1)
1 p u b l i c c l a s s StringDemo {
2 s t a t i c S t r i n g s1 ;
3 s t a t i c S t r i n g s2 ;
4 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
5 s1 = " HTLin " ;
6 s2 = " HTLin " ;
7 System . o u t . p r i n t l n ( s1 == s2 ) ;
8 s1 = s1 + " l a l a l a " ;
9 s2 = s2 + " l a l a l a " ;
10 System . o u t . p r i n t l n ( s1 == s2 ) ;
11 System . o u t . p r i n t l n ( s1 . e q u a l s ( s2 ) ) ;
12 }
13 }
first true: compiler allocates one constant string only second false: two different string references
third true: an action (method) for content comparison
String Equal: Key Point
String ==: still reference equal, use .equals if want
content equal
Reference Argument/Parameter (1/3)
1 c l a s s Tool {
2 b o o l t r i c k y ( S t r i n g s1 , S t r i n g s2 ) {
3 s2 = s2 + " " ;
4 r e t u r n ( s1 == s2 ) ;
5 }
6 }
7 p u b l i c c l a s s Demo{
8 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
9 Tool t = new Tool ( ) ;
10 S t r i n g sa = " HTLin " ;
11 S t r i n g sb = sa ;
12 System . o u t . p r i n t l n ( t . t r i c k y ( sa , sb ) ) ;
13 System . o u t . p r i n t l n ( sa == sb ) ;
14 System . o u t . p r i n t l n ( t . t r i c k y ( sa + " " , sb ) ) ;
15 }
16 }
reference parameter passing: again, value copying sa, sb copied to s1, s2
s2 (reference) changed, sb didn’t
Reference Argument/Parameter (2/3)
1 c l a s s m yI nt {i n t v a l ; m yI nt (i n t v ) { v a l = v ; } }
2 c l a s s Tool {
3 v o i d swap ( m yI nt f i r s t , m yI nt second ) {
4 i n t tmp = f i r s t . v a l ;
5 f i r s t . v a l = second . v a l ;
6 second . v a l = tmp ;
7 System . o u t . p r i n t l n ( f i r s t . v a l ) ;
8 System . o u t . p r i n t l n ( second . v a l ) ;
9 }
10 }
11 p u b l i c c l a s s Demo{
12 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
13 Tool t = new Tool ( ) ;
14 m yI nt i = new m yI nt ( 3 ) ;
15 m yI nt j = new m yI nt ( 5 ) ;
16 t . swap ( i , j ) ;
17 System . o u t . p r i n t l n ( i . v a l ) ;
18 System . o u t . p r i n t l n ( j . v a l ) ;
19 }
20 }
swapped as requested
Reference Argument/Parameter (3/3)
1 c l a s s m yI nt {i n t v a l ; m yI nt (i n t v ) { v a l = v ; } }
2 c l a s s Tool {
3 v o i d swap ( m yI nt f i r s t , m yI nt second ) {
4 m yI nt tmp = f i r s t ;
5 f i r s t = second ;
6 second = tmp ;
7 System . o u t . p r i n t l n ( f i r s t . v a l ) ;
8 System . o u t . p r i n t l n ( second . v a l ) ;
9 }
10 }
11 p u b l i c c l a s s Demo{
12 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] arg ) {
13 Tool t = new Tool ( ) ;
14 m yI nt i = new m yI nt ( 3 ) ;
15 m yI nt j = new m yI nt ( 5 ) ;
16 t . swap ( i , j ) ;
17 System . o u t . p r i n t l n ( i . v a l ) ;
18 System . o u t . p r i n t l n ( j . v a l ) ;
19 }
20 }
what happens?
Reference Argument/Parameter: Key Point
argument ⇒ parameter: by reference copying
same for return value
this (1/1)
1 c l a s s Record {
2 i n t sc or e ;
3 v o i d s e t _ t o (i n t s co re ) { t h i s. sc or e = sc or e ; }
4 v o i d a d j u s t _ s c o r e { t h i s. s e t _ t o ( sc or e +10) ; }
5 }