离弦之Ray

  语源科技BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

2007年10月10日 #

RT
posted @ 2010-02-10 16:02 离弦之ray的技术天空 阅读(246) | 评论 (0)编辑 收藏

安装前需要先联上线,并且您需要取得root权限。

perl -MCPAN -e shell

初次运行CPAN 时需要做一些设置,如果您的机器是直接与internet相联(拨号上网、专线,etc.),那么一路回车就行了,只需要在最后选一个离您最近的CPAN 镜像站点。例如我选的是位于国内的中国自由软件库ftp://freesoft.cgi.gov.cn/pub/languages/perl/CPAN 。否则,如果您的机器位于防火墙之后,还需要设置ftp代理或http代理。

获得帮助

cpan>h

列出CPAN上所有模块的列表

cpan>m

安装模块

cpan>install DBI

自动完成DBI模块从下载到安装的全过程。

退出

cpan>q
posted @ 2010-01-25 21:09 离弦之ray的技术天空 阅读(381) | 评论 (0)编辑 收藏

今天Google的mp3搜索上线了,与百度不同的是,全是正版……

玩了一下泡泡选歌,非常有趣。

从Gmail开始,然后是Gtalk,在线的Office,加上Task,calendar

Google把大家的桌面搬上Web的愿景,正在一步步实现。

posted @ 2009-03-30 18:54 离弦之ray的技术天空 阅读(227) | 评论 (0)编辑 收藏

比较有趣
posted @ 2008-10-07 20:08 离弦之ray的技术天空 阅读(238) | 评论 (0)编辑 收藏

http://labs.mozilla.com/2008/08/introducing-ubiquity/
posted @ 2008-10-07 10:19 离弦之ray的技术天空 阅读(371) | 评论 (1)编辑 收藏

最近需要使用Perl,就随便总结一下。

首先当然是环境的建立了,linux下不用管,都是自带了,直接就可以编写Perl脚本去了。

在Windows下需要去下载并且安装一个Active Perl,可以到这个网站http://www.activestate.com/Products/activeperl/index.mhtml去下载。

关于开发工具,已经存在一个Eclipse的插件,里面还带有正则表达式测试等功能,但是不是很成熟。其实只用带有代码着色的文本工具即可,然后在命令行调用Perl yourPerl.PL就可以了。

Perl最具特点是它有很多包含各种功能的Module可以被使用,你可以到http://www.cpan.org/去Search,downlads它们。
这些模块下载下来以后是一个压缩文件,将其解压缩以后,里面一般会有Makefile.PL,用perl命令去运行这个脚本即
perl Makefile.PL
接下来如果是在linux下,依次打入命令:
make
make test
make install
注意make test会提示你这个模块所依赖的模块是否已经被安装,最好把它依赖的模块也一起安装了,否则后面可能会出问题。
不知道有没有ANT里面 fetch-depends类似的功能,暂时没有找到。
如果你在windows下,make就要换成nmake了。

有少数的模块里面并没有Makefile.PL而是一个Build.PL,需要特殊的模块来安装,这个模块叫什么记不清了,可以去上面那个网站去搜索一下。

好了,环境工具都搞定了,找本书吧,O'Relly 的Learning Perl是很好的入门读物,甚者那个骆驼标志已经成为事实上Perl的代言人了。

然后就开始你的Perl旅程吧。


posted @ 2008-07-13 14:29 离弦之ray的技术天空 阅读(290) | 评论 (0)编辑 收藏

问:如何对私有方法进行单元测试?

答:重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出 来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而 重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。

问:但是,如果private方法确实出现问题了怎么办?如果确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?

答:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试。

 

 

 

posted @ 2008-04-16 20:54 离弦之ray的技术天空 阅读(2049) | 评论 (3)编辑 收藏

浏览器彻底换成了FireFox
编程用的是IDE是Eclipse
Server用的是Jboss
Office用的是Open Office


等待…………梦想中的Gphone

posted @ 2008-04-08 19:27 离弦之ray的技术天空 阅读(169) | 评论 (0)编辑 收藏

mysql的procedure不支持数组参数,在网上找了个强人的代码,与大家分享。
http://www.phpx.com/happy/thread-111759-1-1.html


DELIMITER ;
DROP DATABASE IF EXISTS PRO;
USE MYSQL
CREATE DATABASE PRO;
USE PRO
DROP TABLE IF EXISTS TEMP;
CREATE TABLE TEMP (
  ID                        INT(8)                NOT NULL AUTO_INCREMENT,
  FOREIGN_KEY               INT(8)                NOT NULL,
  PRIMARY KEY (ID)
) TYPE=MyISAM AUTO_INCREMENT=1 COMMENT='测试';

DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS DNA  //
CREATE PROCEDURE DNA (IN THE_CNT INT(8), IN THE_STR VARCHAR(10000))
BEGIN
  DECLARE i INT(8) DEFAULT 0;
  REPEAT SET i = i + 1;
  INSERT INTO TEMP VALUES (NULL, SUBSTRING_INDEX(SUBSTRING_INDEX(THE_STR, ',', i), ',', -1));
  UNTIL i >= THE_CNT END REPEAT;
END
//
DELIMITER ;

CALL DNA(7, '231,24,1114,151,7831241,9134,989');
SELECT * FROM TEMP;
+----+-------------+
| ID | FOREIGN_KEY |
+----+-------------+
|  1 |         231 |
|  2 |          24 |
|  3 |        1114 |
|  4 |         151 |
|  5 |     7831241 |
|  6 |        9134 |
|  7 |         989 |
+----+-------------+
posted @ 2008-03-06 19:44 离弦之ray的技术天空 阅读(2229) | 评论 (0)编辑 收藏

刚才试图搞mysql的存储过程,被郁闷了一回,最简单的存储过程,只要加上begin 和end就有莫名其妙的错误。

比如
CREATE PROCEDURE p()
BEGIN
  SELECT * FROM T;
END;
够简单了吧?就是报错,其实是分号的问题,说的正规点叫分隔符。

应该这样
1.    delimiter //
2.    CREATE PROCEDURE p()
3.    BEGIN
4.      SELECT * FROM T;
5.    END//
6.
7.    delimiter ;

