weitom1982

向各位技术前辈学习,学习再学习.
posts - 299, comments - 79, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理



引子
  涡扇发动机是喷气发动机的一个分枝,从血原关系上来说涡扇发动机应该算得上是涡喷发动的小弟弟。从结构上看,涡扇发动机只不过是在涡喷发动机之前(之后)加装了风扇而 已。然而正是这区区的几页风扇把涡喷发动机与涡扇发动机严格的区分开来。涡扇发动机这个“小弟弟”仗着自已身上的几页风扇也青出与蓝。
  现代的军用战斗机要求越来越高的机动性能,较高的推重比能赋予战斗机很高的垂直机动能力和优异的水平加速性能。而且在战时,如果本方机场遭到了对方破坏,战斗机还可以利用大推力来减少飞机的起飞着陆距离。比如装备了F-100-PW-100的F-15A当已方机机的跑道遭到部分破坏时,F-15可以开全加力以不到300米的起飞滑跑距离起飞。在降落时可以用60度的迎角作低速平飞,在不用减速伞和反推力的情况下,只要500米的跑道就可以安全降落。
  更高的推重比是每一个战斗机飞行员所梦寐以求的。但战斗机的推重比在很大和度上是受发动机所限--如果飞机发动机的推重比小于6一级的话,其飞机的空战推重比就很难达到1,如果强行提高飞机的推重比的话所设计的飞机将在航程、武器挂载、机体强度上付出相当大的代价。比如前苏联设计的苏-11战斗机使用了推重比为4.085的АЛ-7Ф-1-100涡喷发动机。为了使飞机的推重比达到1,苏-11的动力装置重量占了飞机起飞重量的26.1%。相应的代价是飞机的作战半径只有300公里左右。

  而在民用客机、运输机和军用的轰炸机、运输机方面。随着新材料的运用飞机的机身结构作的越来越大,起飞重量也就越来越大,对发动机的推力要求也越来越高。在高函道比大推力的涡扇发动机出现之前,人们只能采用让大型飞机挂更多的发动机的方法来解决发动机的推力不足问题。比如B-52G轰炸机的翼下就挂了八台J-57-P-43W涡喷发动机。该发动机的单台最大起飞推力仅为6237公斤(喷水)。如果B-52晚几年出生的话它完全可以不挂那么多的发动机。在现在如果不考虑动力系统的可*性,像B-52之类的飞机只装一台发动机也未尝不可。
  而涡扇发动机的诞生就是为了顺应人们对航空发动机越来越高的推力要求而诞生的。因为提高喷气发动机的推力最简单的办法就是提高发动机的空气流量。

  一,历史
  在五十年代未、六十年代初,作为航空动力的涡喷发动机以经相当的成熟。当时的涡喷发动机的压气机总增压比以经可以达到14左右,而涡轮前的最高温度也以经达到了1000度的水平。在这样的条件下,涡喷发动机进行部分的能量输出以经有了可能。而当时对发动机的推力要求又是那样的迫切,人们很自然的想到了通过给涡喷发动机加装风扇以提高迎风面积增大空气流量进而提高发动机的推力。

  当时人们通过计算发现,以当时的涡喷发动的技术水平,在涡喷发动机加装了风扇变成了涡扇发动机之后,其技术性能将有很大的提高。当涡扇发动机的风扇空飞流量与核心发动机的空气流量大至相当时(函道比1:1),发动机的地面起飞推力增大了面分之四十左右,而高空巡航时的耗油量却下降了百分之十五,发动机的效率得到了极大的提高。
  这样的一种有着涡喷发动机无法比及的优点的新型航空动力理所当然的得到了西方各强国的极大重视。各国都投入了极大的人力、物力和热情来研究试制涡扇发动机,在涡扇发动机最初研制的道路上英国人走在了美国人之前。英国的罗尔斯·罗伊斯公司从一九四八年就开始就投入了相当的精力来研制他们的“康维”涡扇发动机。在一九五三年的时候“康维”进行了第一次的地面试车。又经过了六年的精雕细刻,一九五九年九月“康维MK-508”才最终定型。这个经过十一年孕妇的难产儿有着当时涡喷发动机难以望其项背的综合性能。“康维”采用了双转子前风扇的总体结构,函道比为0.3推重比为3.83地面台架最大推力为7945公斤,高空巡航推力为2905公斤,最大推力时的耗油量为0.735千克/小时/千克,压气机总增压比为14,风扇总增压比为1.90,而且英国人还在“康维”上首次采用了气冷的涡轮叶片。当康维最终定型了之后,英国人迫不及待的把他装在了VC-10上!

  美国人在涡扇发动机的研发上比英国人慢了一拍,但是其技术起点非常的高。美国人并没有走英国人从头研制的老路,美国的普·惠公司利用自已在涡喷发动机上的丰富的技术储备,采用了以经非常成熟的J-57作为新涡扇发动的内函核心发动机。J-57是美国人从1947年就开始设计的一种涡喷发动机,1949年完成设计,1953年正式投产。J57在投产阶段共生产了21226台是世界上产量最大的三种涡喷发动机之一,先后装备了F-100、F-101、F-102、B-52等机种。J-57在技术上也有所突破,他是世界上第一台采用双转子结构的喷气发动机,由单转子到双转子是喷气发动机技术上的一大进步。不光是核心发动机,就连风扇普惠公司也都是采用的以经相当成熟的部件,以被撤消了型号的J91核动力喷气发动机的长叶片被普惠公司拿来当作新涡扇的风扇。一九六零年七月,普惠公司的JT3D涡扇发动机诞生了。JT3D的最终定型时间比罗罗的康维只晚了几个月,可是在性能上却是大大的提高。JT3D也是采用了双轴前风扇的设计,地面台架最大推力8165公斤,高空巡航推力2038公斤,最大推力耗油0.535千克/小时/千克,推重比4.22,函道比1.37,压气机总增压比13.55,风扇总增压比1.74(以上数据为JT3D-3B型发动机的数据)。JT3D的用处很广,波音707、DC-8用的都是JT3D。不光在民用,在军用方面JT3D也大显身手,B-52H、C-141A、E-3A用的都是JT-3D的军用型TF-33。
  现今世界的三大航空动力巨子中的罗·罗、普·惠,都以先后推出了自已的第一代涡扇作品。而几乎是在同一时刻,三巨头中的令一个也推出了自已的第一代涡扇发动机。在罗·罗推出“康维”之后第八个月、普·惠推出JT-3D的前一个月。通用动力公司也定型了自已的第一代涡扇发动机CJ805-23。CJ805-23的地面台架最大推力为7169公斤,推重比为4.15,函道比为1.5,压气机增压比为13,风扇增压比为1.6,最大推力耗油0.558千克/小时/千克。与普·惠一样,通用动力公司也是在现有的涡喷发动机的基础之上研发自已的涡扇发动机,被用作新涡扇的内函核心发动机的是J79。J-79与1952年开始设计,与1956年投产,共生产了16500多台,他与J-57一样也是有史以来产量最高的三种涡喷发动机之一。与J57的双转子结构不不同,J79是单转子结构。在J-79上首次采用了压气机可调整流叶片和加力全程可调喷管,J-79也是首次可用于两倍音速飞行的航空发动机。

  通用动力公司的CJ805-23涡扇发动机是涡扇发动机的中一个决对另类的产品,让CJ805-23如此与众不同的地方就在于他的风扇位置。他是唯一采用后风扇设计的涡扇发动机。
  在五六十年代,人们在设计第一代涡扇发动机的时候遇到了很大的困难。首先是由于大直径的风扇与相对小直径的低压压气机联动以后风扇叶片的翼尖部分的线速度超过了音速,这个问题在当时很难解决,因为没有可利用的公式来进行运算人们只能用一次又一次的试验来发现、解决问题。第二是由于在压气机之前多了风扇使得压气机的工作被风扇所干拢。第三是细长的风扇叶片高速转动所引起的振动。

  而通用动力公司的后风扇设计一下子完全避开了这三个最主要的困难。CJ805-23的后风扇实际上是一个双节的叶片,叶片的下半部分是涡轮叶片,上半部分是风扇叶片。这样的一个叶片就像涡轴发动的自由涡轮一样被放在内函核心发动机的尾部。叶片与核心发动机的转子没有丝毫的机械联系,这样人们就可以随心所欲的来设计风扇的转速,而且叶片的后置也不会对压气机产生不良影响。但在回避困难的同时也引发了新的问题。
  首先是叶片的受热不匀,CJ805-23的后风扇叶片的涡轮部分在工作时的最高温度达到了560度,而风扇部分的最低温度只有38度。其次,由于后风扇不像前风扇那样工作在发动机的冷端,而是工作在发动机的热端,这样一来风扇的可*性也随之下降,而飞机对其动力的要求最重要的一条就是万无一失。而且风扇后置的设计使得发动机的由于形状上的原因其飞行阻力也要大于风扇前置的发动机。

  当“康维”、JT-3D、CJ805-23这些涡扇发动机纷纷定型下线的时候,人们也在不断的反思在涡扇发动机研制过程。人们发现,如果一台涡扇发动机如果真的像“康维”那样从一张白纸上开始试制则最少要用十年左右的时间新发动机才能定型投产。而如果像JT-3D或CJ805-23那样利用以有的一台涡喷发动机作为内函发动机来研制涡扇发动机的话,因为发动机在技术上最难解决的部分都以得到了解决,所以无论从时间上还是金钱、人力、物力上都要节省很多。在这样的背景之下,为了缩短新涡扇的研制时间、减少开发费用。美国政府在还末对未来的航空动力有十分明确的要求的情况下,从一九五九年起开始执行“先进涡轮燃气发生器计划”,这个计划的目地就是要利用最最新的科研成果来试制一种燃气核心机,并进行地面试车,以暴露解决各部分的问题。在这个燃气核心机的其础之上进行放大或缩小,再加装其它的部件,如压气机、风扇等等就可以组装成不同类型的航空涡轮发动机。如涡扇、涡喷、涡轴、涡桨等等。“先进涡轮燃气发生器计划”实际上是一个有相当前瞻意味的预研工程。
  用今天的眼光来看,这个工程的指导方向无疑是正确的。美国的政府实际上是在激励本国的两大动力公司向航空动力系统中最难的部分开刀。因为在燃气涡轮发动机中最最严重的技术难点就产生在这个以燃气发生器和燃气涡轮为主体的燃气核心机上。在每一台以高温燃气来驱动燃气涡轮为动力的发动机上,由燃气发生器和燃气涡轮所组成的燃气核心机的工作地点将是这台发动的最高温度、最大压力的所在地。所以其承受的应力也就最大,工作条件也最为苛刻。但燃气核心机的困难不只是压力和温度,高转数所带来的巨大的离心力、飞机在加速时的巨大冲击,如果是战斗机还要考虑到当飞机进行机动时所产生的过载和因过载以引起的零部件变形。在为数众多的困难中单拿出无论哪一个都将是一个工程上的巨大难题。但如果这些问题不被解决掉那么更先进的喷气发动机也就无从谈起。

  在这个计划之下,普惠公司与通用动力公司都很快的推出了各自研发的燃气核心机。普惠公司的核心机被称作STF-200而通用动力公司的燃气核心机为GE-1。时至今日美国人在四十年前发起的这场预研还在发挥着他的作用,现如今普惠公司和通用动力公司出品的各式航空发动机如果真的都求其根源都话,它们却都是来自于STF-200与GE-1这两个老祖宗。
  二、单转子和多转子

  在研制一台新的涡扇发动机的时候,最先解决的问题是他的总体结构问题。总体结构的问题说明白一些就是发动机的转子数目多少。目前涡扇发动机所采用的总体结构无非是三种,一是单转子、二是双子、三是三转子。其中单转子的结构最为简单,整个发动机只有一根轴,风扇、压气机、涡轮全都在这一根轴上。结构简单的好处也不言自明--省钱!一方面的节省就总要在另一方而复出相应的代价。
  首先从理论上来说单转子结构的涡扇发动机的压气机可以作成任意多的级数以期达到一定的增压比。可是因为单转子的结构限制使其风扇、低压压气机、高压压气机、低压涡轮、高压涡轮必须都安装在同一根主轴之上,这样在工作时他们就必须要保持相同的转速。问题也就相对而出,当单转子的发动机在工作时其转数突然下降时(比如猛收小油门),压气机的高压部分就会因为得不到足够的转数而效率严重下降,在高压部分的效率下降的同时,压气机低压部分的载荷就会急剧上升,当低压压气机部分超载运行时就会引起发动机的振喘,而在正常的飞行当中,发动机的振喘是决对不被允许的,因为在正常的飞行中发动机一但发生振喘飞机十有八九就会掉下来。为了解决低压部分在工作中的过载只好在压气机前加装导流叶片和在压气机的中间级上进行放气,即空放掉一部分以经被增压的空气来减少压气机低压部分的载荷。但这样以来发动机的效率就会大打折扣,而且这种放掉增压气的作法在高增压比的压气机上的作用也不是十分的明显。更要命的问题发生在风扇上,由于风扇必须和压气机同步,受压气机的高转数所限单转子涡扇发动机只能选用比较小的函道比。比如在幻影-2000上用的M-53单转子涡扇发动机,其函道只有0.3。相应的发动机的推重比也比较小,只有5.8。

  为了提高压气机的工作效率和减少发动机在工作中的振喘,人们想到了用双转子来解决问题,即让发动机的低压压气机和高压压气机工作在不同的转速之下。这样低压压气机与低压涡轮联动形成了低压转子,高压压气机与高压涡轮联动形成了高压转子。低压转子的转速可以相对低一些。因为压缩作用在压气机内的空气温度升高,而音速是随着空气温度的升高而升高的,所以而高压转子的转速可以设计的相对高一些。即然转速提高了,高压转子的直径就可以作的小一些,这样在双转子的喷气发动机上就形成了一个“蜂腰”,而发动机的一些附属设备比如燃油调节器、起动装置等等就可以很便的装在这个“蜂腰”的位置上,以减少发动机的迎风面积降低飞行阻力。双转子发动机的好处不光这些,由于一般来说双转子发动机的的高压转子的重量比较轻,起动惯性小,所以人们在设计双转子发动机的时候都只把高压转子设计成用启动机来驱动,这样和单转子发动机相比双转子的启动也比较容易,启动的能量也要求较小,启动设备的重量也就相对降低。
  然而双转子结构的涡扇发动机也并不是完美的。在双转子结构的涡扇发动机上,由于风扇要和低压压气机联动,风扇和低压压气机就必须要互相将就一下对方。风扇为将就压气机而必需提高转数,这样直径相对比较大的风扇所承受的离心力和叶尖速度也就要大,巨大的离心力就要求风扇的重量不能太大,在风扇的重量不能太大的情况下风扇的叶片长度也就不能太长,风扇的直径小下来了,函道比自然也上不去,而实践证明函道比越高的发动机推力也就越大,而且也相对省油。而低压压气机为了将就风扇也不得不降低转数,降低了压气机的转数压气机的工作效率自然也就上不去,单级增压比降低的后果是不得不增加压气机风扇的级数来保持一定的总增压比。这样压气机的重量就很难得以下降。

  为了解压气机和风扇转数上的矛盾。人们很自然的想到了三转子结构,所谓三转子就是在二转子发动机上又了多了一级风扇转子。这样风扇、高压压气机和低压压气机都自成一个转子,各自都有各自的转速。三个转子之间没有相对固定的机械联接。如此一来,风扇和低压转子就不用相互的将就行事,而是可以各自在最为合试的转速上运转。设计师们就可以相对自由的来设计发动机风扇转速、风扇直径以及函道比。而低压压气机的转速也可以不受风扇的肘制,低压压气机的转速提高之后压气的的效率提高、级数减少、重量减轻,发动机的长度又可以进一步缩小。
  但和双转子发动机相比,三转子结构的发动机的结构进一步变的复杂。三转子发动机有三个相互套在一起的共轴转子,因而所需要的轴承支点几乎比双转子结构的发动机多了一倍,而且支撑结构也更加的复杂,轴承的润滑和压气机之间的密闭也更困难。三转子发动机比双转子发动机多了很多工程上的难题,可是英国的罗·罗公司还是对他情有独钟,因为在表面的困难背后还有着巨大的好处,罗罗公司的RB-211上用的就是三转子结构。转子数量上的增加换来了风扇、压气机、涡轮的简化。

  三转子RB-211与同一技术时期推力同级的双转子的JT-9D相比:JT-9D的风扇页片有46片,而RB-211只有33片;压气机、涡轮的总级数JT-9D有22级,而RB-211只有19级;压气机叶片JT-9D有1486片,RB-211只有826片;涡轮转子叶片RB211也要比JT9D少,前者是522片,而后者多达708片;但从支撑轴承上看,RB-211有八个轴承支撑点,而JT9D只有四个.







  三、风扇
  涡扇发动机的外函推力完全来自于风扇所产生的推力,风扇的的好坏直接的影响到发动机的性能,这一点在高函道比的涡扇发动机上由是。涡扇发动机的风扇发展也经历了几个过程。在涡扇发动机之初,由于受内函核心机功率和风扇材料的机械强度的限制,涡扇发动机的函道比不可能作的很大,比如在涡扇发动机的三鼻祖中,其函道比最大的CJ805-23也不过只有1.5而以,而且CJ805-23所采用的风扇还是后独一无二的后风扇。

  在前风扇设计的二款发动机中JT3D的函道比大一些达到了1.37。达到如此的函道比,其空气总流量比也比其原型J-57的空气流量大了271%。空气流量的加大发动机的迎风面积也随之变大。风扇的叶片也要作的很长。JT3D的一级风扇的叶片长度为418.2毫米。而J57上的最长的压气机叶片也就大约有二百毫米左右。当风扇叶片变的细长之后,其弯曲、扭转应力加大,在工作中振动的问题也突现了出来。为了解决细长的风扇叶片所带来的麻烦,普惠公司采用了阻尼凸台的方法来减少风扇叶片所带来的振动。凸台位于距风扇叶片根处大约百分之六十五的地方。JT3D发动机的风扇部分装配完成之后,其风扇叶上的凸台就会在叶片上连成一个环形的箍。当风扇叶片运转时,凸台与凸台之间就会产生摩擦阻尼以减少叶片的振动。加装阻尼凸台之后其减振效果是明显的,但其阻尼凸台的缺点也是明显的。首先他增加了叶片的重量,其次他降底了风扇叶片的效率。而且如果设计不当的话当空气高速的流过这个凸台时会发生畸变,气流的畸变会引发叶片产生更大的振动。而且如果采用这种方法由于叶片的质量变大,在发动机运转时风扇本身会产生更大的离心力。这样的风扇叶片很难作的更长,没有更长的叶片也就不会有更高的函道比。而且细长的风扇叶片的机械强度也很低,在飞机起飞着陆过程中,发动机一但吸入了外来物,比如飞鸟之类,风扇的叶片会更容易被损坏,在高速转动中折断的风扇叶片会像子弹一样打穿外函机匣酿成大祸。解决风扇难题一个比较完美的办法是加大风扇叶片的宽度和厚度。这样叶片就可以获得更大的强度以减少振动和外来物打击的损害,而且如果振动被减少到一定程度的话阻尼凸台也可以取消。但更厚重的扇叶其运转时的离心力也将是巨大的。这样就必需要加强扇叶和根部和安装扇叶的轮盘。但航空发动机负不起这样的重量代价。风扇叶片的难题大大的限制了涡扇发动机的发展。
  更高的转数、高大的机械强度、更长的叶片、更轻的重量这样的一个多难的问题最终在八十年代初得到了解决。

  1984年10月,RB211-535E4挂在波音七五七的翼下投入了使用。它是一台有着跨时代意义的涡扇发动机。让它身负如此之名的就是他的风扇。罗·罗公司用了创造性的方法解决了困扰大函道比涡扇发动机风扇的多难问题。新型发动机的风扇叶片叫作“宽弦无凸肩空心夹层结构叶片”。故名思意,新型风扇的叶片采用了宽弦的形状来加大机械强度和空心结构以减少重量。新型的空心叶片分成三个部分:叶盆、叶背、和叶芯。它的叶盆和叶背分别是由两块钛合金薄板制成,在两块薄板之间是同样用钛合金作成的蜂窝状结构的“芯”。通过活性扩散焊接的方法将叶盆、叶背、叶芯连成一体。新叶片以极轻的重量获得了极大的强度。这样的一块钛合金三明治一下子解决了困扰航空动力工业几十年的大难题。
  新型风扇不光是重量轻、强度大,而且因为他取消了传统细长叶片上的阻尼凸台他的工作效率也要更高一些。风扇扇叶的数量也减少了将近三分之一,RB211-535E4发动机的风扇扇叶只有二十四片。

  1991年7月15日新型宽弦叶片经受了一次重大的考验。印度航空公司的一架A320在起飞阶段其装备了宽弦叶片的V-2500涡扇发动机吸入了一只5.44千克重的印度秃鹫!巨鸟以差不多三百公里的时速迎头撞到了发动机的最前端部件--风扇上!可是发动机在遭到如此重创之后仍在正常工作,飞机安全的降落了。在降落之后,人们发现V-2500的22片宽弦风扇中只有6片被巨大的冲击力打变了形,没有一片叶片发生折断。发动机只在外场进行了更换叶片之后就又重新投入了使用。这次意外的撞击证明了“宽弦无凸肩空心夹层结构叶片”的巨大成功。
  解决宽弦风扇的问题并不是只有空心结构这一招。实际上,当风扇的直径进一步加大时,空心结构的风扇扇叶也会超重。比如在波音777上使用的GE-90涡扇发动机,其风扇的直径高达3.142米。即使是空心蜂窝结构的钛合金叶片也会力不从心。于是通用动力公司便使用先进的增强环氧树脂碳纤维复合材料来制造巨型的风扇扇叶。碳纤维复合材料所制成的风扇扇叶结构重量极轻,而强度却是极大。可是在当复合材料制成的风扇在运转时遭到特大鸟的撞击会发生脱层现像。为了进一步的增大GE-90的安全系数,通用动力公司又在风扇的前缘上包覆了一层钛合金的蒙皮,在其后缘上又用“凯夫拉”进行缝合加固。如此以来GE-90的风扇可谓万无一失。

  当高函道比涡扇发动机的风扇从传统的细长窄弦叶片向宽弦叶片过渡的时候,风扇的级数也经历了一场从多级风扇到单级风扇的过渡。在涡扇发动机诞生之初,由于风扇的单级增压比比较低只能采用多级串联的方式来提高风扇的总增压比。比如JT3D的风扇就为两级,其平均单级增压比为1.32,通过两级串联其风扇总增压比达到了1.74。多级风扇与单级风扇相比几乎没有优点,它重量大、效率低,其实它是在涡扇发动机的技主还不十分成熟的时候一种无耐的选择。随着风扇单级增压比的一步步提高,现如今在中、高函道比的涡扇发动机上单级风扇以是一统天下。比如在GE-90上使用的单级风扇其增压比高达1.65,如此之高的单级增压比以经再没有必要来串接第二级风扇。
  但是在战斗机上使用的低函道比涡扇发动机还在使用着多级风级的结构。比如在F-15A上使用的F100-PW-100涡扇发动机就是由三级构成,其总增压比达到了2.95。低函道涡扇发动机取如此高的风扇增压比其实是风扇、低压压气机合二为一结果。在战斗机上使用的低函道比涡扇发动机为了减少重量它的双转子其实是由风扇转子和压气机转子组成的双转子结构。受战斗机的机内容积所限,采用大空气流量的高函道比涡扇发动机是不现实的,但为了提高推力只能提发动机的出口压力,再者风扇不光要提供全部的外函推力而且还要部分的承担压气机的任务,所以风扇只能采用比较高的增压比。

  其实低函道比的涡扇发动机彩用多级风扇也是一种无耐之举,如果风扇的单级增压比能达到3左右多级风扇的结构就将不会再出现。如果想要风扇的单级增压比达到3一级只能是进一步提高风扇的的转速并在风扇的叶型上作文章,风扇的叶片除了要使用宽弦叶片之外叶片还要带有一定的后掠角度以克服风扇在高速旋转时所产生的激波,只有这样3一级的单级风扇增压比才可能会实现。相现这一点人们将会在二十年之内作到.
 四、压气机
  压气机故名思意,就是用来压缩空气的一种机械。在喷气发动机上所使用的压气机按其结构和工作原理可以分为两大类,一类是离心式压气机,一类是轴流式压气机。离必式压气机的外形就像是一个钝角的扁圆锥体。在这个圆锥体上有数条螺旋形的叶片,当压气机的圆盘运转时,空气就会被螺旋形的叶片“抓住”,在高速旋转所带来的巨大离心力之下,空气就会被甩进压气机圆盘与压气机机匣之间的空隙,从而实现空气的增压。与离心式压气机不同,轴流式压气机是由多级风扇所构成的,其每一级都会产生一定的增压比,各级风扇的增压比相乘就是压气机的总增压比。

  在现代涡扇发动机上的压气机大多是轴流式压气机,轴流式压气机有着体积小、流量大、单位效率高的优点,但在一些场合之下离心式压气机也还有用武之地,离心式压气机虽然效率比较差,而且重量大,但离心式压气机的工作比较稳定、结构简单而且单级增压比也比轴流式压气机要高数倍。比如在我国台湾的IDF上用的双转子结构的TFE1042-70涡扇发动机上,其高压压气机就采用了四级轴流式与一级离心式的组合式压气机以减少压气机的级数。多说一句,这样的组合式压气机在涡扇发动机上用的不多,但在直升机上所使用的涡轴发动机现在一般都为几级轴流式加一级离心式的组合结构。比如国产的涡轴6、 涡轴8发动机就是1级轴流式加1级离心式构成的组合压气机。而美国的“黑鹰”直升机上的T700发动机其压气机为5级轴流式加上1级离心式。
  压气机是涡扇发动机上比较核心的一个部件。在涡扇发动机上采用双转子结构很大程度上就是为了迎合压气机的需要。压气机的效率高低直接的影响了发动机的工作效率。目前人们的目标是提高压气机的单级增压比。比如在J-79上用的压气机风扇有17级之多,平均单级增压比为1.16,这样17级叶片的总增压比大约为12.5左右,而用在波音777上的GE-90的压气机的平均单级增压比以提高到了1.36,这样只要十级增压叶片总增压比就可以达到23左右。而F-22的动力F-119发动机的压气机更是了的,3级风扇和6级高压压气机的总增压比就达到了25左右,平均单级增压比为1.43。平均单级增压比的提高对减少压气机的级数、减少发动机的总量、缩短发动机的总长度是大有好处的。

  但随着压气机的增压比越来越高,压气机振喘和压气机防热的问题也就突现了出来。
  在压气机中,空气在得到增压的同时,其温度也在上升。比如当飞机在地面起飞压气机的增压比达到25左右时,压气机的出口温度就会超过500度。而在战斗机所用的低函道比涡扇发动机中,在中低空飞行中由于冲压作用,其温度还会提高。而当压气机的总增压比达到30左右时,压气机的出口温度会达到600度左右。如此高的温度会钛合金以是难当重任,只能由耐高温的镍基合金取而代之,可是镍基合金与钛合金相比基重量太大。与是人们又开发了新型的耐高温钛合金。在波音747的动力之一罗·罗公司的遄达800与EF2000的动力EJ200上就使用了全钛合金压气机。其转子重量要比使用镍基合金减重30%左右。

  与压气机防热的问题相比压气机振喘的问题要难办一些。振喘是发动机的一种不正常的工作状态,他是由压气机内的空气流量、流速、压力的空然变化而引发的。比如在当飞机进行加速、减速时,当飞发动机吞水、吞冰时,或当战斗机在突然以大攻飞行拉起进气道受到屏蔽进气量骤减时。都极有可能引起发动机的振喘。
  在涡扇喷气发动机之初,人们就采用了在各级压气机前和风扇前加装整流叶片的方法来减少上一级压气机因绞动空气所带给下一级压气机的不利影响,以克制振喘现像的发生。而且在J-79涡喷发动机上人们还首次实现了整流叶片的可调整。可调整的整流叶片可以让发动机在更加宽广的飞行包线内正常工作。可是随着风扇、压气机的增压比一步一步的提高光是采用整流叶片的方法以是行不通了。对于风扇人们使用了宽弦风扇解决了在更广的工作范围内稳定工作的问题,而且采用了宽弦风扇之后即使去掉风扇前的整流叶片风扇也会稳定的工作。比如在F-15上的F100-PW-100其风扇前就采用了整流叶片,而F-22的F-119就由于采用了三级宽弦风扇所以风扇前也就没有了整流叶片,这样发动机的重量得以减轻,而且由于风扇前少了一层屏蔽其效率也就自然而然的提高了。风扇的问题解决了可是压气的问题还在,而且似乎比风扇的问题材更难办。因为多级的压气机都是装在一根轴上的,在工作时它的转数也是相同的。如果各级压气机在工作的时候都有自已合理的工作转数,振喘的问题也就解决了。可是到现在为止还没有听说什么国家在集中国力来研究十几、二十几转子的涡扇发动机。

  在万般的无耐之后人们能回到老路上来--放气!放气是一种最简单但也最无可耐何的防振喘的方法。在很多现代化的发动上人们都保留的放气活门以备不时之须。比如在波音747的动力JT9D上,普·惠公司就分别在十五级的高、低压气机中的第4、9、15级上保留了三个放气活门


