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比较耗内存的原因。

posted @ 2022-07-25 14:43  jzhr  阅读(29)  评论(0编辑  收藏  举报