第一行把分隔符改成双杠,这样到中间 FROM T的时候mysql不会认为SQL命令已经结束了;
第七行把分隔符再改回来,不然以后不习惯。
posted @ 2008-03-06 19:35 离弦之ray的技术天空 阅读(693) | 评论 (0)编辑 收藏


    粗粗看完一遍设计模式的时候,觉得Builder Pattern和Factory Method Pattern有点混淆,好像这两者都是将复杂的构造过程屏蔽掉,最终返回一个Client满意的对象,但他们的本质是不一样的
    Builder Pattern只针对一个类,这个类的特点是构造起来过程特别复杂,所以将构造的部分独立出来,专门用一个BuilderClass来负责生成对象。
    Factory Method更多的是针对生成实现同一接口的一组类中的某个。有点拗口,就是在运行时生成正确的对象。
    总结下来,就是Builder针对一个Class,Factory Method针对从一组Class中挑选一个
posted @ 2008-02-26 20:25 离弦之ray的技术天空 阅读(336) | 评论 (0)编辑 收藏

看设计模式看到Prototype Pattern,老实说觉得这个模式并不是特别重要,但其中提到的Java中的clone()方法,却值得仔细看一看,其中涉及到浅拷贝和深拷贝(shallow copy & deep copy),Sun的一篇技术文档已经写的很清楚了,推荐。

http://java.sun.com/developer/JDCTechTips/2001/tt0410.html#making

posted @ 2008-02-22 16:44 离弦之ray的技术天空 阅读(638) | 评论 (0)编辑 收藏

Meaning

A means of estimation made according to a rough and ready practical rule, not based on science or exact measurement.

Origin

This has been said to derive from the belief that English law allowed a man to beat his wife with a stick so long as it is was no thicker than his thumb.

Meaning里面已经写得很清楚,表示一个粗略的原则,毕竟打老婆的时候不会仔细丈量自己用的棍子的粗细到底有没有超过自己的拇指。

在书中它是这么用的:
The rule of thumb is that...
我想应该翻译成:大体的原则是...




posted @ 2008-02-20 16:41 离弦之ray的技术天空 阅读(358) | 评论 (0)编辑 收藏

    Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
    这四个类加载器分别为:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoader
URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader

Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。
AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。
URLClassLoader用来加载网络上远程的类,暂且不讨论。

它们之间的关系:

1.Parent-Child,按顺序从大到小。不是简单的继承关系。

2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。

3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException

4.类A调用类B,B会要求调用它的类的类加载器来加载它,也就是B会要求加载A的加载器来加载B。这就会有个问题,如果他们在一起,那没关系,肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中,而B在Classpath中呢?过程是这样的首先加载A,那么一层层上到Bootstrap Classloader,boot没找到所以ext自己找,找到了,没问题;加载B,因为A调用了B,所以也从bootstrap来找,没找到,然后A的ext classloader来找还是没找到,但是再也不会往下调用了,于是报出ClassNotFoundException。
但是现实生活中有很多应用,比如JDBC核心方法在核心库而驱动在扩展库,是必定在两个地方的,那怎么办呢?要用到Context ClassLoader我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.
posted @ 2008-02-20 15:16 离弦之ray的技术天空 阅读(4888) | 评论 (4)编辑 收藏

i before e except after c就是说在英文单词中,i一般都在e前面,除非是在c后面。

Seeing is believing 眼见为实

Halloween 万圣节前夕 October 31st

Tuberculosis 肺结核 cholera 霍乱

Auction 拍卖

Periodical == magazine

Blind date 相亲 Speed dating 很多人在一起的那种相亲,每对交谈的时间很短

Gold diggers 钓金龟婿的那种人(不是专指女的,指的就是只看重对方钱财的人)

Basis foundation 指的是结婚前必须的基础 Maldives 马尔代夫(蜜月圣地)

Concubine 小妾

Uygur 维吾尔族 Dual citizenship 双重国籍

Cupid 丘比特

Patriot 爱国者 Nationalism 爱国主义

Wacko 很疯狂的人,不正常的人

Domestic violence 家庭暴力

Go Dutch  AA

中国古代四大发明: Paper, moveable printing, compass, gun powder

Peak 顶峰比如一个抛物线的最高点

Pass the family name on 在谈到为什么会重男轻女时

Spoil the children 溺爱孩子 Brat 小皇帝

Infanticide -icide结尾都表示杀害,这个词就是杀婴者

Calligraphy 书法


一些词根的意义
Patr – father
matr – mother

fili – child
fratr – brother
soror – sister

Step-father 继父 Step-child 继子

Bribe 贿赂(红包)

Anchor baby 就是那些在美国降生,属于美国人的那种孩子(父母并不是美国人)

Xenophobic 恐惧外国人的

Supreme Court 最高法院

Classic Chinese

Dim Sum 老美从在美国人那里听出来的,其实就是广东话的“点心”

Gung-ho 词源是“工合”(工业合作社),现在的意思是quick quick 用来鼓励士气等等

Catch sb. red handed 你如果刚好逮到一个小偷把手伸到你的口袋里,那么你就catch him red handed

Peking Opera 京剧

Acting up (仪器、设备)坏了

Vegetarian 素食主义者

Pipe down ==be quiet

Stewardess = = fight attendant 空姐

Bulging 凸出,比如眼球凸出

Pluck 拔(鸡毛、鸟毛),也指秃鹫啄食尸体的肉

Sissy 娘娘腔

Pony-tail 马尾辫 pig-tail 扎两个辫子

Poodle 贵妇犬

Hound 警犬 Hound Dog 花花公子

Psychedelic 迷幻的(形容嗑药后的感觉)

Splinter 小裂片,老师解释的时候,比如中国战国时代的时候,整个中国分裂成很多碎小的国家

Sesame 芝麻 sesame street……

Puppets 戴在手上的那种木偶

Cocaine 可卡因

Flaunt it it炫出来,炫耀

Watchwords 流行的词

Binge buying 短时间内消费很多,如超市购物

Carpool 就是“拼”,拼车、拼……

Torn-jeans 有毛边的,有洞的牛仔裤

Fishnet 渔网状的(可以用来形容那种丝袜)

Smurf 蓝精灵

Stretch my gams (运动前)活动一下肌肉, gamsmuscle 的另一种说法

Moonwalk 迈克杰克逊的太空步

What a feeling

Snap out of it    snap指手指打响,整句是“别做梦了”的意思

Bow 作为动词是鞠躬的意思,作为名词是弓的意思。作动词和名词时读音不同。

Flushblush 都是脸红的意思,但flush是因为热而脸红,blush是因为害羞而脸红