五、燃烧室与涡轮
  涡扇发动机的燃烧室也就是我们上面所提到过的“燃气发生器”。经过压气机压缩后的高压空气与燃料混合之后将在燃烧室中燃烧以产生高温高压燃气来推动燃气涡轮的运转。在喷气发动机上最常用的燃烧室有两种,一种叫作环管形燃烧室,一种叫作环形燃烧室。

  环管燃烧室是由数个火焰筒围成一圈所组成,在火焰筒与火焰筒之间有传焰管相连以保证各火焰筒的出口燃气压力大至相等。可是既使是如此各各火焰筒之内的燃气压力也还是不能完全相等,但各火焰筒内的微小燃气压力还不足以为患。但在各各火焰筒的出口处由于相邻的两个火焰筒所喷出的燃气会发生重叠,所以在各火焰筒的出口相邻处的温度要比别处的温度高。火焰筒的出口温度场的温度差异会给涡轮前部的燃气导向器带来一定的损害,温度高的部分会加速被烧蚀。比如在使用了8个火焰筒的环管燃烧室的JT3D上,在火焰筒尾焰重叠处其燃气导流叶片的寿命只有正常叶片的三分之一。
  与环管式燃烧室相比,环形燃烧室就没有这样的缺点。故名思意,与管环燃烧室不同,环形燃烧室的形状就像是一个同心圆,压缩空气与燃油在圆环中组织燃烧。由于环形燃烧室不像环管燃烧室那样是由多个火焰筒所组成,环形燃烧室的燃烧室是一个整体,因此环形燃烧室的出口燃气场的温度要比环管形燃烧室的温度均匀,而且环形燃烧室所需的燃油喷嘴也要比环管燃烧室的要少一些。均匀的温度场对直接承受高温燃气的燃气导流叶片的整体寿命是有好处的。

  与环管燃烧室相比,环形燃烧室的优点还不止是这些。
  由于燃烧室中的温度很高,所以无论环管燃烧室还是环形燃烧室都要进行一定的冷却,以保证燃烧室能更稳定的进行工作。单纯的吹风冷却早以不能适应极高的燃烧室温度。现在人们在燃烧室中最普便使用的冷却方法是全气膜冷却,即在燃烧室内壁与燃烧室内部的高温燃气之间组织起一层由较冷空气所形成的气膜来保护燃烧室的内壁。由于要形成气膜,所以就要从燃烧室壁上的孔隙中向燃烧室内喷入一定量的冷空气,所以燃烧室壁被作的很复杂,上面的开有成千上万用真空电子束打出的冷却气孔。现在大家只要通过简单的计算就可以得知,在有着相同的燃烧室容积的情况下,环形燃烧室的受热面积要比环管燃烧室的受热面积小的多。因此环形燃烧的冷却要比环管形燃烧室的冷却容易的多。在除了冷却比较容易之处,环形燃烧室的体积、重量、燃油油路设计等等与环管燃烧室相比也着优势。

  但与环管燃烧室相比,环形燃烧室也有着一些不足,但这些不足不是性能上的而是制作工艺上。
  首先,是环形燃烧室的强度问题。在环管燃烧室上使用的是单个体积较小的火焰筒,而环形燃烧室使用的是单个体积较大的圆环形燃烧室。随着承受高温、高压的燃烧室的直径的增大,环形燃烧室的结构强度是一大难点。

  其次,由于燃烧室的工作整体环境很复杂,所以现在人们还不可能完全用计算的方法来发现、解决燃烧室所面临的问题。要暴露和解决问题进行大量的实验是唯一的方法。在环管燃烧室上,由于单个火焰筒的体积和在正常工作时所需要的空气流量较少,人们可以进行单个的火焰筒实验。而环形燃烧室是一个大直径的整体,在工作时所需要的空气流量也比较大,所以进行实验有一定的难度。在五六十年代人们进行环行燃烧室的实验时,由于没有足够的条件只能进行环形燃烧室部分扇面的实验,这种实验不可能得到燃烧室的整体数据。
  但由于科技的进步,环形燃烧室的机械强度与调试问题在现如今都以经得到了比较圆满的解决。由于环形燃烧室固有的优点,在八十年代之后研发的新型涡扇发动机之上几忽使用的都是环形燃烧室。

  为了更能说明两种不同的燃烧室的性能差异,现在我们就以同为普·惠公司所出品的使用环管形燃烧室的第一代涡扇发动机JT3D与使用了环形燃烧室的第二代涡扇发动机JT9D来作一个比较。两种涡扇发动同为双转子前风扇无加力设计,不过推力差异比较大,JT3D是8吨级推力的中推发动机,而JT9D-59A的推力高达24042公斤,但这样的差异并不妨碍我们对它们的燃烧室作性能上的比较。首先是两种燃烧室的几何形状,JT9D-3A的直径和长度分别为965毫米和627毫米,而JT3D-3B的直径是1020.5毫米、长度是1070毫米。很明显,JT9D的环形燃烧室要比JT-3D的环管燃烧室的体积小。JT9D-3A只有20个燃油喷嘴,而JT3D-3B的燃油喷嘴多达48个。燃烧效率JT3D-3B为0.97而JT9D-3A比他要高两个百分点。JT3D-3B八个火焰筒的总表面积为3.579平方米,而JT9D-3A的火焰筒表面积只有2.282平方米,火焰筒表面积的缩小使得火焰筒的冷却结构可以作到简单、高效,因此JT9D的火焰筒壁温度得以下降。JT3D-3B的火焰筒壁温度为700-900度左右,而JT9D-3A的火焰筒壁温度只有600到850度左右。JT9D的火焰筒壁温度没有JT3D-3B的高,可是JT9D-3A的燃烧室出口温度却高达1150度,而JT3D-3B的燃烧室出口温度却只有943度。以上所列出的几条足以能说明与环管燃烧室相比环形燃烧室有着巨大的性能优势。
  在燃烧室中产生的高温高压燃气道先要经过一道燃气导向叶片,高温高压燃气在经过燃气导向叶片时会被整流,并被赋予一定的角度以更有效率的来冲击涡轮叶片。其目地就是为了推动涡轮,各级涡轮会带动风扇和压气机作功。在涡扇发动机中,涡轮叶片和燃气导向叶片将要直接的承受高温高压燃气的冲刷。普通的金属材料跟本无法承受如此刻克的工作环境。因此燃气导向叶片和涡轮叶片还有联接涡轮叶片的涡轮盘都必需是极耐高温的合金材料。没有深厚的基础科学研究,高性能的涡轮研制也就无从谈起。现今有实力来研制高性能涡轮的国家都无不把先进的涡轮盘和涡轮叶片的材料配方和制作工艺当作是最高极密。也正是这个小小的涡轮减缓了一些国家成为航空大国的步伐。

  众所周知,提高涡轮进口温度是提高涡扇发动机推力的有效途径,所以在军用涡扇发动机上,人们都在不遗余力的来提高涡轮的进口涡度以使发动机用更小的体积和重量来产生更大的推力。苏27的动力AL-37F涡扇发动机的涡轮进口温度以高达1427度(应该是K而不是摄氏度!),而F-22的运力F-119涡扇发动机其涡轮前进口温度更是达到了1700度(应该是K而不是摄氏度!)的水平。在很多文章上提到如果要想达到更高的涡轮口进气温度,在现今陶瓷涡轮还未达到真正实际应用水平的情况下,只能采用更高性能的耐高温合金。其实这是不切确的。提高涡轮的进口温度并非只有采用更加耐高温的材料这一种途径。早在涡扇发动机诞生之初,人们就想到了用涂层的办法来提高涡轮叶片的耐烧上涂一层耐烧蚀的表面涂层来延长涡轮叶片的使用寿命。在JT3D的涡轮叶片上普惠公司就用扩散渗透法在涡轮叶片上“镀”上一层铝、硅涂层。这种扩散渗透法与我们日常应用的手工钢锯条的渗碳工艺有点类似。经过了扩散渗透铝、硅的JT3D一级涡轮叶片其理论工作寿命高达15900小时。
  当涡轮工作温度进一步升高之后,固体渗透也开始不能满足越来越高的耐烧蚀要求。首先是固体渗透法所产生的涂层不能保证其涂层的均匀,其次是用固体渗透法得出的涂层容易脱落,其三经过固体渗透之后得出的成品由于涂层不匀会产生一定的不规则变形(一般来说经过渗透法加工的零件其外形尺寸都有细小的放大)。

  针对固体渗透法的这些不足,人们又开发了气体渗透法。所谓气体渗透就是用金属蒸气来对叶片进行“蒸煮”在“蒸煮”的过程中各种合金成分会渗透到叶片的表层当中去和叶片表层紧密结合并改变叶片表层的金属结晶结构。和固体渗透法相比,气体渗透法所得到的涂层质量有了很大提高,其被渗透层可以作的极均匀。但气体渗透法的工艺过程要相对复杂很多,实现起来也比较的不容易。但在对涡轮叶片的耐热蚀要求越来越高的情况下,人们还是选择了比较复杂的气体渗透法,现如今的涡轮风扇中的涡轮叶片大都经过气体渗透来加强其表面的耐烧蚀。
  除了涂层之外,人们还要用较冷的空气来对涡轮叶片进行一定的冷却,空心气冷叶片也就随之诞生了。最早的涡扇发动机--英国罗·罗公司的维康就使用了空心气冷叶片。与燃烧室相比因为涡轮是转动部件,因此涡轮的气冷也就要比燃烧室的空气冷却要复杂的多的多。除了在燃烧室中使用的气薄冷却之外在涡轮的燃气导向叶片和涡轮叶片上大多还使用了对流冷却和空气冲击冷却。

  对流冷却就是在空心叶片中不停有冷却气在叶片中流动以带走叶片上的热量。冲击冷却其实是一种被加强了的对流冷却,即是一股或多股高速冷却气强行喷射在要求被冷却的表面。冲击冷却一般都是用在燃气导向叶片和涡轮叶片的前缘上,由空心叶片的内部向叶片的前缘喷射冷却气体以强行降温。冲击冷却后的气体会从燃气导向叶片和涡轮叶片前缘上的的孔、隙中流出在燃气的带动下在叶片的表面形成冷却气薄。但开在叶片前缘上使冷却气流出的孔、隙会让叶片更加难以制造,而且开在叶片前缘上的孔隙还会使应力极中,对叶片的寿命产生负面影响。可是由于气薄冷却要比对流冷却的效果好上很多,所以人们还是要不惜代价的在叶片上采用气薄冷却。
  从某种意义上来说,在燃气导向叶片和涡轮叶片上使用更科学理合理的冷却方法可能要比开发更先进的耐高温合金更重要一些。因为空心冷却要比开发新合金投资更少,见效更快。现在涡轮进口温度的提升其一半左右的功劳要归功于冷却技术的提高。现如今在各式涡扇发动机的涡轮前进口温度中要有200度到350度的温度被叶片冷却技术所消化,所以说涡轮工作温度的提高叶片冷却技术功不可没。

  其实在很多军事爱好者的眼中,涡轮的问题似乎只是一个耐高温材料的问题。其实涡轮问题由于其工作环境的特殊性它的难点不只是在高温上。比如,由于涡轮叶片和涡轮机匣在高温工作时由于热涨冷缩会产生一定的变形,由这些变形所引起的涡轮叶片与机匣径向间隙过大的问题,径向间隙的变大会引起燃气泄露而级大的降底涡轮效率。还有薄薄的涡轮机匣在高温工作时产生的扭曲变形;低压涡轮所要求的大功率与低转数的矛盾;提高单级涡轮载荷后涡轮叶片的根部强度等等。除了这些设计上的难题之外,更大的难题则在于涡轮部件的加工工艺。比如进行涡轮盘粉末合金铸造时的杂质控制、涡轮盘进行机器加工时的轴向进给力的控制、对涡轮盘加工的高精度要求、涡轮叶片合金精密铸造时的偏析、涡轮叶片在表面渗透加工中的变形等等,这里面的每一个问题解决不好都不可能生产出高质量、高热效率的涡轮部件。
  六、喷管与加力

  尾喷管是涡扇发动机的最末端,流经风扇、压气机、燃烧室、涡轮的空气只有通过喷管排出了发动机之外才能产生真正的推力以推动飞机飞行。
  涡扇发动机的排气有二部分,一部分是外函排气,一部分是内函排气。所以相应的涡扇发动机的排气方式也就分成了二种,一种是内外函的分开排气,一种是内外函的混合排气。两种排气方式各有优劣,所以在现代涡扇发动机上两种排气方式都有使用。总的来说,在高函道比的涡扇发动机上大多采有内外函分开排气,在低函道比的战斗机涡扇发动机上都采用混合排气的方式,而在中函道比的涡扇发动机上两种排气方式都有较多的使用。

  对于涡扇发动机来说,函道比越高的发动机其用油也就更省推力也更大。其原因就是内函核心发动机把比较多的能量传递给了外函风扇。在混合排气的涡扇发动机中,内函较热的排气会给外函较冷的排气加温,进一步的用气动--热力过程把能量传递给外函排气。所以从理论上来说,内外函的混合排气会提高推进效率使燃油消耗进一步降低,而且在实际上由于混合排气可以降底内函较高排气速度,所以在当飞机起降时还可以降低发动机的排气噪音。可是在实际操作的过程中,高函道的涡扇发动机几乎没有使用混合排气的例子,一般都采用可以节省重量的短外函排气。
  进行内外函的混合排气到目前为止只有两种方法一种是使用排气混合器,一种是使用长外函道进行内外函排气的混合。在使用排气混合器时,发动机会增加一部分排气混合器的重量,而且由于排气要经过排气混合器所以发动机的排气会产生一部分总压损失,这两点不足完全可以抵消掉混合排气所带来的好处。而长外函排气除了要付出重量的代价之外其排气的混合也不是十分的均匀。所以除了在战斗机上因结构要求而采用外则很少有采用。

  在战斗机上除了有长外函进行内外函空气混合之外一般都还装有加力装置来提高发动机的最大可用推力。
  所谓加力就是在内函排气和外函排气中再喷入一定数量的燃油进行燃烧,以燃油的损失来换取短时间的大推力。到目前为此只有在军用飞机和极少数要求超音速飞行的民用飞机上使用了加力。由于各种飞机的使命不同对加力燃料的要求也是不同的。比如对于纯粹的截击战斗机如米格25来说,在进行战斗起飞时,其起飞、爬升、奔向战区、空战等等都要求发动机用最大的推力来驱动飞机。其战斗起飞时使用加力的时间差不多达到了整个飞行时间的百分之五十。而对于F-15之类的空优战斗机来说在作战起飞时只有在起飞和进行空中格斗时使用加力,因此其加力的使用使时长只占其飞行时间的10%不到。而在执行纯粹的对地攻击任务时其飞机要求时用加力的时间连百分之一都不到,所以在强击机上干脆就不安装加力装置以减少发动机的重量和长度。

  加力燃烧是提高发动机推重比的一个重要手段。现在我们所说的战斗机发动机的推重比都是按照加力推力来计算的。如果不按照加力推力来计算F-100-PW-100的推重比只有4.79连5都没有达到!为了提高发动机的最大推力,人们现在一般都在采用内外函排气同时参与加力燃烧的混合加力。
  但当加力燃烧在大幅度的提高发动机的推力的时候,所负出的代价就是燃油的高消耗。还是以F-100-PW-100为例其在全加力时的推力要比无加力时的最大推力高66%可是加力的燃油消耗却是无加力时的281%。这样高的燃油消耗在起飞和进行空中格斗时还可以少少的使用一下,如要进行长时间的超音速飞行的话飞机的作战半径将大大缩短。

  针对涡扇发动机高速性能的不足,人们又提出了变循环方案和外函加力方案。所谓变循环就是涡扇发动机的函道比在一定的范围内可调。比如与F-119竞争F-22动力的YF-120发动机就是一种变循环涡扇发动机。他的函道比可以0-0.25之间可调。这样就可以在要求高航速的时候把函道比缩至最小,使涡扇发动机变为高速性能好的涡喷发动机。但由于变循环发动机技术复杂,要增加一部分重量,而且费用高、维护不便,于是YF-120败与F-119手下。
  由于混合加力要求内外函排气都参与加力燃烧,这样所需要的燃油也较多,于是人们又想到了内外函分开排气,只使用外函排气参加加力燃料的方案。但外函排气的温度比较低,所以组织燃烧相对的困难。目前只有少数使用,通常是要求长时间开加力的发动机才会采用这种结构。

