java求助,关于j=j++的疑惑
publicclassfortest{publicstaticvoidmain(String[]args){intj=0;for(inti=0;i<10;i++){j=j...
public class fortest {
public static void main(String[] args) {
int j=0;
for(int i=0;i<10;i++)
{
j=j;
j=j+1;
}
System.out.println(j);
}
}
运行结果是10,但是如果把循环体的里的代码换成j=j++,结果就是0,我的疑问是
j=j++为什么不等于j=j;j=j+1呢?等号优先级大于自增自减,复制后要自增,但是为什么没有改变? 展开
public static void main(String[] args) {
int j=0;
for(int i=0;i<10;i++)
{
j=j;
j=j+1;
}
System.out.println(j);
}
}
运行结果是10,但是如果把循环体的里的代码换成j=j++,结果就是0,我的疑问是
j=j++为什么不等于j=j;j=j+1呢?等号优先级大于自增自减,复制后要自增,但是为什么没有改变? 展开
7个回答
展开全部
csdn上的解释:首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。
展开全部
本质原因是因为c默认是按值传递,java是按引用传递。
j=j++
在java中分解一下就是
temp=j;
j=j+1;
j=temp;
j=j++
在java中分解一下就是
temp=j;
j=j+1;
j=temp;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是这样的,
j=j++,先进行的是j++,然后先把j原先的值(还是0)赋值给j,因为j++的意思就是 先用j的值,然后再进行加1。
你要是理解不了 可以试试j=++j,因为++j是先进行加1,再使用j的值
j=j++,先进行的是j++,然后先把j原先的值(还是0)赋值给j,因为j++的意思就是 先用j的值,然后再进行加1。
你要是理解不了 可以试试j=++j,因为++j是先进行加1,再使用j的值
更多追问追答
追问
嗯,这个基本知识我懂,我的问题你看下2楼
追答
你确定你得那个c些的代码返回值10吗
http://wenku.baidu.com/view/8b900009bb68a98271fefa75.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看到没人回答 告诉你我的理解 你看满意不 我也在自学 可以多联系交流
1,fr.close(); 不写一般也没事,但是为了不造成资源的浪费,都是要写的,打开了不用就要关。免得占用资源,影响程序
FileNotFoundException,顾名思义,当然是找不到指定文件的时候报错了。
IOException呢,就是输入输出流在程序执行期间被一些因素中断时久要报错了。
2,this关键字,this.就是对该对象自身调用其属性或方法。有时用来区别成员变量与形参同名的情况:classA{int i;...public void f(int i) {this.i = i;}},如果你用eclipse多了就会发现this经常用,this.的好处就是eclipse会自动生成该对象可调用的方法供你选择,繁多的方法名你就不用记~\(≥▽≤)/~啦啦啦,有个模糊印象就ok了。
你那个匿名类又没有setTitle()方法,加this调用肯定报错。
3,凡是AAA$BBB*.calss命名的都是内部类,BBB类的定义在AAA的类体中。你写的computer类 中肯定定义了这么些个内部类。
4,这个方法抛的IOException,你可以认为系统在以此文件所在位置构建抽象路径的时候出错了,至于什么错,就管了,也管不着,没必要那么较真。
1,fr.close(); 不写一般也没事,但是为了不造成资源的浪费,都是要写的,打开了不用就要关。免得占用资源,影响程序
FileNotFoundException,顾名思义,当然是找不到指定文件的时候报错了。
IOException呢,就是输入输出流在程序执行期间被一些因素中断时久要报错了。
2,this关键字,this.就是对该对象自身调用其属性或方法。有时用来区别成员变量与形参同名的情况:classA{int i;...public void f(int i) {this.i = i;}},如果你用eclipse多了就会发现this经常用,this.的好处就是eclipse会自动生成该对象可调用的方法供你选择,繁多的方法名你就不用记~\(≥▽≤)/~啦啦啦,有个模糊印象就ok了。
你那个匿名类又没有setTitle()方法,加this调用肯定报错。
3,凡是AAA$BBB*.calss命名的都是内部类,BBB类的定义在AAA的类体中。你写的computer类 中肯定定义了这么些个内部类。
4,这个方法抛的IOException,你可以认为系统在以此文件所在位置构建抽象路径的时候出错了,至于什么错,就管了,也管不着,没必要那么较真。
追问
百度知道的bug真多啊
参考资料: 百度一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
j=j++; 运算过程是
第一步:先算j=j计算结果是0;
第二步:算0++,所以结果还是0;
总而言之:j=j++;算的就是0++;所以结果还是0,没有给j赋上值
第一步:先算j=j计算结果是0;
第二步:算0++,所以结果还是0;
总而言之:j=j++;算的就是0++;所以结果还是0,没有给j赋上值
追问
.。。。你的第二步说的不对
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询