Noisy 可以被用来某人问了太多的问题,就可以说他太noisy

Landlord 房东

Toothpick 牙签

Clothespin 常用的那种夹衣服的夹子

Shoelace 鞋带

Dental 牙线

Left-handed左撇子

Amusement 娱乐消遣

Rubber 橡皮但是也表示condom

Charity 慈善团体

Pavilion 亭子

Yacht 游艇

Donation 捐款,贡献

Jack pot头奖

Slot machine老虎机

Acrobatics 杂技

Martial arts

Mime哑剧

Stuntman 特技演员

Kung fu 功夫

Breakthrough – a sudden success

Royal Family

Vocational/trade school 技校

Self-starter有主动精神的人

Sheltered 受保护的,指的是那些被宠坏的孩子

To hit the books---- to study a lot

Carpentry 木工

Incense薰香

Shooting star 流星

Twitch 眼皮跳

Dove 鸽子

Knuckle指关节

Turtle 海龟

Magpie喜鹊

Turkey火鸡

Eyelash 睫毛

Priority boarding 老人小孩等先上

Direct 需要转机 Non-stop直达

Low-cost Airline经济航空

Railroad crossing

Crosswalk 人行横道

Pedestrian 行人

Toll booth 收费站

Highway Expressway都表示高速公路

Skyway表示天桥

Elevated road高架

posted @ 2008-02-10 21:04 离弦之ray的技术天空 阅读(939) | 评论 (1)编辑 收藏

RT
posted @ 2008-02-07 00:33 离弦之ray的技术天空 阅读(118) | 评论 (0)编辑 收藏

   声明

如今这个博客已不是我一个人的。

是我和我女朋友的。

这里将作为我们的学习记录。

希望光临的各位多提意见,共同进步!

posted @ 2008-01-07 13:23 离弦之ray的技术天空 阅读(179) | 评论 (0)编辑 收藏

     摘要: Chapter 6 DOM 基础        书的这章主要是围绕document这个对象的使用来讲的。Document对象既是BOM的一部分, 也是Html DOM的HTMLDocument对象的一种表现形式,它也是XML DOM Document对象。JavaScript中的大部分处理DOM的过程都是用到了document对象。 ...  阅读全文
posted @ 2008-01-04 20:29 离弦之ray的技术天空 阅读(467) | 评论 (2)编辑 收藏

     摘要: Chapter 7  正则表达式 1:定义RegExp对象:        1: var reCat = new RegExp(“cat”,”gi”);         2: var reCar = /C...  阅读全文
posted @ 2008-01-03 14:13 离弦之ray的技术天空 阅读(267) | 评论 (0)编辑 收藏

So many people passed.
No one leave any comments.
I feel depressed....
posted @ 2007-12-25 18:58 离弦之ray的技术天空 阅读(219) | 评论 (1)编辑 收藏

一直疑惑 ArrayList<int> 怎么搞,但懒得去查,今天网上搜到了:

The generics facility in Java can be used only for
object (reference) types.  It cannot be used primitive
types like 'int' or 'float'.

So, if you wanted an ArrayList that contained only
integer data, then you'd need to use the object type
which corresponds to int: java.lang.Integer.

   ArrayList<Integer> numbers;
   numbers = new ArrayList<Integer>(40);

Fortunately, the new Autobox/unbox features of Java can
make this work just like an ArrayList of int.

   numbers.add(27);

The value 27 will be automatically boxed as an Integer
object, then added to the ArrayList<Integer>.

For more information, consult
http://java.sun.com/developer/technicalArticles/J2SE/generics/index.html
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

posted @ 2007-12-23 15:22 离弦之ray的技术天空 阅读(967) | 评论 (0)编辑 收藏

中国和开源在政治文化上的冲突与交集

摘要
本文着重分析了中国和开源在政治文化上的冲突,并通过分析开源文化和中国文化中的交集来探求解决矛盾冲突的方法。

I前言
        如今在中国,开源正发展的如火如荼。国内的技术专家们对开源技术津津乐道。然而,事情并不是像表面上如此和谐。自九十年代,以宫敏为代表的第一批技术专家从国外将开源软件引入中国已经有了近十年光景,但中国的开源社区在世界开源社区的眼中一直不是一个合格的成员。其中的原因是多方面的,但事实上,阻止中国融入开源并不是技术上的原因,更多的是文化上甚至是政治上的原因。本文在查阅了中外业内人士对这个问题发表的文章后,提出了自己的理解。



II文化上的冲突
        东西方文化有着巨大的差异,这里以美国和中国为例,对此进行对比和分析。

A.个人主义VS集体主义
        表面上看,对于开源软件开发这种群体性的活动,中国的集体主义似乎更贴合。但事实上恰恰相反。西方社会崇尚的个人主义不是没有条件的个人主义,而是在不破坏集体利益的前提下充分尊重个人,给予每个人广阔的发展空间,对个人的研究成果给予充分的承认和尊重。
而中国人的集体主义更强调为了集体要牺牲个人利益等等。这样的指导思想过于强调牺牲,某种程度上让人在潜意识里面认为个人利益和集体利益是相冲突和对立的,所以挫伤了个人对集体贡献的积极性。
开源能发展的立足点就是有很多的志愿者的贡献,如果没有贡献,开源就无法发展下去。

B.平等主义VS等级主义
        美国的文化向来强调人与人之间平等,在开源领域,强调的是开发者之间的平等,不同的只是分工。这在一定程度上鼓励了开发者的贡献热情,大家都以平等的姿态对某个项目发表自己的观点,做出力所能及的贡献。并且你贡献的越多,你被赋予的权力也越大。
而中国在几千年的封建文化的影响下,依然保留着等级观念的残余。这和开源所强调的每个人平等显得格格不入。
在现实中可以从西方开源社区的红红火火和中国社区的徘徊不前可见一斑。

C.其它文化冲突
        另外,东方文化向来表现得比较含蓄,而西方文化更加的开放。对邮件列表上的数据统计可以发现,来自中国日本等东方国家的意见明显比其它地区少。究其原因,是因为东方文化常常把批评看作是耻辱,而西方文化却把批评看作是别人对自己的尊重,并通过别人的批评来改进自己的不足。这种文化上的“害羞”,甚至影响到了中国开发者对开源社区的贡献。
