20220723_第七小组_张红睿_Java帝国
Java帝国与C++帝国的一次会谈
概要:关于Java与C++的内存机制问题。
首先举一个例子:(关于“++”问题的一个例子)
Java代码:
public static void main(String[] args) {
int num = 50;
num = num++ * 2;
System.out.println("num: " + num);
}
相信了解Java的朋友们一定知道,代码运行结果为num: 100.
但是在C++中同样的代码的运行结果却是:
C++代码:
int main(){
int num = 50;
num = num++ * 2;
cout << "num:" << num << endl;
system("pause");
return 0;
}
所以,同样的代码为什么会出现两种结果呢?
首先肯定的是,后缀++运算符肯定是先用后加的原则,所以++是在乘2之后执行的。
这里可能会有人问Java代码中的++到底有没有执行,如果执行的话为什么结果是100而不是101?所以看下面的代码:
public static void main(String[] args) {
int num = 50;
int m = num++;
System.out.println("num: " + num);
}
下面是运行代码过程中的调试结果:这里使用Integer是方便看变量的地址。
代码运行到①处时,num的在栈中的地址为683,地址对应的值为50;
代码运行到②处时,num的地址变成了684,且对应值为51,而m对应的地址为值50的683, 即m的地址指向了之前num所在的地址。
这意味着在Java中改变引用对应的值时,并不像C++一样直接改变地址中的值,而是改变变量(对象)的引用,即改变对应的地址。
下面看C++的代码和运行结果:
可以看到在程序的运行过程中,变量num的地址并没有因为被赋值而改变,而是直接改变了变量地址对应的值。
这便是C++与Java在变量存储机制上的区别:
Java中改变变量的值是改变对应的引用(地址),而C++中是直接改变变量地址对应的值,而不改变地址。
再来看一开始的Java例子:
这也是为什么Java比较耗内存的原因。