posted @ 2007-04-27 10:00 高山流水 阅读(359) | 评论 (0)编辑 收藏

 
07:22起床

研究人体生物钟的专家指出,我们的生物钟会在每天睡眠7到8个小时后自动叫醒我们。但是,英国威斯敏斯特大学的研究者们发现,无论前一天晚上几点上床睡觉,第二天早上5点22分到7点21分之间起床的人,血液中的压力荷尔蒙都会比其他人高,这种荷尔蒙能够使人们感受到更多的压力,而这些压力有可能引发心脏病发作,所以选择7点22分起床是比较好的。

07:23喝水

一口气喝下一杯水,摆脱夜间脱水状况。适当饮水是非常关键的,一个人每天应该至少喝八杯水,这样可以帮助你的肾脏以最佳状态工作。

07:30晒太阳

拉开窗帘,打开窗户,将身体暴露在自然光线下,这样可以重设自己的生理周期,也就是我们的生物钟。

光线的刺激能够导致人体褪黑激素水平的降低,正是这种激素促使我们进入梦乡。再经过16个小时的积累之后,褪黑激素又将达到使我们感到困意的水平。你可以把早上的起床时间定在晚上睡觉前的16小时,然后坚持每天都在这个时间起床,这种方法可以帮助你养成良好的睡眠习惯。