当然,“贡献少”的原因是多方面的,中国文化中的一些劣根性对其也有一定的消极作用。正因为如此,在西方开源世界眼中,中国开源开发者一直是“消费者”,而不是“社区成员”。这在一定程度上阻碍了中国开发者融入开源社区。

III政治上的冲突
        对比西方政府和中国政府,西方政府强调市场化和经济自由,而中国政府虽然自从改革开放以来不断地把经济制度向市场化的方向进行改革,但毕竟这个过程时间不长,相比西方政府,行政手段还是比较多。看起来似乎是西方政府市场化的经济政策更符合开源的发展。
而事实上,标榜自由的西方政府却在政策上限制开源软件的自由发展,而中国政府却在
大力扶持开源软件。究其本质,是因为西方政府在制定政策和法律的时候常常受到某些大型商业软件公司的游说和影响,为了保护那些公司的商业利益和市场垄断地位,必定要限制开源软件的发展。
计算机科学起源于西方社会,应该说以中国为代表的发展中国家在这方面远远落后于西方发达国家,造成了国家机关甚至是一些关乎国家安全的部门也不可避免使用西方的一些基础软件,比如操作系统等等,这对国家安全来说存在着潜在的危险。而起源于西方的开源运动,让中国这样的发展中国家终于有机会接触到一些关键技术的核心部分。正是出于这些考虑,以中国政府为代表的广大发展中国家的政府都愿意大力支持开源软件发展。
        这些本来并无可厚非,但在西方的一些开源领袖以及开源社区眼中,中国的开源掺入了太多的政治因素。
“尤其在政治层面,我们看到有太多的人只是把开源当作一个手段,通过这个手段,中国可以建立一个与世界其它地方相独立的国家软件产业。”这样的论调非常普遍,说明了在很多西方人眼中,中国对开源的热衷仅仅是为了自身利益的考虑。
这与强调开放、交流、共享的开源文化背道而驰。甚至开源世界的教父级人物Eric Raymond也发表过“不屑于与中国政府有任何关系”的激烈言论。

IV交集
        解决冲突和矛盾最好的方法就是要寻找矛盾双方共通的地方,给予双方一个交流的平台,继而最终相互妥协达到一个比较和谐的状态。
        其实中国和西方开源世界并不是水火不容,利益也不是绝对冲突的。首先,中国需要开源世界来学习西方先进的计算机技术。如今的中国计算机教育,是在某些大公司的技术垄断之下的教育。无论在国家战略和个人发展来看,只有通过开源技术,中国才能真正掌握计算机核心技术,才能发挥个人的能力和创造激情,才能对全球软件产业的发展发挥自己的正面影响;其次,西方的开源世界也需要中国。虽然如今的开源运动发展的如火如荼,但客观的讲,与垄断商业的抗争还处于下风。开源运动的影响,几乎只是局限于技术人才之间,而对普通大众的影响微乎其微。在中国经济发展刚刚开始发展,经济基础比较薄弱,而WTO对中国政府反盗版压力与日俱增的时代背景下,通常是免费的开源软件相对于价格昂贵的商业软件在经济层面上有着无可比拟的先天优势。开源世界正可以利用这点来扩大开源软件的影响力,中国人口众多,计算机使用者的绝对数量也非常巨大。试想,如果中国的大众都在使用开源软件,那么对于那些垄断性的商业公司将是一场巨大的胜利。
在文化和哲学上,其实中外双方都有一批仁人志士在扮演着沟通桥梁的角色。有人就从古代中国道家的哲学思想中找到了与开源哲学的共通之处。
        有一个在中国广为流传的故事:孔子问老子什么是“道”?老子张开嘴,什么也没说,孔子说明白了。其他人问孔子到底什么是道,他回答说,老子张开嘴的意思是说,人老了,牙齿全掉了,但是舌头还在。意思是柔软的东西比坚硬的东西来得更长久,这就是道。
如果拿开源软件和垄断性的商业软件来比较,开源软件正是那软力量。当前来看,似乎是垄断性的商业软件更占上风一点,但是开源因为它的“柔软”,所以更加的灵活,更加的有生命力。长远来看,代表大众利益并有着深厚群众基础的开源软件必然会取得胜利。
        道家还有一个论点,就是大海之所以为大海,是因为大海把自己的姿态放的很低,江河才会流向大海。这个思想也和开源哲学不谋而合,开源组织只有广泛接纳来自各个领域、各种文化有志于开源软件的人才会壮大;开源文化只有吸收全世界的优秀文化,才能不断修正自己的不足,让自己对全球各地的技术人才有更大的吸引力。大海,才能越来越壮大。
在西方世界,同样有人在努力寻找开源在中国的立足点。在许多人眼中,似乎如今在亚洲如火如荼的开源运动仅仅是因为价格驱动。但要知道版权、商标还有“copyrights”这些都是西方提出的一些概念。在中国的历史中,事实上政府都没有出台过强硬的关于版权和知识产权的法令。在中国的核心观念中,聪明的统治者,会让智慧代代相传,只有大家有着
        共同的价值观我们在当代才能继续传播智慧。试想,如果发明造纸的中华民族为造纸申请了专利的话,那可能就没有当前人类的文明了。
        在开源世界,志愿者的贡献通常不是利益驱动的。他们的目的是追求对世界产生正面影响力的满足感。在心理学上也证明了,对于需要创造性的工作,设定具体的物质奖励反而会降低人的积极性进而影响到最后的成果。这与孔子“道之以政,齐之以刑,民免而无耻;道之以德,齐之以礼,有耻且格。”的思想不谋而合。
综上所述,在面对开源运动的时候,中国必须看清其中的矛盾和冲突,也更要找到我们与开源哲学的共通点化解矛盾。首先要让自己的心胸更开阔,勇敢地说出自己的观点,并敢于面对别人的批评;其次要提倡“雷锋”精神,改变中国在开源世界“消费者”的角色,而真正成为开源社区的一分子;再次,在处理开源问题的时候,要淡化政治色彩,划清政治和开源的界线,这样中国的开发者才更容易被开源社区所接纳。最后,开源需要中国开发者的加入,所谓“水滴石穿”,水滴多了,石头才能更快地被化解。

