漂泊的年华
北飘一族
posts - 5,comments - 0,trackbacks - 0
需要的请抓紧时间,服务器不稳定不能太长时间提供资源,如有需要请赶快.

资源下载地址:http://board.verycd.com/t389438.html
posted @ 2007-01-10 15:33 迪蓝 阅读(200) | 评论 (0)编辑 收藏
     摘要: JAVA 程序员面试 32 问 第一,谈谈 final , ...  阅读全文
posted @ 2007-01-10 14:28 迪蓝 阅读(172) | 评论 (0)编辑 收藏
下面这个可怜的小程序并不能干脆的做决定。它的decisive方法将返回true。但是它也返回false。那么,它到底打印的是什么呢?甚至,合法吗?

class Indecisive
{
 public static void main(String[] args)
 {
  System.out.println(decisive());
 }
 static boolean decisive()
 {
  try
  {
   return true;
  }
  finally
  {
   return false;
  }
 }
}
   你可能认为这个程序不合法。毕竟,decisive方法不能同时返回true和false。如果你尝试一下,就会发现它
编译时没有任何错误,并且它打印的是false。为什么呢?
    原因在于就是在:在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行。无论try
语句块是正常结束的,还是意外结束,情况都是如此。在一条语句或一个语句块抛出一个异常,或者对某个封闭类型语句执行了一个break或continue,或是像这个程序一样执行了一个return时,将发生意外结束。之所以称为意外结束,是因为它们阻止程序按顺序执行下面的语句。
    当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally
语句意外结束的原因将与finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所
引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单的讲,程序
尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。
    总之,每一个finally语句块都应该正常结束,除非抛出不受检查的异常。千万不要用return,break,continue或throw来退出finally语句块,并且千万不要允许让受检查的异常传播到finally语句块之外。

posted @ 2007-01-10 14:20 迪蓝 阅读(143) | 评论 (0)编辑 收藏
 转型用于将一种类型转换到另一种类型.看看下面的code运行后你猜会打印什么?
 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位.这个数值最终回到起点了吗?运行一看不就知道了吗?
Print:
F:\Java Develop>javac Multicast.java

F:\Java Develop>java Multicast
65535
啊,这么会是65535?
oh,my god!有条规则: 如果最初的数值类型是有符号的,那么就执行符号扩展;如果他是char,那么不管它将要被转换成什么类型,都执行另扩展.
  
用这条规则来44看.因为byte是有符号的,所以在将byte数值-1转换成char时.会发生符号扩展.作为结果的char数值16位就都被置位了,因此它等于2^16-1(2的16次方减1),就是65535.从char到int的转型也是一个扩展,
用规则来说它将执行另扩展,而不是符号扩展.作为int的结果数值就是65535和打印的一样.
   从这个例子我们得到一个教训:
如果通过观察不能确定程序将要做什么,那么它做的就很有可能不是你想要的.

posted @ 2007-01-10 14:19 迪蓝 阅读(157) | 评论 (0)编辑 收藏

 Bill.Gate在一家小超级市场购买一个1.10元棒棒糖,但是他的钱报中都是两块一张的钞票.如果他用一张两块的钞票买这个棒棒糖,那么应该找给他多少零钱呢?
     编写一个程序解决这个问题.
code:
class Change
{
 public static void main(String[] args)
 {
  System.out.println(2.00-1.10);
 }
}

       Bill.Gate写下这段代码我们期望得到应该找回的零钞0.90,但是当运行后他发现数据不兑,运行结果为:0.8999999999999999,与预期的0.90不一样。为什么呢?搞了半天原因在于1.1这个数不能被精确的表示为一个double,因此被表示为最接近它的double值.该程序从2中减去这个值得.遗憾的是,这个结果打印出来并不是接近0.9的double值.这说明: 并不是所有的小数都可以用二进制浮点数精确表示.二进制浮点对于货币计算是非常不适合的.
      要解决这个问题有两个办法:一是使用某种整数类型,例如int或long,并且分单位来计算.如下:
System.out.println((200-110)+"fen");
结果为90分.二是使用执行小数运算的BigDecimal.它还可以通过JDBC与SQL DECIMAL类型进行互操作.这里需要注意的是: 一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double).后一个构造器将用它的参数值来创建一个实例.例如new BigDecimal(.1),它将返回一个BigDecimal,也即0.10000000000000000555111512312578270211815834041015625.正确使用我们就可以得到期望的结果0.90:
code:
import java.math.BigDecimal;
class Change
{
 public static void main(String[] args)
 {
  System.out.println(new BigDecimal("2.00").
                     subtract(new BigDecimal("1.10")));
 }
}
Print:
F:\Java Develop>java Change
0.90

posted @ 2007-01-10 14:17 迪蓝 阅读(135) | 评论 (0)编辑 收藏
仅列出标题