07:35喝水和柠檬汁

喝一杯温开水和一杯柠檬汁。每天早上都是人体肝脏最为活跃的时间,温开水可以激发消化系统的活力,而柠檬汁则能够清理肠道,加快体内毒素的排出。

7:40吃早餐

因为早餐有助于稳定血糖水平,调节你的食欲与能量。柚子是一种很好的早餐食品,每天吃一个柚子可以避免动脉硬化,降低胆固醇水平。吃完柚子可以喝一碗燕麦粥,燕麦含糖量低,可以缓慢释放碳水化合物,使你长时间不觉得饥饿。研究证明,燕麦粥对于心脏病和糖尿病等都有很好的防治作用。

08:00洗澡

洗个澡,用点冷水刺激一下皮肤,这样可以加快新陈代谢,刺激体内循环。即使在冬季,你也应该使用一些防晒霜,保护皮肤不受紫外线辐射的损伤,要知道,紫外线辐射过多可能会增加皮肤皱纹,严重的还有可能导致患皮肤癌。

08:15刷牙

研究发现,患有牙龈炎等牙部疾病的人得冠心病的几率几乎高出常人两倍,每天刷牙可以预防牙部疾病。

08:45准备工作

当你坐在办公桌前时,检查一下自己的坐椅位置是否正确,以防产生背部疼痛和反复拉伤。坐姿端正,颈椎保持正直,下巴回收,不要向前伸出。要将鼠标等频繁使用的物品放在方便拿到的地方,避免长时间工作后导致肌肉拉伤,不要把电话夹在脖子弯处通话。尽量不要交叉双腿,因为这样不利于血液循环。

09:30脑力活动最强