参考文献
[1] Dirk Hohndel, “China Open Source Promotion Union”.
[2] Phil Albert, “China’s Love of Linux Has Roots in Ancient Past”.
[3] Phil Albert, “To Steal a Book is an Elegant Offense”.
[4] Lawrence Lessig, “Free Culture”, THE PENGUIN PRESS, NEW YORK, 2004.
[5] J Aaron Farr, “Open Source in China”, unpublished.
[6] Alfie Kohn, “Studies Find Reward Often No Motivator, Creativity and intrinsic interest diminish if task is done for gain”.
[7] Thompson, Nicholas, “The American Prospect”, 09-SEP-02.
[8] Chen Nan Yang, “Taoism of open source”, September 29, 2007.
[9] Richard Stallman, “Why Software Should Be Free”, April 24, 1992.
[10] Richard Stallman, “Why Software Should Not Have Owner”.
[11] 陈伟, “中国开源的冰与火”.

posted @ 2007-12-18 18:58 离弦之ray的技术天空 阅读(218) | 评论 (0)编辑 收藏

设计模式看懂了,好像是没什么用的。只有在你的开发中运用起来才有它的意义。

虽然还是小菜鸟,但既然看过了设计模式,还是希望能用起来的。

想做个自娱自乐的j2ee的东西。

关于得到数据库连接部分,一开始觉得是用工厂模式,用工厂模式得到Connection对象,试了几次好像不行。

然后尝试单态模式,创造了一个DatabaseGeneralServices类,来提供数据库连接和关闭数据库等一些通用的服务。
一切正常。有点小感悟,代码如下,希望高手指点。

package com.ClockWise.ray.persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class  DatabaseGeneralServices {
 private DataSource ds;
 private InitialContext ic;
 
 private static DatabaseGeneralServices dgs = new DatabaseGeneralServices();
 
 
 private DatabaseGeneralServices()//use singleton pattern, so the constructor is private
  { 
   try{
      ic = new InitialContext ();
      ds = (DataSource)ic.lookup("java:jdbc/readshare");//get database connection
  }catch(NamingException e){
   e.printStackTrace();
  }
 }
 
 public  Connection getConnection(){
  try{
   return ds.getConnection();
  }catch(SQLException e){
   e.printStackTrace();
  }
  return null;
 }
 
 public  void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){
     try{
      if(rs!=null){
       rs.close();
       }
      if(ps!=null){
       ps.close();
      }
      if(conn!=null){
       conn.close();
      }
     }catch(SQLException e ){
      e.printStackTrace();
     }
 }
 
 public static DatabaseGeneralServices getInstance()//get the sigleton instance
 {
  if(null==dgs){dgs= new DatabaseGeneralServices();} 
  return dgs;
 }

}

posted @ 2007-12-17 14:55 离弦之ray的技术天空 阅读(503) | 评论 (0)编辑 收藏

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
- Martin Fowler, Refactoring - Improving the Design of Existing Code
posted @ 2007-12-16 23:16 离弦之ray的技术天空 阅读(272) | 评论 (0)编辑 收藏

     接连听了两个宣讲,一个Sun,一个Microsoft。

     Sun主推了它的操作系统Solaris,Microsoft倒是请到了图灵奖的得主。

    不过还是商业味太浓,也就是听听罢了。

    看图吧

    首先是Sun,是Sun的CTO,现在在负责OpenSolaris社区

    

     接下来是微软。图中是图灵奖得主
    

    牛人和学生Q&A
   
posted @ 2007-10-29 22:13 离弦之ray的技术天空 阅读(213) | 评论 (0)编辑 收藏

Interfaces

有两种主要的Collection Types
java.util.Map
java.util.SortedMap
java.util.Collection
java.util.Set
java.util.List
java.util.SortedSet


Implementations

List的三种实现

java.util.Vector
java.util.ArrayList
java.util.LinkedList

三者的异同
三者都是有序的,一般就是加入的次序。

        VectorArrayList内部都是用数组实现的,可以把它们想象成为一个数组。当容量不够的时候,就新建一个更大的数组,然后把现在这个数组中的所有元素都拷过去。可以想象这种实现可以很方便的直接取出你要的某个元素而不用遍历。但是如果在中间删除或者插入元素,效率就不高了。甚至每次扩容的时候,都是很影响效率的时候。

        VectorArrayList的区别就是Vector是线程安全的,但ArrayList不是。因为实现线程安全是有代价的,如果应用中不需要线程安全,那么就用ArrayList,如果需要线程安全那就一定要用Vector

至于java中的LinkedList,其实在数据结构中就是双向链表。插入和删除元素都很快,但是要查找一个元素就慢了。有失必有得,如何选择,就看应用的情况了。


MapSortedMap的几种实现

java.util.HashTable
java.util.HashMap
java.util.IdentityHashMap
java.util.WeakHashMap

        以上四种都是无序的。HashTableHashMap的区别是HashTable是线程安全的而HashMap不是,这个关系有点像VectorArrayList

        IdentityHashMap首先它是一个HashMap,不同的是,它不是根据equal()函数来判断是否重复,只要不是同一个对象,哪怕这两个对象的数据都是一样的,那么就可以add进来。


java.util.LinkedHashMap

java.uil.TreeMap

        以上两种是有序的Map,可以进行iterate,当然这是要付出效率代价的。两者不同之处,由名字便可知道,LinkedHashMap用链表来维护这个次序,而TreeMap是用二叉树来维护这个次序。

SetsSortedSets的几种实现

java.util.HashSet
java.util.LinkedSet
java.util.TreeSet

由名字就可知道什么意思了,不多说了

Collection的选择

        需要通过一个key找到一个元素吗?
        Yes,那就用Map
        No,那就用Collection

       如果选择了一个Collection,允许重复元素吗?
       Yes,那就用List
       No,那就用Set

       然后就是决定要不要Sorted...这个就比较难决定了。
       如果常常要sort,那就直接选择sorted的类型
       如果偶尔或者根本不需要sorted,那就选择普通类型,需要sort的时候先拷到sorted的类型中sort一下。

三种Iterators

java.util.Enumeration

这个基本被Iterator替代掉了,但在某些场合,比如J2ME中还可能用到。

java.util.Iterator

用的最广泛

java.util.ListIterator

双向的Iterator,必须用在实现ListCollection上面。


PS很多Collection提供的是Fail-Fast Iterators,就是在iterater的时候,这个Collection是不能被更改的,否则就会报出ConcurrentModificationException在多线程环境下面尤其要注意。


posted @ 2007-10-26 21:14 离弦之ray的技术天空 阅读(789) | 评论 (0)编辑 收藏

