An Important Difference Between Java and C/C++


Compare the following three programs which appear to show the transition from C to C++ to Java


	Tester1.c

#include < stdio.h>
struct intClass{
        int i;
         };   

int main(){
        struct intClass i1;
         i1.i=5;
         struct intClass j1;
	 j1 = i1;
         j1.i=7;
         printf("%i\n",i1.i);
         }

	Tester1.cpp

#include < stdio.h>
class intClass{
        public:
                 int i;
         };

int main(){
        intClass i1;
         i1.i=5;
         intClass j1;
	 j1 = i1;
         j1.i=7;
         printf("%i\n",i1.i);
         }



	Tester1.java

import java.io.*;
class intClass{
        public int i;
         }

class Tester1 {
  public static void main(String args[]){
         intClass i1 = new intClass();
         i1.i=5;
         intClass j1;
	 j1 = i1;
         j1.i=7;
         System.out.println(i1.i);
         }
   }

Here are the three runs and their outputs.


/siegel/home/public_html%a.out
5
/siegel/home/public_html%a.out
5
/siegel/home/public_html%java Tester1
7

The key to what is happening is in the treatment of the common line

j1=i1;

In C and C++, the semantics of "=" is copy content.

In Java the semantics is copy reference. Thus, in Java, both j1 and i1 point to the same storage after the "assignment" statement and, hence, a change in the content of the common storage is reflected in both references.

By the way, to make the situation slightly more complex, for primative data types, int etc. , "assignment" is copy content.

Finally, the Java statement

intClass j1;

does not even allocate storage for i. Much more on this point to follow.

Finally, in C and C++, pointers provide the same semantics, as the following example shows

test.c

#include <stdio.h>
void main(void){
struct Int{int i;};
struct Int *i1,*j1;
struct Int k;
k.i=5;
i1=&k;
j1=i1;
j1->i=7;
printf("%i\n",i1->i);
}

Output

/accounts/faculty/siegel/Cfiles% cc test.c
/accounts/faculty/siegel/Cfiles% a.out
7

Table of Contents