这是一天中脑力活动的高峰期,纽约睡眠紊乱研究中心的研究者们发现,绝大多数人都是在早上醒来后一到两个小时的时间里达到头脑最为灵敏的阶段。

10:30吃水果补充能量

可以吃点小食品补充一下能量,一个水果就足够了。少食多餐比一日三大餐更能有效地提高身体机能。一次吃得过多会增加消化系统的负担,导致体内血糖水平增减速度过快,消耗人体能量,不利于保持较好状态。如果你非常想吃甜食,那就只吃一片抹了蜂蜜的全麦面包,蜂蜜强大的抗氧化功能可以有效预防心血管疾病。

11:00闭眼休息

双眼放松一会儿,使你的眼部肌肉得到短暂的休息。记住一条20/20原则:每隔20分钟利用20秒的时间盯着20英尺外的东西,借此锻炼眼部肌肉。另外,连续看电脑屏幕一个小时后要休息一下。


下午篇

13:00午饭时间

你的消化系统现在正全力运转,但是一定要坚持少吃多餐的原则,因为一天只吃三顿饭就意味着你失去了丰富进食内容的机会。此前曾有研究证明,食草类动物体内的维生素C含量更高,为了自己的身体健康,你应该在两三天内吃16种不同的食物。午饭时应该多吃高蛋白食物,它们可以帮助你保持清醒。

13:45吃无糖口香糖

嚼一些无糖口香糖,刺激唾液的分泌,帮助清洁口腔内的残留食物。唾液还有助于保护牙齿中的矿物质,这些矿物质可以增强牙釉强度,当我们吃甜食时,牙釉最容易受到破坏。

14:00去室外呼吸新鲜空气

每天的这个时候,大脑的松果腺都会释放少量促进睡眠的荷尔蒙褪黑激素,使你感到午后的睡意。出去走走,呼吸一下新鲜空气。每天20分钟的阳光直射可以帮助我们产生一日所需的维生素D,这种维生素对于骨骼生长和强劲牙齿非常重要。

15:30喝最后一杯茶

喝杯下午茶,休息一会儿。不过,最好每天不要喝超过四杯的茶或咖啡,怀孕的女性则应该更加少喝。可能的话,能喝茶就不喝咖啡,因为茶叶具有吸收血液中有害化学物质的作用,保护人体免受心脏病和癌症的折磨。此时喝的应该是你一天中的最后一杯茶,如果晚些时候还喝的话,茶叶中的咖啡因会在你上床之后继续发挥作用,使你无法入睡。

16:30喝杯酸奶

喝杯酸奶保持血糖浓度,减轻工作后狂欢带来的负面影响。每克酸奶含有225毫克的钙,可以增强骨骼强度。还可吃些干果补充能量。根据英国医院研究委员会人体营养研究中心发布的数字显示,少食多餐可以保持血液中脂肪酸含量的稳定,避免因其含量变化不定而引发心脏病。

17:00运动的好时间

这是大运动量锻炼的最佳时机,此时的肺部功能处于顶峰状态,反应速度最快,有损免疫系统的压力荷尔蒙皮质醇含量最低。游20分钟的泳可以燃烧240卡路里的热量,相当于给全身肌肉进行了次有氧训练。


晚上篇


19:00喝一杯红酒

如果你想喝点酒,最好只喝一杯红酒。

每天的这个时候,肝脏都处于最活跃的阶段,解除酒精毒害的能力最强。红酒含有一种名为“白藜芦醇”的化合物,它可以提高人体有益胆固醇的水平,具有抗癌功能。

20:00吃晚饭

不要多吃碳水化合物含量高的食物,因为这将提高血糖浓度,增加消化系统负担,影响睡眠。最好多吃蔬菜,它们中碳水化合物和蛋白质的含量都比较少。进餐的速度要慢一些,多咀嚼。唾液中含有一种名为“淀粉酶”的消化酶,如果食物在你的嘴里待的时间足够长的话,这种酶就有更多的机会对它们进行消化处理。你的大脑需要20分钟的时间才会意识到自己吃饱了,所以如果你吃饭速度过快的话,就很有可能吃得过多。

21:00活动大脑

做个有趣的游戏,哪怕是个猜字谜都行。研究发现,一些大脑功能如果不经常使用的话就会最终丢失,通过小游戏可以提高大脑的思考能力,降低患阿尔茨海默病氏老年痴呆症的可能性。

22:00美妙时刻

这是一天中性欲最为高涨的时候。根据英国爱丁堡皇家医院进行的一项研究显示,健康的性生活可以使你看起来年轻七岁,帮助你减轻压力,提高睡眠状态,这些对于延年益寿均有帮助。

22:30吃根香蕉

如果你有吃夜宵的习惯,吃根香蕉或一个花生酱三明治,这些食品中含有名为“色氨酸”的氨基酸,可以帮助你产生褪黑激素。用半个小时的时间消化食物。

23:00睡觉

上床睡觉的最佳时间。体温和心跳速度都开始下降,体内压力荷尔蒙皮质醇的水平也同样下滑。你的身体内睡眠荷尔蒙的含量水平将出现增长。为了保证睡眠质量,最好不要在床上吃东西、看书或是看电视。卧室越黑越好,这样有助于松果腺分泌褪黑激素,同时减少致癌自由离子的产生。

posted @ 2007-03-29 16:04 高山流水 阅读(223) | 评论 (0)编辑 收藏

与软件质量——与缺陷共舞
浅谈人与软件质量——与缺陷共舞

文/尹立群

长期以来,软件质量一直是一个广泛又热门的话题。这可能与软件的现状有关:不论如何努力,稍具规模的软件产品总是不能完全做到没有问题,同时各行各业都越来越离不开软件的使用。软件产生问题的原因很多,本文只从人的认知和行为特点出发,企图揭示和解释其与软件问题之间的关系,提倡在软件生产和使用中的“容错”概念,并概括地提出一些对应措施,以期对于改进软件质量和软件生产的总体优化有所裨益。

软件质量的现状
为了了解软件质量的现状,从1994年开始,一个名叫 Standish Group 的智囊团用了十年的时间研究了多达三万五千个开发项目,用了多种方法对这些项目进行了评估,其对于项目成功的定义如下:
软件开发按时完成。
预算未超出。
软件功能涵盖了预定的要求。
软件没有被缺陷致残。
软件已被使用,而且产生了积极的效果。
最初的结果显示符合上述定义的成功软件项目只有16%。Standish 每年都会更新这一数字。之后的结果显示,该比例没有太大的改变。
多年来,软件业界采用了多种方法企图改善软件质量的现状。虽然 Standish Group 的研究指出成功软件的比例变化不大,却并不代表软件业界的努力没有成果。因为用户对于软件的要求越来越高,导致软件越来越来复杂,失败的概率也相应地越来越大。虽然一些有识之士例如 Ben Chelf 认识到人的因素对于软件产生缺陷至关重要,但是面对这一现实,多数还是朝着使人减少犯错误机会的方向去改进。这无疑是必要的。但是在短期不能奏效的局面下,在软件生产和使用中“容忍”缺陷是软件业得以生存和发展的关键一环,通俗地说,要与缺陷共舞。

人的认知和行为特点与软件质量的关系
俗话说,人无完人。通过犯错误认识世界是人的认知方法之一。试探法是方法论领域中重要的一支。我大学的高等数学老师当年曾经讲过前一年的一道研究生入学数学试题,是求解微分方程。绝大多数考生都是沿着传统的思路求解,等到把一套常用的方法试过一遍以后,10分钟已经过去,还是没有解出来,不得不放弃。这一道题唯一的解法是试探法。事实上该题的形式非常简单,是以自然对数为底的方程,只要想到用试探法,一分钟之内连答案都写好了。日常生活中的例子更是比比皆是。从蹒跚学步到牙牙学语,甚至到成年人伸手取物都是通过不断犯错误、修正错误来达到想要的结果。蒙上眼睛伸手取物常常失败,原因是伸手出去的过程中犯的错误没有通过视觉来动态修正。有了人不能不犯错误的共识以后,就不难理解为什么软件不可能没有缺陷。因为作为软件生产的主体的人,其认知与行为特点必然直接影响到软件本身。
软件工程与其它工程领域不同的是,软件的产生过程直到现在也还是手工业工作方式或者说是手工艺品的生产方式,还远远没有实现软件工程这一学科当初想要到达的软件生产工程化、规范化、可复制化或代码重用等理想目标。当设计完成以后,程序员根据设计以及该程序员选择的编码方式实现设计。由于受到时间和人力成本的限制,程序员通常不可能穷尽所有的方法来择优。因此不同的程序员从同一个设计出发,往往是通过不同的方法实现设计的。即使是在设计这一层面,虽然会有更多的机会讨论不同的设计方案,还是不容易做很多不同的设计去比较优劣。这种局面导致完成后的软件总是会有不尽人意的地方。
如果再考虑到人的群体行为,问题的复杂程度就增加了很多。比如,业务过程的描述往往很难对应到技术层面。人与人沟通中的误解错位是软件产品出现问题的重要原因之一。
面对这一现实,软件生产人员和用户的最佳选择是承认软件不可能没有缺陷的现实,在生产和使用中都引入软件“容错”的理念和机制,并把有限的时间和精力放在“关键”部位上,而不是一味追求最少的缺陷和不分重点地使用软件开发力量,这样才能达到总体最优的结果。从九十年代开始发展起来的软件容错技术,正是对于没有无缺陷软件事实的认同。

posted @ 2007-03-27 19:51 高山流水 阅读(1001) | 评论 (0)编辑 收藏

        原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。

        原始模型模式最成功的应用之一就是Object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一种情况。
        原始模型模式的对象创建方式有两种,可以分别称为浅复制和深复制:浅复制就是从原对象复制出新的对象时,并不复制它的成员对象,即它的成员对象句柄所指向的还是原对象中的成员对象;深复制就是在新对象中,成员对象也是新的。
package  prototype;

public   interface  Prototype  {

    
public   void  printPart();
    
    Object flatClone();
    
    Object deepClone() 
throws  Exception;
    
}



package  prototype;

import  java.io. * ;

public   class  ConcretePrototype  implements  Prototype , Serializable {

    
private  Part part;
    
    
public  ConcretePrototype()  {
        part 
=   new  Part();
    }

    
    
public   void  printPart()  {
        System.out.println(part);
    }

    

    
public  Object flatClone()  {
        ConcretePrototype cp 
=   new  ConcretePrototype();
        cp.part 
=   this .part;
        
return  cp;
    }


    
    
public  Object deepClone()  throws  Exception  {
        ByteArrayOutputStream bo 
=   new  ByteArrayOutputStream();
        ObjectOutputStream oo 
=   new  ObjectOutputStream(bo);
        oo.writeObject(
this );
        ByteArrayInputStream bi 
=   new  ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi 
=   new  ObjectInputStream(bi);
        
return  (oi.readObject());
    }


    
class  Part  implements  Serializable  {
        
    }

    
}



package  prototype;

public   class  Client  {
    
    
public   static   void  main(String[] args)  throws  Exception  {
        ConcretePrototype originate, cloned, deepCloned;
        originate 
=   new  ConcretePrototype();

        Thread.sleep(
2000 );

        cloned 
=  (ConcretePrototype)originate.flatClone();
        deepCloned 
=  (ConcretePrototype)originate.deepClone();
        System.out.println(originate);
        System.out.println(cloned);
        System.out.println(deepCloned);
        originate.printPart();
        cloned.printPart();
        deepCloned.printPart();
    }


}

 

    下面是这段代码的打印:

prototype.ConcretePrototype@1034bb5
prototype.ConcretePrototype@19efb05
prototype.ConcretePrototype@723d7c
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@22c95b

        可以看出,打印的前三行各不相同,这说明通过浅复制和深复制,所得到的对象都是与原对象不同的;打印的后三行中有两行相同,这说明,在浅复制时,成员对象的实体没有被复制,只是复制了其句柄,而深复制时,成员对象的实体也被复制了。

posted @ 2007-03-27 19:45 高山流水 阅读(224) | 评论 (0)编辑 收藏

七种武器——.NET工程师求职面试必杀技
一、.NET框架(七种武器之孔雀翎)

开发人员应该熟悉.NET FrameWork体系结构和基本原理,熟悉CLR(公共语言运行时)和MSIL(中间语言),熟悉.NET框架中的委托、线程、序列化、集合、垃圾回收机制、反射等内容。

