2008-04-09

工厂模式----易懂版(转)

关键字: 设计模式
一、引子 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz 车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?! 而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象。幸运的是,这种有病的现象在OO(面向对象)语言中可以避免了。下面就以 Java语言为基础来引入我们本文的主题:工厂模式。 二、分类 工厂模式主要是为创建对象提供过渡接口,以便将创建 ...
1.你需要精通面向对象分析与设计(OOA/OOD)、设计模式(GOF,J2EEDP)以及综合模式。 你应该十分了解UML,尤其是class,object,interaction以及statediagrams。 2.你需要学习JAVA语言的基础知识以及它的核心类库 collections, serialization, streams, networking, multithreading, reflection, event, handling, NIO, localization, 以及其他 3.你应该了解JVM,classloaders,classreflect,以及垃圾回收的基本 ...
2008-03-24

java解惑 - 漂亮的火花

关键字: 解惑
下面的程序用一个方法对字符进行了分类。这个程序会打印出什么呢? public class Classifier {     public static void main(String[] args) {         System.out.println(             classify('n') + classify('+') + classify('2')); &nbs ...
下面的程序从一个字节序列创建了一个字符串,然后迭代遍历字符串中的字符,并将它们作为数字打印。请描述一下程序打印出来的数字序列: public class StringCheese { public static void main(String[] args) { byte bytes[] = new byte[256]; for (int i = 0; i < 256; i++) bytes[i] = (byte)i; String str = new String(bytes); ...
2008-03-24

java解惑 - Hello world(续)

关键字: 解惑
面的是一个合法的Java程序吗?如果是,它会打印出什么呢? \u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020 \u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079 \u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020 \u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063 \u0076\u006f\u0069\u0 ...
2008-03-24

java解惑 - Hello world

关键字: 解惑
下面的程序是对一个老生常谈的例子做出了稍许的变化之后的版本。那么,它会打印出什么呢? /** * Generated by the IBM IDL-to-Java compiler, version 1.0 * from F:\TestRoot\apps\a1\units\include\PolicyHome.idl * Wednesday, June 17, 1998 6:44:40 o’clock AM GMT+00:00 */ public class Test{ public static void main(String[] args){ ...
2008-03-24

java解惑 - 转义字符

关键字: 解惑
下面的程序使用了两个Unicode的转义字符,它们是用其十六进制代码来表示Unicode字符。那么,这个程序会打印什么呢? public class EscapeRout{ public static void main(String[] args){ // \u0022 是双引号的Unicode转义字符 System.out.println("a\u0022.length() +\u0022b".length()); } } 对该程序的一种很肤浅的分析会认为它应该打印出26,因为在由两个双引号"a\u0022.length() ...
2008-03-24

java解惑 - ABC

关键字: 解惑
下面的程序将打印什么呢? public class ABC{ public static void main(String[] args){ String letters = "ABC"; char[] numbers = {'1', '2', '3'}; System.out.println(letters + " easy as " + numbers); } } 可能大家希望这个程序打印出ABC easy as 123。遗憾的是,它没有。如果你运行它,就会发现它打印的是诸如ABC easy as [C@16f ...
下面的程序将打印出什么呢? public class LastLaugh{ public static void main(String[] args){ System.out.print("H"+"a"); System.out.print('H'+'a'); } } 你可能会认为这个程序将打印HaHa。该程序看起来好像是用两种方式连接了H和a,但是你所见为虚。如果你运行这个程序,就会发现它打印的是Ha169。那么,为什么它会产生这样的行为呢? 正如我们所期望的,第一个对System.out.print的调用打印的是Ha:它的 ...
2008-03-24

java解惑 - 半斤八两(二)

关键字: 解惑
与上一个例子相反,如果我们给出的关于变量x和i的声明是如下的合法语句: x = x + i; 但是,它并不是: x += i; 乍一看,这个谜题可能看起来与前面一个谜题相同。但是请放心,它们并不一样。这两个谜题在哪一条语句必是合法的,以及哪一条语句必是不合法的方面,正好相反。 就像前面的谜题一样,这个谜题也依赖于有关复合赋值操作符的规范中的细节。二者的相似之处就此打住。基于前面的谜题,你可能会想:符合赋值操作符比简单赋值操作符的限制要少一些。在一般情况下,这是对的,但是有这么一个领域,在其中简单赋值操作符会显得更宽松一些。 复合赋值操作符要求两个操作数都是原始类型的,例如int,或包 ...
我们给出一个对变量x和i的声明即可,它肯定是一个合法的语句: x += i; 但是,它并不是: x = x + i; 许多程序员都会认为该迷题中的第一个表达式(x += i)只是第二个表达式(x = x + i)的简写方式。但是这并不十分准确。这两个表达式都被称为赋值表达式。第二条语句使用的是简单赋值操作符(=),而第一条语句使用的是复合赋值操作符。(复合赋值操作符包括 +=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=和|=)Java语言规范中讲到,复合赋值 E1 op= E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的类型,除非 ...
这个谜题将测试你对条件操作符的掌握程度,这个操作符有一个更广为人知的名字:问号冒号操作符。下面的程序将会打印出什么呢? public class DosEquis{ public static void main(String[] args){ char x = 'X'; int i = 0; System.out.println(true ? x : 0); System.out.println(false ? i : x); } } 这个程序由两个变量声明和两个print语句构成。第一个print语句计算条件表达式(true ? x : 0)并打印 ...
2008-03-24

java解惑 - 奇数性

关键字: 解惑
下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; } 奇数可以被定义为被2整除余数为1的整数。表达式 i % 2 计算的是 i 整除 2 时所产生的余数,因此看起来这个程序应该能够正确运转。遗憾的是,它不能;它在四分之一的时间里返回的都是错误的答案。 为什么是四分之一?因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。 这是 Ja ...
justjavac
搜索本博客
存档
最新评论