Final constrants

       在编程中,用final变量来声明一些常量,这样就不用在每个用到这个常量数字的地方打入令人厌烦的复杂数字(比如PI),只要打入这个常量名字就行了。这大家都知道,可是要注意,这种常量是在编译阶段才被替换的(所谓替换,就是把程序中用到这个常量名字的地方,用常量本身来替代)。那意味着,如果其它类用到了这个常量,如果常量的值发生了更改,那用到这个常量的类必须重新build一下,否则那个类里还是以前的值。

        如果在程序中你用到了private final static常量,并且只在某一个方法内用到,那么你应该把它的声明移到方法以内。如果被两个以上的方法用到,那么还是留在类声明里。

移入方法内部后,不用写private关键字,而且程序看起来比较简单。


Final Variables

首先写个例子

public static String someMethod(final String environmentKey){

           final String key = "env." + environmentKey;

          System.out.println("Key is :" + key);

           return (System.getProperty(key));

}

        在method中声明的final变量和常量是不同的,不同之处在于method-scoped final variables are variable。每次进入这个方法内部,这个变量就被初始化一次。当然,这些变量都是运行时进行替换,而不像常量是在编译时进行替换。


Final Parameters

将方法的parameters声明成final,可以防止,在方法体内部这个参数被篡改。很好的best practice


Final Collections

        public final static Set VALID_COLORS; 这句语句是不是声明了一个final set?答案是NO。这只是声明了一个final引用,也就是VALID_COLORS这个引用不能被更改。

        如果重新声明一个引用指向这个对象,那么这个对象还是能够更改的,所以这并不是一个final set。那么怎样做才能真正得到一个final set呢?

public final static Set VALID_COLORS;

static{

Set temp = new HashSet();

temp.add(Color.red);

temp.add(Color.blue);

...

VALID_COLORS = Collections.unmodifiableSet(temp);

}

        在实现自己的unmodifiable collections factory的时候,除了要实现Collectionseriallizable接口以外,对于Collection中定义的写操作,要重载。方法体中可以简单地抛出UnsupportedOperationException异常。

Instance-Scoped Variables

        说白了,就是那些在对象被实例化的时候才被初始化的属性,并且是不能被修改的。那么就把他声明成final吧。

exprivate final Date creationDate =

Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();

这么做的话,就可以防止误操作,改变这个本来不应该变的值。


Final Classes

ex:

public final class SomeClass(){

//...Class contents

}

        这样的class 不能被继承。

        还有一种方法实现,就是把它所有的构造函数都改成private的。

        这在设计模式中sigleton模式中见过,但这就限制了这个类的重用,所以取个折衷,可以把构造函数声明成protected的。


Final Method

这个很熟悉了,一个类中的某个方法如果被声明成final的,那么这个类的子类是不能override这个方法的。


Conditional Complilation

        编程的时候我们常常会使用System.out.println(".....");来显示一些程序的运行情况,但在真正交付的时候,我们并不希望这些语句被编译到class文件里面去。

        一个做法是所有这种类型的语句前面加上一个if(booleanParameter),然后通过设置这个booleanParameter来实现要不要运行这些语句,编译器在编译的时候如果发现if里面的语句不可达,那么会将这些程序代码直接去掉。

        疑问就是这些booleanParameter放在哪里比较好和方便。作者给出的建议是在包中专门建一个类,里面存放这些静态的boolean常量,当然,命名的时候要仔细。名字要指出用在哪里。

posted @ 2007-10-23 14:07 离弦之ray的技术天空 阅读(329) | 评论 (0)编辑 收藏

1.Java没有指针?NoJava只是没有针对指针的算法。引用其实已经包含了指针。

2.RTTI——Runtime type identification,作用就是告诉你整个object是属于什么类型的。最常用的是getClass()方法。

3.只在for循环中用到的变量,就在for循环中声明和分配,不用担心会循环分配内存。

比如:

for(int i =0;i<10;i++){

String s = a[i];

}

s并不会循环new,编译器会处理,让它只在第一次分配内存。
前面编程,我还特意把s移到外面去呢……汗啊

4.switch语句中,如果在default语句中加一个break是完全没有用的。因为在那个地方的break根本就不会被执行。

5.continue

for(int idx=0;idx<1000,idx++){

if(idx==555){continue;}

}

在这个例子中,循环仅仅跳过了555,如果程序中遇到类似要跳过某个点的情况,可以这么利用continue,会减少很多代码。


6.chaining constructor

活用super()、this()等,来缩减构造函数的复杂度。


7.private for attributes

   public for public methods

   protected for helper methods


8.In Java, instances of the same class are friends and give unrestricted access to all of their properties and methods.

比如

if((obj.value==5)&&(this.value==5)){

obj.value=25;

}

这里面跳过了setter方法,直接给属性赋值,这是很危险的做法。解决的方法是无论什么方法给对象中的属性赋值都要通过setter方法。


9.对于问题代码要尽量用throw exception告知用户,因为有时候不知道代码的执行环境,如EJB等等,很多环境都是没有Console的,若是简单的System.out.println 可能解决不了问题。

posted @ 2007-10-22 10:15 离弦之ray的技术天空 阅读(415) | 评论 (0)编辑 收藏

 

JDBC 主要有两种方法

DriverManager机制:java.sql核心API

DataSource机制:javax.sql可扩展API

DriverManager机制:

stetp1:注册驱动程序

1)隐式注册Class.forName("JDBCDriverName");

2)显示注册DriverMnager.registerDriver(new JDBCDriverName());

step 2:建立数据库连接

Connection conn = DriverManager.getConnection(URL,username,password);

//其中URLjdbc:driver:databasename

step3:SQL操作

DataSource机制

step1:查询数据源对象

Context ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup(DataSourceJNDIName);

step2:获取数据库连接

Connection con = ds.getConnection();

step3SQL操作

SQL操作

1)使用Statement

      Statement stmt = con.createStatement();

      stmt.executeUpdate("SQL语句");

      stmt.close();

2)使用PreparedStatement

      例子

      PreparedStatement psmt = conn.preparedStatement("INSERT INTO employee                                                  VALUES(?,?,?)");

       psmt.setString(1,"Benjamin");

       psmt.setString(2,"France");

       psmt.setInt(3,55);

       int opNum = psmt.executeUpdate();

       还可以批量处理

       psmt.setString(1,"Benjamin");

       psmt.setString(2,"France");

       psmt.setInt(3,55);

       psmt.addBatch();

       psmt.setString(1,"Rob");

       psmt.setString(2,"America");

       psmt.setInt(3,56);

       psmt.addBatch();

       int [] updateCounts = psmt.executeBatch();