(世界上绝没有一种暗器能比孔雀翎更厉害,也绝没有一种武器能比孔雀翎更美丽……孔雀翎娇小的身躯中隐藏着巨大的威力…….NET框架的博大精深,正如同孔雀翎一样美丽而深不可测。)

二、面向对象软件开发(七种武器之霸王枪)

开发人员应该熟悉面向对象软件开发(OOP)基本概念,熟悉面向对象软件开发中的类、继承、封装、多态等概念,具备良好的面向对象软件开发思想和设计原则。

(霸王,力拔山兮气盖世。枪,百兵之祖是为枪……霸王枪是世上最霸道的兵器之一……正如面向对象软件开发,它大小通吃,不论是采用何种软件开发框架,还是使用不同的开发语言,面向对象软件开发在其中畅通无阻,霸气十足。)

三、C# (七种武器之离别钩)

开发人员应该熟练掌握C#这门面向对象编程语言,虽然.NET框架支持多种编程语言,但C#无疑是最简洁、使用者最广泛和功能最强大的一种。

(离别钩是一件武器,无论钩住人的任何部位,都能造成离别……但使用它的初衷却是为了能够与所爱的人相聚……C#是一门年轻的语言,它的出现,让更多的开发者爱上了C#,脱离了VB和ASP的阵营,造成离别。)

四、ASP.NET(七种武器之碧玉刀)

开发人员应该理解ASP.NET的页面生命周期、熟悉配置文件的格式、熟悉ASP.NET的各种服务器控件和数据控件、了解ASP.NET中的各种对象,了解ASP.NET2.0新特性。

(刀是最容易上手的武器,也是使用最广泛的武器……ASP.NET技术在网站开发当中的应用,正如同刀一样地使用频繁,更何况是一把华丽的碧玉刀。碧玉刀本身也是实力的象征,就如同ASP.NET在WEB开发中的位置。)

五、数据库(七种武器之长生剑)

开发人员需了解各种主流数据库,熟悉数据库的规范设计、精通SQL及存储过程、触发器的编写。

(长生剑,世上最锋利的剑,剑气威力强大而又持续不断、绵绵不息……正如同数据库一样,吸纳吞吐,化大象于无形,强力支撑着软件系统。要想在IT界获得长生,就看你数据库的功底了。)

六、AJAX技术(JAVASCRIPT和XML)(七种武器之多情环)

XML和JAVASCRIPT的跨平台特性,在实际软件开发中的运用越来越广泛,由于现代软件对用户界面和WEB前端的日益重视,集JAVASCRIPT和XML技术于大成的AJAX正在流行,特别是在基于WEB2.0的网站开发中。

(多情环是一种奇特的武器。无论套住了什么,立刻就紧紧地缠住,绝不会再脱手,就像多情的恋人一样……JAVASCRIPT和XML技术已经出现多年,此前一直不痛不痒,但由于集JAVASCRIPT和XML于大成的AJAX技术的出现及其在互联网上的不断应用,又重新焕发出生命活力,就像多情的环一样,将众多的开发者牢牢系住,在2006年红透了整个IT界,2007年AJAX技术将继续红火。)

七、软件体系架构(拳头)

优秀的软件离不开优秀的软件体系架构,作为开发人员,要想在IT行业更进一步,需要具备系统的、良好的软件体系架构思维,从而从更高层次决定软件的整体系统框架。

(拳头也是一种武器。而且是无可替代的武器。当分散的五指握成拳头,它的力量又岂仅仅是原来的五倍……优良的软件体系架构是整个软件开发体系的核心,就如同拳头一样,它是直接而致命的。但有一点,不是每个人的拳头都可以用做武器的。)

结束语:无论多可怕的武器,也比不上人类的信心。所以人类最厉害的武器。便是自己的信心。相信你自己,做最好的自己,你就会成功! 

posted @ 2007-03-27 19:09 高山流水 阅读(225) | 评论 (0)编辑 收藏

本文是一篇软件加密技术的基础性文章,简要介绍了软件加密的一些基本常识和一些加密产品,适用于国内软件开发商或者个人共享软件开发者阅读参考。

  1、加密技术概述

  一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。

  对纯数据的加密的确是这样。对于你不愿意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。

   但是,软件的加密不同于数据的加密,它只能是“隐藏”。不管你愿意不愿意让他(合法用户,或 Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。既然机器可以“看见”这些明文,那么 Cracker,通过一些技术,也可以看到这些明文。

  于是,从理论上,任何软件加密技术都可以破解。只是破解的难度不同而已。有的要让最高明的 Cracker 忙上几个月,有的可能不费吹灰之力,就被破解了。

  所以,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增加 Cracker 的破解难度。让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。这样 Cracker 的破解变得毫无意义——谁会花比正版软件更多的钱去买盗版软件?  


  2、密码学简介

  2.1   概念

  (1) 发送者和接收者

  假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。

  (2) 消息和加密

  消息被称为明文。用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。

  明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,无论在哪种情况,M指待加密的消息。

  密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。加密函数E作用于M得到密文C,用数学表示为:

  E(M)=C.

  相反地,解密函数D作用于C产生M

  D(C)=M.

  先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:

  D(E(M))=M

  (3) 鉴别、完整性和抗抵赖

  除了提供机密性外,密码学通常有其它的作用:.

  (a) 鉴别

  消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。

  (b) 完整性检验

  消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。

  (c) 抗抵赖

  发送者事后不可能虚假地否认他发送的消息。

  (4) 算法和密钥

  密码算法也叫密码,是用于加密和解密的数学函数。(通常情况下,有两个相关的函数:一个用作加密,另一个用作解密)

   如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变 换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。如果有人无意暴露了这个秘密,所有人都必须改变他们的算 法。

  更糟的是,受限制的密码算法不可能进行质量控制或标准化。每个用户组织必须有他们自己的唯一算法。这样的组织不可能采用流行的硬件 或软件产品。但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他 们是否拥有安全的算法。

  尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。

  现代密码学用密钥解决了这个问题,密钥用K表示。K可以是很多数值里的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:

  EK(M)=C

  DK(C)=M.

  DK(EK(M))=M.

  有些算法使用不同的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:

  EK1(M)=C

  DK2(C)=M

  DK2 (EK1(M))=M

  所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。

  密码系统由算法、以及所有可能的明文、密文和密钥组成的。

  基于密钥的算法通常有两类:对称算法和公开密钥算法。下面将分别介绍:

  2.2   对称密码算法

   对称算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密 钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。 只要通信需要保密,密钥就必须保密。

  对称算法的加密和解密表示为:

  EK(M)=C

  DK(C)=M

   对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组比特亚行运算,这些比特组称 为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计 算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。

  2.3   公开密码算法

   公开密钥算法(也叫非对称算法)是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间 内)。之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫 做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了避免与对称算法混淆,此处不用秘密密钥这个名字。

  用公开密钥K加密表示为

  EK(M)=C.

  虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:

  DK(C)=M

  有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:

  EK(M)=C

  DK(C)=M

  当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。

  2.4   单向散列函数

  单向散列函数 H(M) 作用于一个任意长度的消息 M,它返回一个固定长度的散列值 h,其中 h 的长度为 m .

  输入为任意长度且输出为固定长度的函数有很多种,但单向散列函数还有使其单向的其它特性:

  (1) 给定 M ,很容易计算 h ;

  (2) 给定 h ,根据 H(M) = h 计算 M 很难 ;

  (3) 给定 M ,要找到另一个消息 M‘ 并满足 H(M) = H(M’) 很难。

  在许多应用中,仅有单向性是不够的,还需要称之为“抗碰撞”的条件:

  要找出两个随机的消息 M 和 M‘,使 H(M) = H(M’) 满足很难。

  由于散列函数的这些特性,由于公开密码算法的计算速度往往很慢,所以,在一些密码协议中,它可以作为一个消息 M 的摘要,代替原始消息 M,让发送者为 H(M) 签名而不是对 M 签名 .

  如 SHA 散列算法用于数字签名协议 DSA中。

  2.5   数字签名

  提到数字签名就离不开公开密码系统和散列技术。

  有几种公钥算法能用作数字签名。在一些算法中,例如RSA,公钥或者私钥都可用作加密。用你的私钥加密文件,你就拥有安全的数字签名。在其它情况下,如DSA,算法便区分开来了??数字签名算法不能用于加密。这种思想首先由Diffie和Hellman提出 .

  基本协议是简单的 :

  (1) A 用她的私钥对文件加密,从而对文件签名。

  (2) A 将签名的文件传给B.

  (3) B用A的公钥解密文件,从而验证签名。

  这个协议中,只需要证明A的公钥的确是她的。如果B不能完成第(3)步,那么他知道签名是无效的。

  这个协议也满足以下特征:

  (1) 签名是可信的。当B用A的公钥验证信息时,他知道是由A签名的。

  (2) 签名是不可伪造的。只有A知道她的私钥。

  (3) 签名是不可重用的。签名是文件的函数,并且不可能转换成另外的文件。

  (4) 被签名的文件是不可改变的。如果文件有任何改变,文件就不可能用A的公钥验证。

  (5) 签名是不可抵赖的。B不用A的帮助就能验证A的签名。

  在实际应用中,因为公共密码算法的速度太慢,签名者往往是对消息的散列签名而不是对消息本身签名。这样做并不会降低签名的可信性。

  3    当前流行的一些软件保护技术

  3.1   序列号保护

  数学算法一项都是密码加密的核心,但在一般的软件加密中,它似乎并不太为人们关心,因为大多数时候软件加密本身实现的都是一种编程的技巧。但近几年来随着序列号加密程序的普及,数学算法在软件加密中的比重似乎是越来越大了。

   看看在网络上大行其道的序列号加密的工作原理。当用户从网络上下载某个shareware——共享软件后,一般都有使用时间上的限制,当过了共享软件的 试用期后,你必须到这个软件的公司去注册后方能继续使用。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软件公司,软件公司 会根据用户的信息计算出一个序列码,在用户得到这个序列码后,按照注册需要的步骤在软件中输入注册信息和注册码,其注册信息的合法性由软件验证通过后,软 件就会取消掉本身的各种限制,这种加密实现起来比较简单,不需要额外的成本,用户购买也非常方便,在互联网上的软件80%都是以这种方式来保护的。

  软件验证序列号的合法性过程,其实就是验证用户名和序列号之间的换算关系是否正确的过程。其验证最基本的有两种,一种是按用户输入的姓名来生成注册码,再同用户输入的注册码比较,公式表示如下:

  序列号 = F(用户名)

  但这种方法等于在用户软件中再现了软件公司生成注册码的过程,实际上是非常不安全的,不论其换算过程多么复杂,解密者只需把你的换算过程从程序中提取出来就可以编制一个通用的注册程序。

  另外一种是通过注册码来验证用户名的正确性,公式表示如下:

  用户名称 = F逆(序列号) (如ACDSEE)

  这其实是软件公司注册码计算过程的反算法,如果正向算法与反向算法不是对称算法的话,对于解密者来说,的确有些困难,但这种算法相当不好设计。

  于是有人考虑到以下的算法:

  F1(用户名称) = F2(序列号)

   F1、F2是两种完全不同的的算法,但用户名通过F1算法计算出的特征字等于序列号通过F2算法计算出的特征字,这种算法在设计上比较简单,保密性相对 以上两种算法也要好的多。如果能够把F1、F2算法设计成不可逆算法的话,保密性相当的好;可一旦解密者找到其中之一的反算法的话,这种算法就不安全了。 一元算法的设计看来再如何努力也很难有太大的突破,那么二元呢?

  特定值 = F(用户名,序列号)

  这个算法看上去相 当不错,用户名称与序列号之间的关系不再那么清晰了,但同时也失去了用户名于序列号的一一对应关系,软件开发者必须自己维护用户名称与序列号之间的唯一 性,但这似乎不是难以办到的事,建个数据库就可以了。当然也可以把用户名称和序列号分为几个部分来构造多元的算法。

  特定值 = F(用户名1,用户名2,...序列号1,序列号2...)

  现有的序列号加密算法大多是软件开发者自行设计的,大部分相当简单。而且有些算法作者虽然下了很大的功夫,效果却往往得不到它所希望的结果。

  3.2   时间限制

  有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就停止工作,必须重新运行该程序才能正常工作。这些程序里面自然有个定时器来统计程序运行的时间。

  这种方法使用的较少。

  3.3   Key File 保护

   Key File(注册文件)是一种利用文件来注册软件的保护方式。Key File一般是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信 息。文件格式则由软件作者自己定义。试用版软件没有注册文件,当用户向作者付费注册之后,会收到作者寄来的注册文件,其中可能包含用户的个人信息。用户只 要将该文件放入指定的目录,就可以让软件成为正式版。该文件一般是放在软件的安装目录中或系统目录下。软件每次启动时,从该文件中读取数据,然后利用某种 算法进行处理,根据处理的结果判断是否为正确的注册文件,如果正确则以注册版模式来运行。

  这种保护方法使用也不多。

  3.4   CD-check

   即光盘保护技术。程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程当中一般不再检查 光盘的存在与否。Windows下的具体实现一般是这样的:先用GetLogicalDriveStrings( )或GetLogicalDrives( )得到系统中安装的所有驱动器的列表,然后再用GetDriveType( )检查每一个驱动器,如果是光驱则用CreateFileA( )或FindFirstFileA( )等函数检查特定的文件存在与否,并可能进一步地检查文件的属性、大小、内容等。

  3.5   软件狗

  软件狗是一种智 能型加密工具。它是一个安装在并口、串口等接口上的硬件电路,同时有一套使用于各种语言的接口软件和工具软件。当被狗保护的软件运行时,程序向插在计算机 上的软件狗发出查询命令,软件狗迅速计算查询并给出响应,正确的响应保证软件继续运行。如果没有软件狗,程序将不能运行,复杂的软硬件技术结合在一起防止 软件盗版。真正有商业价值得软件一般都用软件狗来保护。

  平时常见的狗主要有“洋狗”(国外狗)和“土狗”(国产狗)。这里“洋狗”主要 指美国的彩虹和以色列的HASP,“土狗”主要有金天地(现在与美国彩虹合资,叫“彩虹天地”)、深思、尖石。总的说来,“洋狗”在软件接口、加壳、反跟 踪等“软”方面没有“土狗”好,但在硬件上破解难度非常大;而“土狗”在软的方面做的很好,但在硬件上不如“洋狗”,稍有单片机功力的人,都可以复制。

  3.6   软盘加密

  通过在软盘上格式化一些非标准磁道,在这些磁道上写入一些数据,如软件的解密密钥等等。这种软盘成为“钥匙盘”。软件运行时用户将软盘插入,软件读取这些磁道中的数据,判断是否合法的“钥匙盘”。

  软盘加密还有其它一些技术,如弱位加密等等。

  随着近年来软盘的没落,这种方法基本上退出了历史舞台。

  3.7   将软件与机器硬件信息结合

   用户得到(买到或从网上下载)软件后,安装时软件从用户的机器上取得该机器的一些硬件信息(如硬盘序列号、BOIS序列号等等),然后把这些信息和用户 的序列号、用户名等进行计算,从而在一定程度上将软件和硬件部分绑定。用户需要把这一序列号用Email、电话或邮寄等方法寄给软件提供商或开发商,软件 开发商利用注册机(软件)产生该软件的注册号寄给用户即可。软件加密虽然加密强度比硬件方法较弱,但它具有非常廉价的成本、方便的使用方法等优点。非常适 合做为采用光盘(CDROM)等方式发授软件的加密方案。

  此种加密算法的优点

  ·    不同机器注册码不同。用户获得一个密码只能在一台机器上注册使用软件。不同于目前大多软件采用的注册方法,即只要知道注册码,可在任何机器上安装注册。

  ·    不需要任何硬件或软盘

  ·    可以选择控制软件运行在什么机器、运行多长时间或次数等

  ·    可让软件在不注册前的功能为演示软件,只能运行一段时间或部分功能。注册后就立即变为正式软件

  ·    采用特别技术,解密者很难找到产生注册号码的规律

  ·    在使用注册号产生软件(注册机)时可采用使用密码、密钥盘、总次数限制等方法

  ·    方便易用,价格低廉。

  这种加密还有以下特点

  1、 注册加密的软件,只能在一台机器上安装使用。把软件拷贝到其它机器上不能运行。

  2、 若用户想在另一机器上安装运行,必须把软件在这一机器上运行时的序列号,寄给软件出版商换取注册密码。当然应再交一份软件费用。

  3、 此加密方法特别适应在因特网上发布的软件及用光盘发布的软件。

  注释:

  1、“加密技术概述”部分内容参考了大学教材“密码学基础”。

  2、“当前流行的一些软件保护技术”部分内容参考了“加密与解密--软件保护技术及完全解决方案”一文。

posted @ 2007-03-27 16:34 高山流水 阅读(843) | 评论 (0)编辑 收藏

很多架构师都是从好的开发人员逐步过渡而来的,但并非每个好的开发人员都希望成为架构师,而且他们并不是都适合做架构师。无论您是打算进行职业转型的开发人员,还是寻找能承担体系结构设计责任的合适人选的经理,都务必对此转型过程有个清楚的了解。本文将讨论从实现专家到架构师的过渡过程。

  在寻找优秀的指挥的时候,您首先要找的是一名优秀的音乐演奏家。但并非每个音乐演奏家都能成为优秀的指挥。架构师的专业发展方面也与此类似。越来越多的 IT 组织开始认识到良好软件体系结构的重要性,架构师职业正迅速发展为 IT 内一个独立的门类。由于要从相当小的候选范围内招募架构师,因此这就给管理带来了一些新挑战。即使人力资源部门找到了候选者,针对经验进行的筛选也比其他门类更为严格。跨越这些障碍的最快方式是要认识到,大部分好的架构师同时也是好的开发人员,因此寻找架构师人才时可能首先应该从普通开发人员中找起。招聘人员在对候选者(内部或外部)进行详细审查时,应该考虑这个观点。不过,对此资源进行挑选可能比较麻烦,因为只有极少的优秀开发人员具有成为架构师的特征或愿望。

  本文列出了开发人员成为架构师要进行的工作。我将从可能考虑进行此转型的开发人员和评估进行此转型的开发人员的经理这两个方面来探讨这一问题。我还将提供一系列在做出这些决策时要考虑的因素。

  个人特征

  软件开发团队和管理层之间的联系始终是 IT 中的一个关键所在。二者都倾向于以完全不同的方式考虑给定的问题。大部分相关技术都是讨论项目经理应如何跟踪和解释开发人员的进度和问题。但沟通不足的情况仍然非常普遍,而且这是项目失败的首要原因。好的架构师是解决这个问题的最有效办法。架构师的主要责任是提供开发人员和项目经理之间的共用沟通媒体。他们负责让业务规则及需求与工程实践及限制相适应,以确保成功。以下是成功架构师的一些主要特征。

  愿意并有能力进行沟通:在开发人员中发现架构师的最有价值标准是有效的沟通。您需要技术娴熟、经验丰富的开发人员,这样的人员需要有就项目中的业务相关问题进行沟通的经历。架构师经常必须对理解方面的差距进行预计,然后才能有所贡献。他们必须愿意克服困难来确保技术和业务观点的融合。他们并不必对意见交换工作进行计划和协调;这仍然主要是项目经理的工作。他们的任务是确定表述系统设计时的最佳工具和构件,以促进有效的意见交换。他们必须能够判断当前方法显得不足而需要采用新方法的情况。写作技能也非常重要,还需要具有制作草图的技能或使用制图软件的能力。

  具有处理谈判细节方面的经验:架构师经常需要负责讨论系统开发的技术折衷方案。优先级的冲突可能会带来实践限制、风险规避或可能导致在各个不同业务组之间需求不同。优秀的架构师能够有效地评估技术可能性,并能在不损失项目的主要价值的前提下制订开发计划来处理各种利害关系和限制。这与前面讨论的沟通技能紧密相关,但同时也要体现架构师的技术能力。好的架构师候选者应该是经常帮助对有争议的讨论进行引导的人,能够使讨论得出新的想法,而不会使其在一个位置停滞不前。

  自觉主动;积极解决设计问题:架构师的日常工作目标经常并不明确。很多开发人员直接参考功能规范来列出任务清单。架构师通常则是向这些开发人员提供所需结构的人员,以便尽可能提高工作效率。好的候选者不仅进行沟通方面的工作,而且也会预计各种设计问题并加以解决——通常在没有任何具体指示的情况下自觉进行。无论所分配的职责如何,积极参与项目的开发人员都有机会从一起工作的人员中脱颖而出。

  抽象思维和分析:架构师必须能够理解表述模糊的概念并将其变成相关各方能够理解的项目构件。他们必须能够理解抽象概念,并以具体的语言对其进行沟通。开发人员中好的候选者经常要求或自己主动解释开发生命周期中容易混淆的问题。他们能迅速评估各种想法并将其纳入后续工作的操作建议中。

  开发人员经常具有很强的数学能力,而好的架构师则倾向于表现出更强的口头表达能力。管理人员经常说开发人员具有“工程意识”,而这是一个用于评估架构师的非常有意义的方面。架构师应该具有很强的解决技术问题的能力,但还必须能够准确获知更为全面的人员如何与技术交互的信息。这要求具有某种形式的抽象思维(而不再是代码的细节),这种思维能力可能较难形成。

  有些人认为,某种级别的正式教育是成为优秀开发人员的必备条件之一,我并不同意这种精英论。我遇到了很多高中就辍学的优秀开发人员。不过,对于体系结构设计工作,我的个人经验以及我对所需能力的认识都让我相信,好的架构师通常至少获得了一个有挑战性的学士学位。

  跟踪生命周期

  好的架构师通常有在具备定义良好的软件开发生命周期(Software Development Life Cycle,SDLC)的组织工作的经验。架构师必须理解在其所属专业内最重要的操作过程。这并不意味着需要有其他前提,例如,并不需要高能力成熟度模型(Capability Maturity Model,CMM)级别的工作经验。好的架构师可能来自使用 SDLC 的多个小型迭代的极限编程(Extreme Programming,XP)方法的组织。务必注意各种传统软件开发操作,如 Michael A. Jackson 的方法:Jackson 结构编程(Jackson Structured Programming,JSP)和 Jackson 系统开发(Jackson System Development,JSD)。Jackson 的研究对架构师职业发展的意义就像 Donald Knuth 的研究对程序员一样重要。架构师可以偏爱任何经典的、经过时间考验的软件系统开发方法。

  SDLC 也可以成为评估架构师合适人选的有用机制。每个 SDLC 阶段都具有能提供相关线索的特征。SDLC 包含很多小的变体,但在此部分,我将使用几乎所有方法的公共基础部分。下面的列表详细说明了 SDLC 的各个阶段,并列出了好的架构师候选者在每个阶段表现出来的特征。

  •   分析:在分析期间,好的架构师会考虑非技术影响,以便了解需求和将在其中进行开发的环境。架构师可为风险评估任务带来广泛的软件经验供参考。寻找具有丰富经验的开发人员,以帮助业务部门理解技术人员正确解释需求所需的信息。寻找在开发的早期阶段能够预计可能遇到的问题的开发人员。
  •   设计:在高级设计期间,好的架构师会收集问题空间的各个抽象元素,并就其进行沟通,以便开发团队草拟将要开发的系统的相关图表。架构师负责将需求谨慎地映射到所得到的系统体系结构的功能。在详细设计期间,他们所扮演的角色并不是核心角色,但为了根据整个系统的规则对特定模块的元素进行审查,仍然需要他们。寻找善于让团队能够预计设计决策对最终系统的影响的开发人员。寻找善于确定一些最佳构件来促进与技术和非技术受众沟通设计问题的开发人员。
  •   实现:在实现期间,架构师对项目进行引导,以确保其符合系统体系结构。他们在一线评估技术更改请求,并确定如何对设计进行调整,以最好地处理此类请求。架构师还要密切了解开发人员的进度,特别要跟踪系统中模块间的集成点的状态。寻找经常对讨论进行引导来连接多个子系统的开发人员。寻找项目经理可以依赖其快速地进行与更改和出现的问题相关的风险评估的开发人员。
  •   测试:架构师对系统集成和用户接受度测试进行指导,并负责评估进度的正确沟通的持续测试结果。寻找理解错误模式且善于将测试复查结果转换为行动计划的开发人员。
  •   维护:在维护期间,架构师将发起关于系统集成的讨论。无论处理 IT 基础设施问题,还是确保部门之间的技术合作,架构师都必须完全理解应用程序,必须快速学习姊妹应用程序的体系结构,而且必须就集成点和风险进行有效沟通。寻找具有系统集成经验且表现出快速掌握全貌的能力的开发人员。系统集成是一项独特的任务。

  架构师培养建议

  有些组织能比其他组织更有效地进行架构师培养。如果充分考虑到招聘此类新专业人才的困难,努力促成能鼓励开发人员发展为架构师的环境是非常明智的策略。但务必避免对不愿意或不适合走这条路的开发人员进行处罚。组织应该为开发人员制订多条发展路线,包括那些愿意继续担任开发人员的人。对架构师而言,资深开发人员不可或缺。他们可以实现系统中最关键的模块。通过对其他开发人员进行代码检查和测试支持,他们可帮助确保总体软件质量,而如果质量不能保证,即使最好的体系结构也毫无用处。

  组织应制订个人评估程序,以鼓励开发人员考虑其职业目标,其中要包含体系结构设计的选项。应该鼓励经理在其下属中寻找体系结构设计人才。应该实现指导计划,让架构师与希望成为架构师的开发人员协作工作。应该鼓励开发人员通过参加各种协会、撰写文章和参加会议,从而参与到专业领域中来。通过这样参与进来,可帮助开发人员从新的角度理解系统,并帮助他们更好地就其认识进行沟通。这样还能培养可提高效率的重要创新想法。

  结束语

  开发人员一旦迈出了通向体系结构设计专业方向的第一步,就可以利用很多资源来获得帮助,其中包括很多来自 IBM 的资源。有时候,此过程的最困难的部分就是第一步,而本文提供了一些线索和提示,经理和开发人员可以利用其来评估应该鼓励哪些人努力成为架构师。

posted @ 2007-03-27 15:58 高山流水 阅读(328) | 评论 (0)编辑 收藏

第一,谈谈final, finally, finalize的区别。

  第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

  第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

  第四,&和&&的区别。

  第五,HashMap和Hashtable的区别。

  第六,Collection 和 Collections的区别。

  第七,什么时候用assert。

  第八,GC是什么? 为什么要有GC?

  第九,String s = new String("xyz");创建了几个String Object?

  第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

  第十二,sleep() 和 wait() 有什么区别?

  第十三,Java有没有goto?

  第十四,数组有没有length()这个方法? String有没有length()这个方法?

  第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

  第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

  第十七,给我一个你最常见到的runtime exception。

  第十八,error和exception有什么区别?

  第十九,List, Set, Map是否继承自Collection接口?

  第二十,abstract class和interface有什么区别?

  第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

  第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

  第二十三,启动一个线程是用run()还是start()?

  第二十四,构造器Constructor是否可被override?

  第二十五,是否可以继承String类?

  第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

  第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

  第二十八,编程题: 用最有效率的方法算出2乘以8等於几?

  第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

  第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

  第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

  第三十二,编程题: 写一个Singleton出来。

  答案请参看楼下:
以下是答案

  第一,谈谈final, finally, finalize的区别。

  final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

  finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

  第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

  匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

  第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

  Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1

  注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象

  第四,&和&&的区别。

  &是位运算符。&&是布尔逻辑运算符。

  第五,HashMap和Hashtable的区别。

  都属于Map接口的类,实现了将惟一键映射到特定的值上。

  HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。

  Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。

  第六,Collection 和 Collections的区别。

  Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
  Collection是个java.util下的接口,它是各种集合结构的父接口。

  第七,什么时候用assert。

  断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:

assert(a > 0); // throws an AssertionError if a <= 0

  断言可以有两种形式:

  assert Expression1 ;
  assert Expression1 : Expression2 ;

  Expression1 应该总是产生一个布尔值。
  Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:

  javac -source 1.4 Test.java

  要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
  要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
  要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

  可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。


  第八,GC是什么? 为什么要有GC? (基础)。

  GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:

  System.gc()
  Runtime.getRuntime().gc()

  第九,String s = new String("xyz");创建了几个String Object?

  两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

  第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

  第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

  第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱

  sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。

  wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

第十三,Java有没有goto?

  Goto?java中的保留字,现在没有在java中使用。

  第十四,数组有没有length()这个方法? String有没有length()这个方法?

  数组没有length()这个方法,有length的属性。
  String有有length()这个方法。

  第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

  方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

  第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

  Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

  equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

  第十七,给我一个你最常见到的runtime exception。

  ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

  第十八,error和exception有什么区别?

  error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

  exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。


  第十九,List, Set, Map是否继承自Collection接口?

  List,Set是

  Map不是

  第二十,abstract class和interface有什么区别?

  声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

  第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

  都不能

  第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

  接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

  第二十三,启动一个线程是用run()还是start()?

  启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

 

  第二十四,构造器Constructor是否可被override?

  构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

  第二十五,是否可以继承String类?

  String类是final类故不可以继承。

  第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

  不能,一个对象的一个synchronized方法只能由一个线程访问。

  第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

  会执行,在return前执行。

  第二十八,编程题: 用最有效率的方法算出2乘以8等於几?

  有C背景的程序员特别喜欢问这种问题。

  2 << 3

  第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

  不对,有相同的hash code。

  第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

  是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。


  第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

  switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

  第三十二,编程题: 写一个Singleton出来。

  Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

  一般Singleton模式通常有几种种形式:

  第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {
  private Singleton(){}
  //在自己内部定义自己一个实例,是不是很奇怪?
  //注意这是private 只供内部调用
  private static Singleton instance = new Singleton();
  //这里提供了一个供外部访问本class的静态方法,可以直接访问  
  public static Singleton getInstance() {
    return instance;   
   }
}

  第二种形式:

public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}

  其他形式:

  定义一个类,它的构造函数为private的,所有方法为static的。

  一般认为第一种形式要更加安全些

  第三十三 Hashtable和HashMap

  Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现

  HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

  还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。

  Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

  
  转java中文站

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。

