黑马程序员技术交流社区

标题: 由一道题的思考 [打印本页]

作者: 邓士林    时间: 2015-1-27 09:50
标题: 由一道题的思考
本帖最后由 邓士林 于 2015-1-27 09:55 编辑

最近论坛正能量看的有点多,给大家换换口味吧!发此贴的缘由,早上在水贴看到此贴http://bbs.itheima.com/thread-167593-1-1.html
题目问题就是:x=x++;结果是什么?求过程。
还有一个帖子:http://bbs.itheima.com/forum.php ... 2&page=1#pid1171468
帖子的问题是:
public class test {
        public static void main(String[] args) {
                int j = 0;
                for(int i = 0; i < 10; i++){
                        j = j++;
                }
                System.out.println("j = " + j);
        }
}
这两个问题都涉及到一个问题是i++的运算。但是深入一点就是java内存分配问题。
先介绍下java中的内存概况,java中的内存区域基本分为:
1、java虚拟机栈:俗称栈,用于存储放基本数据类型(int、short、boolean、byte、double、long、float、char)和对象引用,线程私有,就是一些局部变量存储在此处。
2、java本地方法栈:这是一类特殊的方法,有native关键字修饰,大家可以去看看java的关键字,会有这个。(一般大家没注意到吧!哈哈),由native修饰的方法时为了弥补java与底层的操作系统进行交互,一般方法实体由子类实现,父类只负责定义。
3、堆:java内存中最大的一块,用于存储对象的实例,GC管理主要就是这个内存。
4、方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等
5、程序计数器:作用就是标识每段代码。

,上面的代码运行结果是0,但是如果放在C语言编译环境下就是10;具体解释:
java的编译器在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。先将i的原始值存放在变量区,然后i++,此时栈中的i确实为1,执行赋值的时候,是把变量区中的值(原始值)赋值到栈中,所以又为0。
可以这样:
  1. <b>for (int k = 0; k < 10; k++)
  2.             {
  3.                 j = i++;
  4.                 i = j;
  5.             }</b>
复制代码

由于j一直是0,所以赋值到i时,i也一直为0;
具体的解释可以看我在这贴中的回答。http://bbs.itheima.com/forum.php ... p;page=1#pid1171468(建议我在这贴的回答加一个技术分(嘚瑟;P),我花了两个小时,很认真的回答。)
反思:
遇到问题的时候大家要多思考下,i++,我们都知道是先赋值,后自加,那么后自加的值存在哪了呢?这样的一个问题思考,就让我们去学习java的内存,然后由java的内容,又会涉及到java中的GC(垃圾回收),知识基本都是一环扣一环,所以多思考,知识的连贯性自然就有了。它们是一个连通的图,而不是一个独立的单元。


作者: yk942608890    时间: 2015-1-27 14:28
仔细的看了一遍,居然没有人回复。。。也是醉了
作者: 邓士林    时间: 2015-1-27 15:10
yk942608890 发表于 2015-1-27 14:28
仔细的看了一遍,居然没有人回复。。。也是醉了

呵呵,写的不好,大家看不上眼
作者: yk942608890    时间: 2015-1-27 17:51
邓士林 发表于 2015-1-27 15:10
呵呵,写的不好,大家看不上眼

可别谦虚,会发胖
作者: cly成子    时间: 2015-1-29 09:25
确实,总感觉分散的知识都能看懂,但是碰到复杂的问题,总是感觉串联不起来……
作者: 无力去闹    时间: 2015-1-29 18:23
给赞一个,LZ分析的不错 辛苦了
作者: 邓士林    时间: 2015-1-29 19:11
无力去闹 发表于 2015-1-29 18:23
给赞一个,LZ分析的不错 辛苦了

谢谢,共同学习
作者: syfsyf1993    时间: 2015-1-29 21:33
不知这问题难住了多少人!!!
作者: 邓士林    时间: 2015-1-30 08:40
syfsyf1993 发表于 2015-1-29 21:33
不知这问题难住了多少人!!!

呵呵,理解就好
作者: 邓士林    时间: 2015-2-1 22:31
cly成子 发表于 2015-1-29 09:25
确实,总感觉分散的知识都能看懂,但是碰到复杂的问题,总是感觉串联不起来…… ...

多多努力
作者: 邓士林    时间: 2015-2-3 08:45
syfsyf1993 发表于 2015-1-29 21:33
不知这问题难住了多少人!!!

呵呵,见的多自然就知道了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2