2008-05-12

java解惑------增量操作

关键字: java 解惑 增量 for ++
    下面的程序对一个变量重复的进行增量操作,然后打印它的值,那么打印输出是什么?     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 ...
2008-05-06

java解惑--动物庄园

关键字: java 解惑 equals ==
 下面的java程序打印结果是什么? public class AnimalFarm{ public static void main(String[] args){ final String pig = "length: 10"; final String dog = "length: "+pig.length(); System.out.println("Animal are equal:" +pig == dog); } }     对这个程序进行表面分析后,可能会认 ...
2008-02-28

java解惑---最后的笑声

关键字: java 解惑 char string
下面的程序打印的内容?public class LastLaugh{ public static void main(String[] args){ System.out.println("H"+"a"); System.out.println('H'+'a'); } } 这个程序不会打印HaHa,它打印的是Ha169.对于第一个输出,调用打印的是Ha,它执行一个字符串连接,而对第二个调用,'H'和'a'是字符型字面常量,所以+操作符执行的是加法而不是字符串连接。 那么应该怎样将字符连接在一起?可以使 ...
2008-02-25

java解惑------八两

关键字: java 解惑 int 变量
问题:给出变量x和i的声明,是如下语句合法:x = x+i;但是这条语句不合法:x += i; 符合复制操作要求两个操作数都是原生类型的,例如int,或包装了原生类型,例如Integer,但有一个例外:如果在+=操作符左侧的操作数是String类型的,那么它允许右侧的操作数是任意类型,在这种情况下,该操作符执行的是字符串链接操作。简单复制操作符允许其左侧的是对象引用类型,这就更宽松了:可以使用他们来表示任何你想要的内容,只要表达式的右侧与左侧的变量是赋值兼容的。 可以利用这一差异来完成问题。要想用+=操作符来执行字符串链接操作,就必须左侧的变量声明是String类型。通过使 ...
2008-02-22

java解惑------半斤

关键字: java 解惑 int 变量
问题:给出一个对变量x和i的声明,使得下面这条语句合法:x += i;但是下面这条不合法:x = x + i; 许多人会认为第一个表达式只是第二个表达式的简写方式。这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作符,而第一个表达式使用的是复合赋值操作符。 换句话说,复合赋值操作符自动的将所执行的计算的结果转型为其左侧变量的类型。如果结果的类型于改变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。因此,我们有很好的理由解释为什么尝试着执行等价的简单赋值可能会产生 ...
2008-02-21

java解惑------多重转型(解惑)

关键字: java 解惑 多重转型 int char byte 解答
这个多重转型的的程序的行为紧密依赖于转型的符号扩展行为。java使用了基于2的补码的二进制运算,因此int类型的数值-1的所有32位都是置位的。从int到byte的转型是简明的,它执行了一个窄化原生类型转换,直接将除低8位之外的所有位全部砍掉。这样留下的是一个8位都是置位的byte,它仍旧表示-1。 从byte到char的转型则稍微麻烦一点,因为byte是有符号类型,而char是无符号类型。在将一个整数类型转换成另一个宽度更高的整数类型时候,通常是可以保持其数值的,但是却不可能从一个char表示一个负的byte数值。因此,我们认为从byte到char的转换不是一个拓宽原生类型转换,而 ...
2008-02-21

java解惑------多重转型(问题)

关键字: java 解惑 多重转型 问题 byte int char
转型用于将一个数值从一种类型转换到另一种类型,下面的示例程序输出的结果是什么呢?public class Multicast{ public static void main(String[] args){ System.out.println((int)(char)(byte) -1); } }这个程序从int数值-1开始,然后从int转型为byte,之后转型到char,最后转型到int。第一个转型将数值从32位窄化为8位,第二个转型将数值从8位拓宽为16位,最后一个转型又将数值从16位拓宽回到32位,这个数值最终回到可起点么?运行该程序,就会发现,它打印的是6 ...
2008-02-20