问题一:我声明了什么!

String s = "Hello world!";

许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

问题二:"=="和equals方法究竟有什么区别?

==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){

return this==o;

}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。

问题三:String到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。
问题四:final关键字到底修饰了什么?

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。

问题五:到底要怎么样初始化!

本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数

对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。

int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。

对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。

对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

问题六:instanceof是什么东东?

instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}

在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。

然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

http://www.javaresearch.org/faq/thread.jsp?column=723&thread=22395

posted @ 2007-03-27 15:34 高山流水 阅读(381) | 评论 (0)编辑 收藏

兔子跟街上走着,迎面碰上了老狼。老狼伸手就给他一大嘴巴:“让你丫不戴帽子”。

  兔子很郁闷地回家了,弄一帽子戴着。

  第二天又碰上老狼了,又挨了一大嘴巴,“让你丫戴帽子”。

  如是几次,总挨打。兔子想,这么老挨打不是个事儿啊,不行,我得找老虎投诉去。

  刚到老虎家门口,就听老虎在屋里说话。

  “你也不能老这么蛮不讲理打兔子阿,回头兔子找我投诉来,我也不好罩着你啊。好歹咱面子上得过得去,我教你一招。

  下回你见着兔子,跟他说:给我弄点儿洗衣服的来。他给你拿肥皂来,你就打他一顿的,说我要的是洗衣粉,谁让你拿肥皂。他拿洗衣粉来,你也能打,说我要肥皂,谁让你拿洗衣粉。

  要不然你跟他说,去,给我找个妞儿来。他给你找个胖的,你打他一顿说我要瘦的;给你找个瘦的,你也打一顿,说我要胖的。

  这样不结了,你也能打他,我面子上也能说得过去。”

  兔子一听,得,咱也别投诉了,回家吧。

  第二天,兔子在街上又撞上老狼。老狼大喝一声:去,给我找点儿洗衣服的来。

  兔子不慌不忙:你是要洗衣粉阿,还是要肥皂啊?

  老狼一听,嗯?有一手啊。又说:去,给我找个妞儿来。

  兔子还是不慌不忙:你是要胖的啊,还是瘦的?

  老狼一听勃然大怒,伸手就给兔子一个大嘴巴:“让你丫不戴帽子!”

  兔子那个哭啊~

