易截截图软件、单文件、免安装、纯绿色、仅160KB

Java解惑2 25无情的增量操作

下面的程序对一个变量重复地进行增量操作,然后打印它的值。那么这个值是什么呢?
public class Increment {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
}
}
乍一看,这个程序可能会打印100。毕竟,它对j做了100次增量操作。可能会令你感到有些震惊,它打印的不是100而是0。所有的增量操作都无影无踪了,为什么?
就像本谜题的题目所暗示的,问题出在了执行增量操作的语句上:
j = j++;
大概该语句的作者是想让它执行对j的值加1的操作,也就是表达式j++所做的操作。遗憾的是,作者大咧咧地将这个表达式的值有赋回给了j。
当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfix increment operator)[JLS 15.14.2]:表达式j++的值等于j在执行增量操作之前的初始值。因此,前面提到的赋值语句首先保存j的值,然后将j设置为其值加1,最后将j复位到它的初始值。换句话说,这个赋值操作等价于下面的语句序列:
int tmp = j;
j = j + 1;
j = tmp?;
程序重复该过程100次,之后j的值还是等于它在循环开始之前的值,即0。
订正该程序非常简单,只需从循环中移除无关的赋值操作,只留下:
for (int i = 0; i < 100; i++)
j++;
经过这样的修改,程序就可以打印出我们所期望的100了。
这与谜题7中的教训相同:不要在单个的表达式中对相同的变量赋值超过一次。对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行为。


相关文档:

Java中内部类的调用

class EnclosingOne {
public class InsideOne {
}
}
public class B {

public static void main(String[] args) {
EnclosingOne eo = new EnclosingOne();
EnclosingOne.InsideOne ei = eo.new InsideOne();
}

} ......

LoadRunner开发JAVA Vuser


众所周知,Java语言是一门非常适合网络开发的语言,用 Java语言进行性能测试脚本开发将会大大提高测试开发效率。LoadRunner中提供了对Java虚拟用户的支持。Java虚拟用户依托于JDK,这大大扩充了LoadRunner的脚本开发功能。测试人员既可以用Java虚拟用户来测试基于Java的应用系统的性能,又可以使用Java语言的强大开发脚本 ......

Java的应用与Struts的初步了解

这部分的主要内容:
第一,Java Web应用基础复习
第二,MVC的设计模式
第三,Struts的设计模式
第一部分:Java Web的应用基础
Java Web的核心技术是JSP和Servlet技术。
图一,Java Web的应用的结构图
1,Servlet与JSP
Servlet组件是一个与协议无关的跨平台的服务器组件。Servlet的作用是读取客户发送的显示为数据、 ......

Java解惑2 20我的类是什么I

下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么我告诉你Me.class.getName()将返回Me类完整的名称,即“com.javapuzzlers.Me”。那么,这个程序会打印出什么呢?
package com.javapuzzlers;
public class Me {
public static void main(String[] args){
System.out.pr ......

Java解惑2 21我的类是什么II

下面的程序所要做的事情正是前一个谜题所做的事情,但是它没有假设斜杠符号就是分隔文件名组成部分的符号。相反,该程序使用的是java.io.File.separator,它被指定为一个公共的String域,包含了平台相关的文件名分隔符。那么,这个程序会打印出其正确的、平台相关的类文件名吗?
package com.javapuzzlers;
import java. ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号