java解惑------长整除(解惑)

关键字: java 解惑 整除 int long
程序没有获得预期的输出,是因为常数MICROS_PER_DAY的计算确实溢出了。虽然计算的结果适合仿佛long中,并且其空间还有富余,但是这个结果并不适合放入int中。这个计算完全是以int运算来执行的,并且只有在运算完成之后,其结果猜被提升为long。而此时已经太迟:计算已经溢出,它返回的是一个小了200倍数的数值。从int提升为long是一种拓宽原生类转换,它保留了不正确的数值。这个值之后被MILLIS_PER_DAY整除,而MILLS_PER_DAY的计算结果是正确的,因为它适合int运算。于是整除结果为5. 那么为什么计算是以int来执行的呢?因为所有乘在一起的因子全是int ...
2008-02-20

java解惑------常整除(问题)

关键字: java 解惑 问题 整除
常整除的问题:程序是整除两个long型数值,被除数表示一天里的微秒数,而除数表示一天里的毫秒数 public class LongDivision{ public static void main(String[] args){ final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 ; System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY ); ...
2008-02-18

java解惑------找零时刻(分析)

关键字: java 解惑 找零 问题 double float int long
找零程序出错的原因在于,1.1这个数字不能被精确的表示为一个double,因此被表示为最接近它的double值。改程序从2中减去的就是这个值。遗憾的是,这个计算的结果并不是最接近0.9的double值。作为结果的double值的最短表示就是你看到的那个程序输出的可恶的数字。并不是所有的小数都可以用二进制浮点数精确表示。如果使用的是JDK5或者更新的版本,那么您可能会受其诱惑,通过使用printf工具设置输出精度的方法改正程序:System.out.pringln("%.2f%n"2.00-1.10");这条语句打印的结果正确,但并不表示它就是对底层问题的通用解决方 ...
2008-02-18

java解惑------找零时刻(问题)

关键字: java 解惑 找零 问题 double float int long
问题背景: Tom在一家汽车配件商店购买一个价值1.10美元的火花塞,但是他钱包中都是两美元一张的钞票。如果他用一张两美元的钞票来购买这个火花塞,那么应该找给他多少零钱? 解决上述问题的程序:  public class Change{ public static void main(String[] args){ System.out.println(2.00 - 1.10); } }它的结果是什么?不是期望的0.90,而是0.8999999999999999. 
java语言中所有的int数值,有一半是负数,而isOdd方法对所有的负奇数的判断都会失效。在任何负整数上调用该方法都会返回false,无论改整数是偶数还是奇数。这是java取余操作符的定义所产生的后果。该操作符被定义为对所有的int数值a和所有非零int数值b,都满足下面的恒等式:(a/b)*b +(a%b) ==a换句话说,如果用b整除,将商乘以b,然后加上余数,那么就得到了最初的值a,改恒等式具有正确的意义,但是当与java的截尾整数整除操作符相结合时,它就意味着:当取余操作返回一个非零结果时,它与左操作时具有相同的正负符号。isOdd方法以及它所基于的对术语“奇数&rdqu ...
2008-02-17

java解惑------奇数性(问题)

关键字: java 解惑 奇数
奇数性 下面方法的目的是确定其唯一的参数是否为奇数public static boolean isOdd(int i){ return i % 2 ==1; } 奇数可定义为被2整除余数为1的整数。表达式i%2计算的是i除以2时所产生的余数,看起来这个程序可行,看很可惜,它有四分之一的几率返回了错误的答案。
下面的类计算并缓存了一个总和,并且在另一个类中打印这个总和        class Cache{              static {                    initializeIfNecessar ...
liuwei1981
  • 浏览: 25089 次
  • 性别: Icon_minigender_1
  • 来自: 山西太原
  • 详细资料
搜索本博客
我的相册
49e43788-2a90-380d-8ea4-ccbcb1894ecf-thumb
55_140065_b47aa528cbaf0eb
共 16 张
存档
最新评论