posted @ 2007-03-27 15:19 高山流水 阅读(180) | 评论 (0)编辑 收藏

1、当她要你请她吃饭的时候,你不妨长时间注视她,如果她表现出来的不是乖巧和温情,那你就别破费。


2、你在决定追一个女人的时候,先想想自己能不能在她面前保持本色,否则别去委屈自己。

3、一等色狼爱才女,二等色狼爱淑女,三等色狼爱美女,四等色狼爱妓 女

4、与她上街许多次,她一直阻止你为她花钱并不时问你饿不饿渴不渴累不累,并且你由衷感动的话,则你应该考虑娶她。

5、女人的自尊心比超薄丝袜还脆弱。很多时候你太在乎她的自尊,她就可能不在乎你的自尊,她要变成慈禧的话,你别当李莲英。

6、爱撒谎的美女不是女人是精液容器,别太在意。

7、色狼的最高境界是专一,滥情是菜鸟无能的表现。

8、与其手捧玫瑰西装革履站在楼下等她,不如让她到看你在运动场上,篮球架下如何生龙活虎。

9、多吻她的额头和手背,吻她不敏感的地方,比吻她敏感的地方更能让她有感觉。

10、爱情比荒原还残酷。爱情的快乐有多大,伤口就有多大,但你既想追她就不要怕痛,否则自个手淫去好了。

11、色狼完全没理由为自己是狼而忘形,记住女人是老虎,老虎比狼厉害。

12、别吃她吃剩的饭菜,别谈她谈厌的话题。

13、兜里揣一百全为她花光的效果,比揣一万为她花一千的效果强好几倍。

14、女人的承诺与豪言壮语常不及男人一半可靠。

15、她面对孕妇与儿童时的表现常证明她对你的感情深到什么程度。

16、男人去酒吧歌厅找刺激,跟狗翻垃圾堆找食吃一样,要想做条真正的色狼,就别去泡吧K歌。

17、虽说装嫩的女人是白骨精,但你也别当孙悟空。

19、女人用两个极端方式管你索要宽厚与温情:小鸟依人、歇斯底里。

20、对温柔聪明的女人而言,一束百荷比999朵玫瑰更有说服力。

21、适时讲些黄色笑话,经常从背后抱住她轻吻。

22、女人经常迟到十分钟以上或不来,并说一些你将信将疑的理由,那你不妨考虑和她分手。

23、如果女人看你的时候眼睛从来没有亮晶晶过,那绝对是你的失败。

24、游刃有余地在多个男人之间周旋的女人可操不可信。

25、惩治超级自恋不可理喻的女人最好的方式,是直截了当地指出她的缺点,别在乎她的咆哮与掉头离去。

26、在你无法识破女人是否假装高潮之前,你还是别自诩成熟。

27、别对女人期望太高,没有极品好女人,但有极品坏女人。

28、女人时时对你任性,挑剔,冷淡,拒绝却还口口声声说爱你的时候,她只不过是在压榨你利用你。

29、尽量欣赏一丝不挂的她,而不是用情趣内衣装潢起来的她。

30、晚上揣把刀走路去接她,比开奔驰宝马去接她更能让她感动。

31、对女人要多用心去感觉,少用龟头思考。

32、不会凶狠的色狼必不会温柔。

33、色狼就是色狼,不应该披上羊皮,别去刻意表现绅士风度,营造什么浪漫——那样你只能追到不懂事的黄毛丫头。解除外挂原生态一些反而更有魅力。

34、发嗲是女人的温柔一刀。

35、在女人眼中,你的袜子就是你的心灵,你的内裤就是你的精神——保证你的内裤与袜子干干净净是很有必要的。

36、叫嚣女权的女人是空酒瓶。

37、在成熟的女人眼中,男人玩性格跟婴儿玩小鸡鸡类似。

38、女人爱钻石与爱情无关。

39、要警惕来回变换发型的女人。

40、判断一个女孩子能不能成为你的女友最好的方法,是请她去看一部KB片。

posted @ 2007-03-27 15:02 高山流水 阅读(254) | 评论 (0)编辑 收藏

仅列出标题
共30页: 1 2 3 4 5 6 7 8 9 Last