关于ResultSet

ResultSet rs = stmt.executeQuery("SQL");

next()——移到下一行,如果没有了则返回false。常常放在while(rs.next)用来循环取数据

getString(String ColumnName)

absolute(int row)

beforeFist()

isAfterLast()

isBeforeFirst()

isFirst()

isLast()

refreshRow()

关于元数据

所谓元数据就是描述数据的数据,这里当然指列名等等信息了

ResultSetMetaData rsmd = rs.getMetaData();

rsmd.getColumnCount();

rsmd.getColumnName(index);

posted @ 2007-10-21 18:41 离弦之ray的技术天空 阅读(350) | 评论 (0)编辑 收藏

        作为j2ee小菜鸟,初次遭遇JNDI还是在大三的时候,当时学院搞j2ee实训,我们还没搞清楚servletJSP就依葫芦画瓢的搞Struts了。所以在配置mysqlds.xml的时候完全不知道在配置DataSource,现在知道这就是在使用JNDI。网上查了几个网页,拼拼凑凑,模模糊糊地理解了:

        JNDI——Java Naming and Directory InterfaceTM

       直接翻译就是Java命名和目录接口,实现这个接口,提供的是一个服务,这是个什么样的服务呢?

       首先在连接数据库的时候(我使用的是mysqljboss4.0),我们会用到Context这个类,context是一套name-to-object的绑定,可以理解为层次或目录,他可以包括下一层subContext。在使用命名和目录服务时获得initial context 是对整个名字空间操作的入口。

       针对Datasource而言,说白了,就是给你的数据库连接(注意,是数据库连接Connection这个对象,不是数据库)起个简单易懂的名字,你在程序中直接调用这个名字,就得到这个连接的对象,而具体的生成和管理就靠服务器了。

      通常会形成一个connection pool,动态的来管理这些对象以节省资源。

      这样,如果项目移植到其它数据库或者服务器什么的,只要配置服务器就行了。配置比如这个连接用什么JDBC驱动啊,用户名和密码啊等等。程序代码可以不作改动。这里的DataSource不一定就是数据库连接,还可以是其它比如文件连接等等。


     其实EJB都是靠JNDI得到EJB objectreference的,具体的机理是不太了解,不过就是那个意思,初学者这样理解应该就够了。


    今天郁闷了半天,在jboss里面配置JNDI DataSource,想看看如果外面直接用普通的Java工程能不能连接数据库,答案是否。后来想通了。服务器提供JNDI服务所使用的类,这个普通的工程又不知道在哪,当然搞不起来。而Web工程和EJB工程因为发布到服务器下面的目录的,所以能使用JNDI服务。


    这是我的理解,请各位高手指点。


   至于JBoss等等服务器怎么配置,网上搜一下,有很多牛人总结的,这里就不重复了。


posted @ 2007-10-15 21:54 离弦之ray的技术天空 阅读(367) | 评论 (0)编辑 收藏

 

基础概念——Class Modeling

OO的概念——这就不多说了


三种模型

class model——描述object的结构

state model——描述单个object的行为

interaction model——描述object之间的互动行为


Class Model

单个的class图很简单


首先是类名、然后是属性,最后是方法。

前面的+表示public-表示private#表示protected


Association


形式上Association就是一根线,表示两个类之间的关系,线上可以标明Association的名字,两端可以标上multiplicity1表示one"1..*"表示one or more"3..5"表示three to five

"*"表示many

两个类之间可以有多于一个Association,但一般不常用


Association End Names


Association
的两端可以标上两个类在这个关系中的角色

这在两个类的关系中作用可能不是特别明显,但如果相关的双方属于同一个类


Association两端可以加很多限制



等等,还有Bags对应于sequence,没有先后次序。


Qualified Association


首先是没有Qualified


然后是Qualified



N-ary Association


Generalization

具体在编程语言中,就是继承关系


很简单不多说


Association->Aggregation->Composition


Aggregation表现的是一种part-whole的关系


Composition


Composition
Aggregation的区别是part只能属于一个Assembly

可以说Association->Aggregation->Composition关系一层强过一层


Abstract Class 类名用斜体字


属性有一种叫做Derived Data,它的意思是这个属性是被其它属性或类导出来的,被其它elements所决定,符号是在这个属性前面加上斜杠


如上图中,agebirthdate currentDate所决定。

最后一种图示,就是package


posted @ 2007-10-15 11:30 离弦之ray的技术天空 阅读(744) | 评论 (0)编辑 收藏

 

servlet 基本结构

public class ServletClass extends HttpServlet {

public void doGet(HttpServletRequest request, HttpSevletResponse response)

throws ServletException,IOException{

//Use “request” to read incoming HTTP headers


//Use “response” to specify the HTTP response status


//use “out” to send content to browser

PrintWriter out = response.getWriter();

}

}

如果希望servletGETPOST请求采用同样的行动,只需要让doGet调用doPost,反之亦然。
值得注意的是doGetdoPost都要接收以上两种类型的参数。


servlet 处理表单数据

表单数据

1)使用FORM来创建HTML表单

<FORM ACTION="..."> 其中 "..."指的就是处理表单的servlet 或者JSP

2)使用输入元素收集用户数据

<INPUT TYPE="TEXT" NAME="...">

3)在接近表单的尾部放置提交按钮

<INPUT TYPE="SUBMIT">

读取表单数据

有三种情况:①request.getParameter②request.getParameterValues

request.getParameterNames

getParameter对应于单个值的读取,如果有这个参数但没值,那就返回空的String;如果没有这个参数,则返回null

getParameterValues对应于同一个参数的多个值,返回的是一个数组,是这个参数值的集合。如果不存在这个参数名,那就返回一个null;如果这个参数只有一个值,那就返回一个只有一个元素的数组。

getParameterValues返回的是所有参数的一个Enumeration,如果没有参数,那返回的就是一个空的Enumeration而不是null。同时这个Enumeration中的次序是乱序的。

要对参数为null或者为空String的情况作出相应的处理

if((param==null)||(param.trim().equals(""))){...}


RequestDispatcher

下面的代码:

RequestDispatcher dispatcher = request.getRequestDispathcer s(address);

dispatcher.forward (request,response);



JSP

JSP直接插入表达式

<%= Java Expression%> 比如:<%= new java.util.Date() %>

其实,JSP在后台都被转化成servlet,所以servlet JSP没有本质的区别。


scriptlet

说白了,就是直接在JSP页面中插入java代码,我不是很喜欢,太乱了。举个例子:

<% if(Math.random()<0.5) {%>

<H1>Have a <I>nice</I> day!</H1>

<% } else {%>

<H1>Have a <I>lousy</I>day!</H1>

<% } %>

JSP page指令

import 属性

<%@ import = "package.class"%>

<%@ import = "package.class1,package.class2...package.classN"%>

contentTypepageEncoding属性

<%@ page contentType = "someMimeType; charset = someCharacterSet"%>

比如<%@ page contentType = "application/vnd.ms-excel"%>

pageEncoding指的是字符集

比如设置成日语:<%@ page pageEncoding="Shift_JIS"%>


session属性

控制页面是否参加HTTP会话

<%@ page session = "true"%>


isELIgnored属性

是否忽略JSP2.0表达式语言

<%@ page isELIgnored = "ture"%>


此外还有bufferautoFlusherrorPageisErrorPageisThreadSafeextendslanguage属性


JSP中使用JavaBean

基本要掌握三个语句

<jsp: useBean id="beanName" class="package.class"/>

<jsp:getProperty name = "beanName" property="propertyName"/>

<jsp:setProperty name ="beanName" property="propertyName" value="propertyValue"/>






posted @ 2007-10-14 22:57 离弦之ray的技术天空 阅读(642) | 评论 (0)编辑 收藏

 

Java类型相关

类型名

大小

取值范围

byte

8 bits

-128127

short

16 bits

-32768~32767

int

32 bits

long

64 bits

float

32 bits

double

64 bits

Java常量

十进制不能以0打头(数字0除外)

十六进制必须以0x或者0X打头

八进制必须以0打头

长整型必须以L结尾

小数常量默认为double型,如果要将小数赋值给float变量,数字后面要加f

final关键字

final 标记的类不能被继承

final 变量是常量,不能改变

final 方法不能被子类重写

Java变量

1)当发生隐式类型转换时,目标类型取值范围要大于源类型取值范围

2)字符串可以使用加号同其它的数据类型相连而形成一个新的字符串

Example

System.out.println(‘a’+1);    输出的是98

System.out.println(“”+’a’+1); 输出的是”a1”

3局部变量一定要进行初始化

        编译的时候可能只是警告,但在使用时就会报错

Java运算

(1)       整数之间做除法时,只保留整数部分而舍弃小数部分。

(2)       养成这样的习惯:把x==3 写成 3==x

(3)       &&&的区别

&&称为短路表达式,意思就是&不管两边是true或者false都会算一下,而&&如果算到前面的是false,它后面就不算了,反正综合起来表达式肯定是false

(4)       位运算

<< 左移

>> 右移

   如果最高位是0,左边移空的高位就填0,如果最高位是1,左边移空的高位就填入1

>>> 无符号右移

   不管最高位是什么,移空的高位一律填入0

右移n位就是除以2n次方

左移n位就是乘以2n次方

Java内存

1Java内存分为两种:

栈内存:用于存放基本类型变量和对象的引用变量

堆内存new创建的对象和数组

2)当堆内存中的对象没有引用指向它时,它就变成了垃圾,会被垃圾回收器回收。

Java面向对象

1= =常用来比较引用是否指向同一个地址

     equals()用来比较对象的内容是否一样

     对于数组有Array.equals方法

2finalize()方法,它相当于C++中的析构函数,但又和析构函数不一样。因为Java里面已经有垃圾回收器了,所以finalize方法不是特别重要。另外,finalize是在对象被当成垃圾从内存中释放前调用,而不是在对象变成垃圾前调用,垃圾回收器什么时候清理垃圾是不定时的,所以不要指望用finalize做什么必要的收尾工作,因为你根本无法确定它会赶在垃圾回收器之前执行。

3System.gc()这个语句可以显式地调用垃圾回收器回收垃圾。

Java参数传递

(1)       基本类型的变量作为实参传递,并不能改变这个变量的值

举个例子,就是main函数里面定义的一个变量,传给一个方法,改下值,其实并没有改变main函数里面那个变量而是改了那个方法自己内部的那个副本。

(2)       那如果传递的是某个对象的引用呢?

道理一样,传递的是值,这个“值”就是引用的“值”,也就是对象的内存地址,方法通过这个地址对变量进行的修改,当然就是对main函数中定义的这个变量本身的修改了。

Java内部类

A类里面定义了B类,那么B就叫做内部类,A就叫做外部类。

B可以直接访问A类的所有变量和方法,反之不成立。

B类保存了A类的this引用。

内部类可以是static

如果内部类被声明为static,那么它可以包含static的变量,但不再能访问外部类的非static变量。

方法内定义的内部类,只能访问方法中的final变量,而不能访问临时变量,但可以访问外部类的变量。

Java异常

(1)       一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类

(2)       如果父类抛出多个异常,那么覆盖方法必须抛出那些异常的一个子集,也就是说,不能抛出新的异常。

Java线程

两种实现多线程方式

(1)       直接继承Thread

MyThread extends Thread

然后

MyThread t = new MyTread();

t.start();

t.start();

值得注意的是,无论调用start多少遍只能启动一个线程。

要实现多个线程,只能生成多个对象,分别启动线程,一个对象只能启动一个线程

(2)       实现Runnable接口

MyThread implements Runnalbe

然后

new Thread(t).start();

new Thread(t).start();

这种方法就能实现多个线程。

但这两种方法启动的多个线程又有不一样的地方:

第一种因为是生成了多个对象,所以类中声明的一些资源,比如变量等等都是各不相关的。

第二种对类中声明的资源是多个线程共享的。

所以要按需选择。

Java StringStringBuffer

String 对象不能轻易被改变,经常用的“+”其实是新生成了一个String对象,平常感觉不大,但是真的在大型应用中,对效率影响非常严重。

StringBuffer对象可以改动,一旦生成了不再变化的内容,就可以调用它的toString方法,把它转化为String对象。

posted @ 2007-10-10 10:51 离弦之ray的技术天空 阅读(629) | 评论 (1)编辑 收藏