程序员Java面试的陷阱

程序员Java面试的陷阱2010年01月21日 星期四 22:27
  找工作要面试,有面试就有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel,Motorola, SUN,以及其它大小公司。

面试是没什么道理可讲的,它的题目有的不合情理、脱离实际。有在纸上写的,有当面考你的,也有在电话里问的,给你IDE的估计很少(否则你赶快去买彩票,说不定中)。所以如果你看完此文后,请不要抱怨说这些问题都能用IDE来解决。你必须在任何情况下准确回答这些问题,在面试中如果出现一两题回答不准确很有可能你就被拒之门外了。

当然这些都是Java的基本题,那些面试的人大多数不会问你Hibernate有多先进,Eclipse的三个组成部分,或command design pattern,他们都是老一辈了,最喜欢问的就是基础知识。别小看了这些基础,我朋友水平一流,结果就栽在一到基础知识的问题下,和高薪无缘。

好了废话少说,开始正题。

start


如何顺利通过“企业小组面试”2010年01月21日 星期四 22:26
  各位职场人有没有发现,现在越来越多的企业采取小组面试(PanelInterview)。似乎这种面试的形式逐渐成为一种流行的趋势。不仅是初级员工,包括很多高级人才和职业经理人,在面试中与多个面试官交谈变得越来越普遍。其实很多人面对这种情况,都是怀着惶恐的心情对待这种小组面试,其实不必这样。如果你有充足的准备,这种面试反而能够成为一种非常有效和有益的过程。我也算的上是个面霸了,根据我的一些经验,总结出一些简单的技巧和大家一起讨论:

1关注小组面试的积极方面

小组面试像任何其他的面试一样,只是面对的面试官较多而已。你不要被“所有的眼睛注视你”而感到恐惧,而是要思考小组面试为您带来的高效率。参加小组面试的候选人一般会在企业做出招聘决定前经历较少的面试次数。小组面试降低了候选人被不同的面试官提问多余的问题,也不必在多次面谈中反复说明你的面试策略。

2特别要关注具体细节

在一对一的面试中,迟到或者穿着不当都很不利。这些判断错误如果被小组面试官同时看到肯定会扩大影响。

3与面试小组的每个成员见面时,都要索取对方的名片

面试开始之前,可以把名片放在你面前,指向特定的面试官,这样有助于你记住面试官的名字。面试时确认每个人的名字,个性化地回答对方提出的问题,并与小组成员建立融洽的关系。

4不要以为头衔最高的人就是决策者

通常业务领袖依靠其团队帮助来对候选者做出选择,这个过程肯定要包括参加面谈的每个人。如果小组中的一个人询问您问题,要对这个人做出反应后再开始回答问题,但目光也要与他人进行交流,与房间内的每个人建立融洽的交流。

5尝试估计每个人的不同需求

marketing,operation和sales等工作的需求会有所不同,所以一定要确保你展示的成功故事,将能引起参加面试的不同业务主管的共鸣。

6认识到该集团的活力

小组面试可以让你更好地了解小组成员的互动和作为一个团队的协调工作能力。这些微妙但重要的线索往往在一对一的面谈错过了。在面试阶段观察小组的动态状况可以帮助您对企业的文化做出更好的决策,同时也有助于你把握如何更好地适应这个团队。

7给小组的每个成员发送感谢信,并确保每一封信都是独特的。

感谢信是一个与招聘团队联系的最有力工具。为了体现你的真诚可信,你需要对每个成员分别表达你的谢意,要避免千篇一律的内容。尝试把重点放在与面试你的每个人的交流方面。

值得大家思考的是:求职者,特别是很多资深人士要牢记这些集体的决策者,因为从长远观点来看,这样做是值得的


end

start


毕业生如何顺利通过面试关2008-06-04 13:11参加面试是求职者应聘的重要环节。求职者要在应聘面试中取得成功,就要了解到,用人单位的招聘原则是在适合本单位某项工作要求的前提下找到优秀的人选,即“最合适、最优秀”原则。为此,应聘者不但要在面试中展示自己的优秀才华和素质,还要让面试考官认为自己是最适合该单位该工作的。不同的用人单位有不同的用人标准和要求,但是优秀的用人单位总是在“诚实、正直、踏实、合作、潜力、技能”等方面有大体一致的要求。这些基本素质和技能不仅体现于个人的求职材料,还体现于应聘面试的方方面面。 一、着装得体 根据季节需要着装,尤其是一些小细节,比如说,衣襟是否平整,纽扣是否系全等,都不能忽视,如果穿着凌乱,不注意小节,用人单位会因此联想到毕业生今后的工作态度也会不认真、不严谨,会给用人单位留下不好的印象。 二、做到知己知彼 应聘面试要知己知彼。“知己”,就是充分分析自己的职业倾向和实力,做好职业定位和职业选择,要有目的去应聘。“知彼”的内容主要有:首先须了解用人单位和所求职位的情况,还要熟悉该单位招聘面试的特点和程序,了解用人单位的名称、产品、经营情况、企业文化、用人理论等。 三、做好心理准备 毕业生一定要轻松自信把握机会,其实面试就是考核毕业生的心理素质,如果自己都有给自己自信,那如何能面对考官的质疑,一定要相信自己能行。应聘面试的心理准备包括:首先要有一颗平常心。心情越平静,越有利于发挥个性与才干。其次,要培养自己的信心。对应聘面试要在战略上重视,战术上藐视,要相信,既然自己有面试的机会就证明自己有优势把能力和知识展示出来。再者,要有抗挫折的心理准备。即使这次不成功,还有其他的机会,决不能因这一次面试失败就心灰意冷,失去信心。最后,要调节好自己的心情。心情会影响你给人的第一印象,所以愉快的心情也能感染面试者。 四、准备几个问题 面试主要是考察毕业生对单位和职位的了解程度、毕业生的专业知识和技能,以及他们的社会意识、综合素质、敬业精神等。所以在谈话和提问式的面试中,总有一些问题是面试者常常提问的,例如:“简单地自我介绍”、“为什么要应聘这个职位”、“你认为你为什么能胜任这个工作”、“你能不能举两个例子来证明你刚才所说的能力和素质”、 “你的优势劣势有哪些”、“你期望的工作是什么样子的,你是如何为自己设计职业生涯的”等等。所以要根据所了解的情况和自身情况对回答进行精心准备与设计。 五、掌握应答技巧 应答是应聘面试的重头戏,面试者要掌握面试应答技巧。  1、发音清楚掌握节奏 面试时要注意发音清楚,掌握节奏。在回答考官的问题时,毕业生讲话的声音要以坐得最远的考官能够清楚地听到你的回答为标准,讲话节奏快慢以考官能够完整地听清你的含义,略有思考为标准,毕业生应多加练习,面试时注意掌握情况,视情况而定。   2、保持诚信 其实说到底,面试就是要向企业展现最优秀的自己,这其中没有捷径,更不存在投机取巧,诚实是唯一的技巧。求职者千万不要心存侥幸,在简历中灌水,肆意吹嘘自己的能力和经验,须知企业的招考官阅人无数,早已炼就识珠慧眼,加之兼备胜任力模型和行为面谈法,任何夸大和不实都无处遁形。即便是通过了面试这关,求职者在日后的实习工作当中也难免会因为能力不济而原形毕露,大吃苦头。 3、应对得体 很多初涉职场的求职者在见到面试官时都表现得精神紧张,手足无措,做出许多下意识的动作,比如不停的搓手,玩弄小饰物,转笔,抖动双脚,不敢抬头,眼神游离等,殊不知正是这些细微的动作出卖了你紧张的内心,给面试官留下胆怯失措、唯唯诺诺的印象,其面试结果也可想而知。正确的方式应该是平稳自己的情绪,端正自己的坐姿,敢于与面试官进行眼神交流,在倾听对方讲话时将身体略微前倾,让对方感受到你对工作的重视及诚意。声音保持平稳洪亮,清晰流畅的表达自己的所思所想,展现自己的风采特长。 4、礼仪细节 还有一些求职者不太注重职场礼仪,认为这些细微琐碎的事情无关痛痒,然而这些细节往往会影响到面试的成绩。面试时自觉敲门,并主动向面试官问好、握手或鞠躬致敬,面试时坐姿应端正,坐在椅子上,身体略微前倾,两手自然放在两膝上,自如大方,切勿有抖动腿、翘二郎腿等小动作。同时,在进考场时,也要注意一些桌椅摆放位置是否端正等小细节,那些也许就是考官的一些小测试,毕业生遇此情况,一定留心纠正,摆正。面谈结束后记得将座椅归位,如果能够询问是否需要将门敞开或带上就更加完美了。 我们毕业生如何在面试前对以上几个方面多加了解和练习,一定会在面试中取得良好的效果,在求职中获得成功


end

1、面向对象的特征有哪些方面

1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

  1. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。

 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。

SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。

对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。

对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。

Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

start


查看文章
JAVA 程序员面试必读!2009-12-04 15:52 面试是一个“简单”而又“复杂”的事情,正因为它具有“简单”和“复杂”的双重性质,才使我们对这个问题不敢掉以轻心。介绍如何面试,有时候甚至可以写一本书,而有时候,你什么都不准备却可以面试成功。
因为,面试的成功与否完全取决于主考官,因此,这门学问的主要科目就是研究主考官的招聘心理。
我们研究好主考官的招聘心理,自然就可以做到“知己知彼”了。
本小节只是说说面试的“心理战”,而想真正的能够对答如流,需要的是“真功夫”,要想具备“真功夫”还是需要真正的技术水平作为前提的,本小节的内容只是给那些已经具备相应技术水平的应聘者提供一定的应聘技巧而已,以避免没有把自己的“真功夫”完全展示出来从而丧失工作机会。
面试前对自己的心理暗示:
面试并不是考试,只是和未来的同事聊聊天。

“心理战”对象,可能出现的主考官如下几类:
人物1,人力资源部主管(HR)
人物2,你未来的主管
人物3,你未来主管的主管

我们分别来分析遇到不同类型的主考官的不同情况。
人物1:人力资源部主管(HR “人物1”的出现往往是进行该职位的初审,给出一个概观定论,如果合格将会提交给“人物2”。“人物1”他们所要进行的是对人的心理和基本技能方面的一个判断。
不过,也有一些公司,首次面试仍然是由业务主管来进行,然后再将初审合格的人交给人力部门来复试,如果,是这种情况,你应该就算90%入职成功了,因为,这个复试往往是走个形式,看看此人有没有被主管忽略的大问题,如果没有,基本就差不多了。
那么,我们仅仅以第一种情况为例,看看“人物1”大多提出的是哪些问题。
常见提问1:请你自我介绍 这个问题,是人力部主考官必问的问题,这个问题的提问并不是真的想了解你的个人情况,因为,你的情况基本上在简历上都写着呢。他提出这个问题的主要目的是来考察你的语言表达能力,和你在表达过程中的一些细节表现。
所以,我们应该怎么回答呢?
看看如下对话:
HR:“请你自我介绍一下”
A君:“您看简历吧,基本上我都写在简历上了。”
HR:汗… HR:“请你自我介绍一下”
B君:“我叫XXX,年龄24,性别男,籍贯……”
HR:倒
HR:“请你自我介绍一下”
C君:“这话从何说起呢?话说10年前……”
HR:晕…

    首先,不要认为主考官没有认真的看你的简历,没有看你的简历就让你来面试,是在浪费他自己的时间,所以绝对是首先认为简历比较合适,才约你来的。
    第二,自我介绍并不是让你重复一下你简历上的所有内容,那些内容简历上都有,主考官主要是想听听你如何表达和语言的逻辑能力。
    第三,这个表达不要滔滔不绝,要有张有弛,有收有放,主要将自己的想说的优势部分分别道来,能够通过你的介绍让人感觉到你的“亲和力”为佳。

    “语言表达能力”并非我们日常所说的“能侃”或者“口才”,这是片面的理解,在面试过程中,我们要展现的“语言表达能力”是指,“语言亲和力”,能够让人感受到你的“沟通”能力。

回答范例:
您好!我来自XXX大学,是应届毕业生,所学专业是计算机应用技术,我在校期间参加多项课余工作,参与了多个应用系统的开发与设计,熟练掌握Java开发工具和应用系统的各种开发方法。在学习与工作期间,总结与实践了各种技术实现手段,有了一些小的积累。
近期已经毕业,看到您公司的招聘信息,感觉自己的技术与能力非常合适,就投递了简历。希望能过了您这关,呵呵……(注:最后的微笑最好不要太牵强,目的是缓和气氛)

大家看到了,这个回答范例的自我介绍非常简练,但是,什么也没有落下。
既实事求是的说了自己是应届毕业生,又说明了自己虽然是应届毕业生,但是参加了很多的课余工作,并且具有实际的项目开发经验,而且有了一些小的积累。
既说了自己的对这份工作和自己能力之间的考量,又表达了自己对主考官的期望。
意思表达时不卑不亢,言简意赅,让人听起来就感觉很舒服。 这时候你的目的就达到了,展现出自己的“语言表达能力”和“语言亲和力”,同时又能够让人感受到你的“沟通”能力。

常见提问2:你最大的优点是什么?

这个问题如果是HR问,则最好回答了。
回答这个问题的关键是“围绕自己的技术特长”展开话题,为什么这样?
因为,往往HR都不懂技术,围绕技术说自己的特长很容易给他说晕(当然,个别懂技术的HR除外)。这里要注意的是,在说技术问题的时候,不要让HR感觉自己什么都不懂,要注意说话的节奏,不要太快,不要太骄傲。

常见提问3:你最大的缺点是什么?
这个问题是HR的杀手锏,可以说这是HR的狠招,这个问题最难回答,一般应聘者都本着“扬长避短”的心态去面试,冷不防冒出这么一个问题,还真是挺棘手的。
需要清楚HR问这个问题的目的,其目的仍然不是要真的需要知道你的缺点是什么,还是看看你的表达能力,尤其是需要考察应聘者面对危机的时候的处理能力。
所以,我们不要用下列方式作答:

1、说出自己的真实缺点,尤其是在前面谈话中没有暴露出来的缺点
2、认为说说某些大众化的缺点即可,认为说一两个无妨
3、说自己没有缺点,强调自己比较完美

总之,HR心里想的是:需要了解他面前的这个人在面对困难的时候,是如何处理问题的,从处理危机的方法来判断此人的处理事情的灵活性。当然,如果此人自己暴露出自己的缺点当然更好,省得需要去想办法问更多的问题去发现了。
所以,在回答这个问题的时候,要看起来“真诚”、“坦白”,同时,说出来的并非自己的缺点,而是最好在别人看来是优点的那些方面。
这个问题问的概率很大,通常如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,肯定不会录用你。HR喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,目的还是突出自己优点的部分。

HR喜欢聪明的求职者。

这一点比较难掌握,我们也给出范例:

回答范例:

呵呵,这个问题好难回答啊!我想想……(亲和力表现,也缓解了自己的紧张情绪)
我的缺点是,比较执着,比如在技术方面比较爱钻研,有的时候会为一个技术问题加班到深夜。还有就是,工作比较按部就班,总是按照主管的要求完成任务。另外的缺点是,总在自己的工作范围内有创新意识,并没有扩展给其他同事。这些问题我想我可以进入公司以后以最短的时间来解决,我的学习能力很强,我相信可以很快融入公司的企业文化,进入工作状态。
嗯……,我想就这些吧。

这个回答范例开头第一句话就让人觉得很自然,因为这个求职者所说的话恰恰表达了一般人听到这个问题后的心理状态,还有你一定会有一个思考的时间,因为,谁也不会立刻说出自己的缺点。
后面说出的几个缺点都是一环套一环的,说了自己“比较执着”,但又说自己其实是“比较爱钻研”,说自己总是“按部就班”,但又补充了其实那是“按照主管的要求完成任务”,这时候,如果用人单位觉得,此人是不是没有“创新思维”的时候,马上就补充道“在自己的范围内有创新意识”,至于“没有扩展给其他同事”这件事,其实无关紧要,干脆就卖给HR吧。

以上回答确实卖弄了些“技巧”,相信HR也一定能看的出来,但是,即使看出来了也无妨,HR也会心领神会,知道你是一个比较善于沟通并且善于表达的人。

人物2:你未来的主管

当见到未来主管的时候,往往是应聘者已经过了HR那一关,或者应聘者已经过了笔试的那一关,因此见到这位人物意味着距离成功已经向前进了一步。
“人物2”的面试也有他的目的,他是和你在日常工作中接触最多的人,作为你的直接上司,他需要在工作中经常给你分配任务,他需要对他的主管负责,因此,他招聘的这个人选必须是可以帮助他完成他整个Team的目标的人。
往往那个吸引你来面试的“招聘启示”就是这个人物所撰写的,因此,其实在你和他见面以前,早已经通过“招聘启示”和他有过交往了。因此,从“招聘启示”中就可以初显这位主管的端倪。
注意,主管同志并不是人事领域的高手,不会用各种语言技巧去发掘你身上的缺点或者优点,往往问题都是实打实的,或者比较一针见血的,而且,更偏重于日常工作。
那么,我们下面和他过过招。

常见提问1:请你自我介绍一下 这个问题,HR也问过了,到他那里有可能还会问,主管问这个问题和HR虽然问的问题一致,但是,其目的并不是完全相同的。
他不仅仅想考察一下你的表达能力,同时还想考察一下你思路的清晰程度。
我们在回答他的问题前,一定要想清楚一件事:他是该技术领域的高手,就是我们“程序员修炼三境界”中描述的“第二层境界”的那个人物,如果还想更清楚的了解这个人物,可以去重新看看前面的那个章节。
这个自我介绍最好说的较为简洁,不要过分炫耀自己的技术如何如何强,免得引起这位主管的兴趣,引起他的技术兴趣没有什么好处,只会带来更多的技术问题的发问。

常见提问2:你最引以为自豪的项目是什么?

他问这个问题的意图是想考察你的成长路径和编程习惯,因为,最让你自豪的项目往往是你成长最快的项目,那个成长最快的项目往往会给你今后的编程习惯留下很多痕迹。
所以,通过你对那个引以为豪的项目的描述,有经验的他会很快锁定你技术成长中的缺陷和闪光点,从而判断是否能够“为我所用”。
你最好拿出一个自己最擅长技术的那个项目进行介绍,这个项目最好能够比较贴近招聘要求的那些指标。如果,没有做过什么有规模的正规项目,你就拿些自己非常擅长或者有创意的开发作品来说。这样做的好处是,他听完你的介绍后,会接下来进行提问,他所有发问,你都成竹在胸了。
切忌拿一个别人的项目,或者自己参与很少的项目来介绍,如果这样的话,一旦他深入的询问这个项目的问题,很可能你会所答非所问,反而造成更严重的影响。你大可以和他大谈特谈你在那个项目中获得的经验,那会引起此君的共鸣,有可能的话,说出一些你自己的小技巧,他会很高兴。
常见提问3:如果我录用你,你将怎样开展工作
他问这个问题的意图是,希望看看你对这个职位工作展开的一些设想,仍然是“实打实”从工作出发来提问的。所以,你在回答这个问题的时候也要“实打实”,切忌虚无缥缈的一通“高、大、全”。
一般要列出自己的入职之后的工作计划,而这些计划需要详尽,同时需要体现出你工作的严谨性,也不能是想当然的说出一些与工作无关的计划,这都有可能适得其反。

回答范例:

针对这个如何展开工作的问题,我目前仅仅是对咱们公司的大体情况有一个了解,因此,对这个职位的工作性质仅仅是自己的一个理解。
所以呢,我也不知道是否合适,我只能说一个大概。
作为这个职位而言,我想我首先要对本公司的主营业务要有一个相当的了解,了解我们公司的业务组成部分、业务的发展方向、我们面向的客户性质等等。
第二,我要了解所属部门在公司中的地位,以及部门的工作目标,从而确定自身的工作努力方向。
第三,了解我参与项目的开发方式,架构方式,紧密配合领导工作,尽快投入具体的开发工作。
这就是我开展工作的计划。

从大到小的方式进行了解,这么说可以让领导知道你不是一个盲目工作的人,而是一个按部就班,稳扎稳打的人,使人觉得和你合作很踏实。另外,一定要强调所属项目或部门的目标,因为这关系到面试你的主管的切身利益。最后,强调“尽快”投入开发工作,这样,领导就放心了,你不是一个“只了解,不工作”的人。

面对主管唯一要尽量表现的就是,你看起来非常像一个“工具”,入职后马上就可以发挥作用。

人物3:主管的主管

遇到“主管的主管”的时,往往已经是复试,这说明基本上已经是最后一关了。但要注意,这个最后一关是非常关键的一“关”。因为,往往如果你未来的主管在公司中某个专业够权威的话,他的主管一般不会管招聘的事情。因此,你看到这位“老大”的原因,多半是你未来的那位主管的专业地位还没有“稳定”。

最后的“搏杀”

过程大概是这样的,一般会将两个或三个人提交给“老大”,让“老大”定夺,去选择其中的一个人,因此,这个阶段是一个最后的“搏杀”关键阶段。
老大”关注的问题:成本+人员素质
所以,我们在和“老大”过招的时候,一定要注意自己的言行,切忌不要穿“奇装异服”,或者男士留有个性的头发或胡子,总之一定要让人看起来特别的“平常”,虽然不是“西装革履”但也要“衣冠整洁”。

因为,老板们最不喜欢“个性”员工,而最喜欢的是“优秀”的普通员工


end

start


2008/07/08 13:40问题一:我声明了什么!

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在绝大多数情况下并不是推荐的做法,应当好好利用多态。
Trackback : CSDN


end

start


初学Java必知的30个概念2009-04-18 08:55基本概念:
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why。所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大 限度上提高复用率。

2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)。

3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)。

4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。

5.对象的3个主要特性

ehavior—说明这个对象能做什么。

tate—当对象施加方法时对象的反映。

dentity—与其他相似行为对象的区分标志。

每个对象有唯一的indentity 而这3者之间相互影响。

6.类之间的关系:
use-a :依赖关系

has-a :聚合关系

is-a :继承关系–例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)

7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。

例:Data类的构造器叫Data

ew Data()—构造一个新对象,且初始化当前时间。

Data happyday=new Data()—把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者是不同的.new返回的值是一个引用。

构造器特点:构造器可以有0个,一个或多个参数; 构造器和类有相同的名字;一个类可以有多个构造器;构造器没有返回值;构造器总是和new运算符一起使用。

8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。

9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包。java.lang java.util java,net等,包是分层次的所有的java包都在java和javax包层次内。

10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。

11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类)。

12.多态:在java中,对象变量是多态的.而java中不支持多重继承。

13.动态绑定:调用对象方法的机制。

(1)编译器检查对象声明的类型和方法名。
(2)编译器检查方法调用的参数类型。

(3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。

(4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。

(5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。
14.final类:为防止他人从你的类上派生新类,此类是不可扩展的。
15.动态调用比静态调用花费的时间要长。

16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。

例: public abstract string getDescripition
18.object类中的equal和toString方法。

equal用于测试一个对象是否同另一个对象相等。
toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示。

(toString 方法是一个很重要的方法)

19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。

20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大校

21.class类 object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。

22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大。

  A.在运行时分析类的能力。

  B.在运行时探察类的对象。

  C.实现通用数组操纵代码。

  D.提供方法对象。

而此机制主要针对是工具者而不是应用及程序。

反射机制中的最重要的部分是允许你检查类的结构.用到的API有:

  java.lang.reflect.Field 返回字段。

  java.reflect.Method 返回方法。

  java.lang.reflect.Constructor 返回参数。

  方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。   

23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface。

24.接口不是一个类,而是对符合接口要求的类的一套规范。若实现一个接口需要2个步骤:

  A.声明类需要实现的指定接口。

  B.提供接口中的所有方法的定义。

  声明一个类实现一个接口需要使用implements 关键字class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口。

25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable
26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。

例:ActionListener 接口监听。
类似的API有:

java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit

27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。

28.内部类:一个内部类的定义是定义在另一个内部的类。原因是:

  A.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

  B.对于同一个包中的其他类来说,内部类能够隐藏起来。

  C.匿名内部类可以很方便的定义回调。

  D.使用内部类可以非常方便的编写事件驱动程序。

29.代理类(proxy):

A.指定接口要求所有代码
B.object类定义的所有的方法(toString equals)

30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型。

17.Java中的每一个类都是从Object类扩展而来的。

JAVA程序员必读:基础篇(8)2007-07-23 09:492.6什么是接口

接口是一个收集方法和常数表单的契约。当类执行一个接口,它就许诺声明在那个接口中执行所有的方法。

接口是一个设备或者一个系统,它是用于交互的无关的实体。根据这个定义,远程控制是一个在你和电视的接口;而英语是两个人之间的接口;强制在军事中的行为协议是不同等价人之间的接口。在JAVA语言中,接口是一个设备,它是用来与其它对象交互的设备。一个接口可能对一个协议是类似的。实际上,其它面向对象语言有接口的功能,但它们调用它们的接口协议。

自行车类和它的类分级结构定义了什么是自行车。但是自行车在其它方面与现实世界交互作用,例如,仓库中的自行车可以由一个存货程序来管理。一个存货程序不关心管理项目的哪一类只要项目提供某一信息,比如价格和跟踪数字。取代强迫类与其它无关项的关系,存货程序建立了通讯的协议。这个协议是由包含在接口中的常数和方法定义组成的。这个存货清单接口将要定义(但不执行)方法来设置和得到零售价格,指定跟踪数字等等。

为了在存货清单程序中操作,自行车类必须在执行接口的时候遵守这个协议。当一个了执行一个接口的时候,类遵守定义在接口中的所有方法。因此,自行车将为这些设置和获得零售价格并指定跟踪数值等等的方法提供执行。

你可以使用接口来定义一个行为的协议,这个行为可以有在类分级结构中任何类来执行。接口的主要好处有一下几点:

不用人工强迫类关系在无关类中截获相似处。

声明想执行的一个或者更多类的方法。

在不暴露对象的类的前提下,暴露对象的编程接口。
2.7怎样将这些面向对象的概念转换为代码

这一小节将给你展现创建对象、执行类、发送消息、创建一个父类以及执行一个接口的代码。

以下是一个applet(applet是用JAVA编程语言编写的程序,它可以运行在兼容JAVA平台的网络浏览器,比如HotJava或者Netscape Navigator)的程序,名为ClickMe。如图10所示,当你点击方框内任何地方,一个红点就会出现。

(图10)

提示:上面的applet需要JDK1.1。如果你使用老的不支持JDK1.1的浏览器,你将不能运行这个applet。相反,你需要在一个1.1浏览器上来看这个网页,比如在HotJava、JDK Applect浏览器(appletviewer)或者某个版本的Netscape Navigator和Internet Explorer。

下面具体解释一下这个Applet。

ClickMe Applet是一个相对简单的程序因此它的代码就短了多了。但是,如果你还没有太多的编程经验,你可以发现这些代码也不是那么容易的。我们不要求你马上理解程序中的每个问题,并且这节教程也不是讲了十分详细的。这里的目的示暴露一些源代码给你并且跟你刚才所学道的概念和技术联系上。你将在以后的教程中学到更详细的内容。

2.7怎样将这些面向对象的概念转换为代码

2.7.1ClickMe的源代码和Applet标签

为了编译这个applet你需要两个源文件:ClickMe.java和Spot.java。为了运行这个applet你需要利用这个applet标签来创建一个html文件:

<applet code=“ClickMe.class”

width=“300” height=“150”>

其中ClickMe.java的源代码为:

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class ClickMe extends Applet implements MouseListener {

private Spot spot = null;

private static final int RADIUS = 7;

public void init() {

addMouseListener(this);

}

public void paint(Graphics g) {

//画一个黑边框和白背景

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

g.setColor(Color.black);

g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

//画红点

g.setColor(Color.red);

if (spot != null) {

g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2);

}

}

public void mousePressed(MouseEvent event) {

if (spot == null) {

spot = new Spot(RADIUS);

}

spot.x = event.getX();

spot.y = event.getY();

repaint();

}

public void mouseClicked(MouseEvent event) {}

public void mouseReleased(MouseEvent event) {}

public void mouseEntered(MouseEvent event) {}

public void mouseExited(MouseEvent event) {}

}

而Spot.java的源代码为:

public class Spot {

public int size;

public int x, y;

public Spot(int intSize) {

size = intSize;

x = -1;

y = -1;

}

}

然后装载网页到浏览器或者appletviewer工具。并且确保所有必要的文件都在相同的目录中。 如图11所示:

(图11)
2.7.2 ClickMe Applet中的对象

在这个applet中有许多对象。两个最明显的是:applet本身和红点。

浏览器在包含applet的HTML代码中碰到applet标签的时候就创建了applet对象。这个applet标签从创建applet对象的地方提供类的名字。在本例子中,这个类的名字为ClickMe。

ClickME.applet将创建一个对象来在屏幕上画出点。每次你在applet中点击鼠标的时候,applet就将通过改变对象的x和y坐标来移动红点。这个点不是自己画出来的,它是applet画出的,它是根据包含在点对象中的信息画出的。

除了前面两个明显的对象,另外还有一些看不见的对象呢。有代表三种颜色(黑、白、红)的三个对象以及代表点击鼠标的用户动作的事件对象等等。
2.7.3ClickMe Applet中的类

因为代表在屏幕上点的对象是很简单,接下来让我们看看这个名为spot的类吧。它声明了三个实例变量:包括点半径的size,包含点当前水平位置的x坐标以及包含点当前垂直位置的y坐标:

public class Spot {

//实例变量

public int size;

public int x, y;

//构造函数

public Spot(int intSize) {

size = intSize;

x = -1;

y = -1;

}

}

另外,类有一个构造函数,它用来初始化由类创建的新对象。构造函数跟类有相同的名字。这个构造函数初始化所有三个对象的变量。Size的初始化数值是在调用的时候座位参数提供的。x和y变量都被设置为-1,这里-1的目的是为了让点在开始的时候处于屏幕的外面,即产生假不可视的效果。

这个applet是在applet初始化的时候创建了一个新的点对象。下面是applet类的相关代码:

private Spot spot = null;

private static final int RADIUS = 7;

spot = new Spot(RADIUS);

第一行声明了一个名为spot的变量,它是Spot数据类型,并且初始化这个变量为NULL。第二行声明了一个整型变量,名为RADIUS,它的值为7。最后一行是创建一个对象。New关键字为对象分配了内存空间。Spot(RADIUS)调用了上面已经描述了的构造函数并且传递RADIUS数值,这样点对象的size就被设置为7。如图12所示的左图代表了Spot类,而右边的是代表了spot对象。

(图12)
2.7.4ClickMe Applet中的消息

就如所知道的,对象A可以使用消息来请求对象B做一些事情,一个消息有三个组成部分:

消息被寻址的对象

要执行执行方法的名字

方法需要的任何参数

在ClickMe applet种有以下两行这样的代码:

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

这两个消息都是从applet到名为g的对象。其中g是一个图形对象,它知道怎样在屏幕上简单画一些形状或者文本。这个对象在浏览器指示applet来画的时候提供了applet。上面代码的第一行设置颜色为白色,第二行是填充一个指定大小的矩形区域,它的颜色为白色。如图13所示,是一个消息的三个组成部分:

(图13)
2.7.5 ClickMe Applet中的继承

为了在浏览器种运行,对象必须是一个applet。这就意味着对象必须是类的一个实例,这个类是从由JAVA平台提供的Applet类派生而来的。

ClickMe applet对象是一个ClickMe类的一个实例,它是这样声明的:

public class ClickMe extends Applet implements MouseListener {

}

上面的语句就产生了Applet的一个子类。ClickMe继承了父类的许多功能,包括初始化、由浏览器来开始和结束、在浏览器区域画图以及对接收到的鼠标事件注册。除了有了这些功能,ClickMe类还要实现以下的功能:它的画图代码在paint的方法中,初始化代码必须在init方法中等等。

public void init() {

… // 这里加入ClickMe的初始化代码

}

public void paint(Graphics g) {

… // 这里加入ClickMe的画图代码

}

2.7.6 ClickMe Applet中的接口

ClickMe applet是通过在鼠标点击出显示一个红点来响应鼠标的点击事件。如果对象想通知鼠标点击,JAVA平台事件系统需要对象执行MouseListener接口。这个对象必须同时作为鼠标监听器来注册。

这个MouseListener接口声明了五种不同的志芋工,每种方法是用在鼠标被点击的时候对不同鼠标事件的调用。当鼠标被点击的时候,或者当鼠标移动到applet外面的时候等等。

下面是ClickMe applet完整的代码。其中mousePressed是处理鼠标事件的:

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class ClickMe extends Applet implements MouseListener {

private Spot spot = null;

private static final int RADIUS = 7;

public void init() {

addMouseListener(this);

}

public void paint(Graphics g) {

// 画一个黑色边框和一个白色背景

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

g.setColor(Color.black);

g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

//画一个点

g.setColor(Color.red);

if (spot != null) {

g.fillOval(spot.x - RADIUS,

spot.y - RADIUS,

RADIUS * 2, RADIUS * 2);

}

}

public void mousePressed(MouseEvent event) {

if (spot == null) {

spot = new Spot(RADIUS);

}

spot.x = event.getX();

spot.y = event.getY();

repaint();

}

public void mouseClicked(MouseEvent event) {}

public void mouseReleased(MouseEvent event) {}

public void mouseEntered(MouseEvent event) {}

public void mouseExited(MouseEvent event) {}

JAVA程序员必读:基础篇(2) (一些图片例子已经不存在所以删除了!可惜)2007-08-29 18:132.4.2初始化实例和类成员

下面讲讲初始化实例和类成员:

你可以在类中定义它们的时候,使用static初始化程序和实例初始化程序来为类和实例成员提供初始化数值:

class BedAndBreakfast {

static final int MAX_CAPACITY = 10;

boolean full = false;

}

这个对于原始数据类型是没有问题的。有时候,它可以用在创建数组和对象。但是这个初始化表单有它的限制,如下:

初始化程序只可以执行用赋值语句表达的初始化 。

初始化程序不能调用任何的包含异常错误的方法。

如果初始化程序调用一个包含异常错误的方法,它不能进行错误恢复。

如果你有一些初始化要完成,可能有些不能在初始化程序实现,因为出现了上面的限制之一,这时你不得不将初始化代码随意放置了。为了初始化类成员,在static初始化块中放置初始化代码。为了初始化实例成员,就要在构造函数中放置初始化代码了。
2.4.3 Static初始化块

下面再讲讲Static初始化块

errorStrings源代码必须在static初始化块中被初始化。这是因为错误恢复必须在源代码没有被找到得时候才被执行。同时,errorStrings是一个类成员,它不能在构造函数中被初始化。在前面得例子中一,一个static初始化块是以static关键字开头得,并且JAVA代码是用大括号“{}”括起来的。

一 个类可以有许多static初始化块,它可以出现在类中任何地方。系统保证static输出化块以及static初始化程序是按它们在源代码中的顺序被调用的。

2.4.4 初始化实例成员

如果你想初始化一个实例变量而且不能在变量声明处来处理它,那么就只能在构造函数中来为这个类初始化了。假如errorStrings是一个实例变量而不是一个类变量,你就可以使用以下的代码来初始化它:

import java.util.ResourceBundle;

class Errors {

ResourceBundle errorStrings;

Errors() {

try {

errorStrings = ResourceBundle.

getBundle(“ErrorStrings”);

} catch (java.util.MissingResourceException e) {

// error recovery code here

}

}

}

现在代码是在构造函数中为类来初始化这个errorStrings的。

有时,类包含了许多构造函数并且每个构造函数允许调用者为新对象的不同实例变量提供初始化数值。比如,java.awt.Rectangle有以下的三个构造函数:

Rectangle();

Rectangle(int width, int height);

Rectangle(int x, int y, int width, int height);

Rectangle()构造函数没有任何的参数,所以它不能让用户大小或者原点和大小提供初始化数值;而其它的两个构造函数,它可以让用户设置初始数值。

然而,所有的实例变量(原点和大小)都必须初始化。在这个例子中,类经常有一个构造函数来完成所有的初始化。其它的构造函数调用这个构造函数并且提供给它参数或者缺省数值。比如下面是以上所说的三个构造函数,它们初始化如下:

Rectangle() {

this(0,0,0,0);

}

Rectangle(int width, int height) {

this(0,0,width,height);

}

Rectangle(int x, int y, int width, int height) {

this.x = x;

this.y = y;

this.width = width;

this.height = height;

}

JAVA语言支持实例初始化块,你可以放心使用它。这里建议使用构造函数来初始化,主要有以下三个原因:

所有的初始化代码处在一个地方,这样使得代码更容易维护和阅读。

缺省值可以清除地知道。

构造函数广泛被JAVA程序设计人员所熟悉,包括相对新的JAVA程序设计人员,而实例初始化程序不能,而且他可能导致其它JAVA程序设计员的困惑。

2.4.5 对象和类
  你可能会注意到对象和类看起来很相似。在现实世界中,类和对象之间的区别经常是让程序员困惑的源泉。在现实世界中,很明显,类不能是它们描述的对象本身。然而,在软件中很困难来区分类和对象。有部分原因是软件对象只是现实世界中的电子模型或者是抽象概念。但是也因为对象通常有时是指类和实例。

2.5什么是继承

一个类可以从它的父类继承状态和行为。继承为组织和构造软件程序提供了一个强大的和自然的机理。

总得说来,对象是以类得形式来定义得。你可能现在已经可以从它类知道许多对象了。即使你如知道,如果我告诉你它是一辆自行车,你就会知道它有两个轮子和脚踏板等等。面向对象系统就更深入一些了,它允许类在其它类中定义。比如,山地自行车、赛车以及串座双人自行车都是各种各样的自行车。在面向对象技术中,山地自行车、赛车以及串座双人自行车都是自行车类的子类。同样地,自行车类是山地自行车、赛车以及串座双人自行车的父类。  每一个子例从父类中继承了状态。山地自行车、赛车以及串座双人自行车共享了这些状态:速度等。同样,每一个子类继承类从父类的方法,山地自行车、赛车以及串座双人自行车共享了这些行为:刹车、改变脚踏速度等等。

2.5什么是继承

然而,子类不能受到父类提供的状态和行为的限制。子类可以增加变量和方法到从父类继承而来的变量和方法。比如,串座双人自行车有两个座位,这是它的父类没有的。

子类同样可以重载继承的方法并且为这些方法提供特殊执行方法。比如 ,如果你有一个山地自行车有额外 的齿轮设置,你就可以重载改变齿轮方法来使骑车者可以使用这些新的齿轮。

你也不能受限于继承的一个层次。继承树或者类的分级结构可以是很深。方法和变量是逐级继承的。总的来说,在分级结构的越下方,就有越多的行为。

如果对象类处于分级结构的顶端,那么每个类都是它的后代(直接地或者是间接地)。一种类型的对象保留任何对象的一个引用,比如类或者数组的一个实例。对象提供了行为,这些行为是运行在JAVA虚拟机所需要的。比如,所有类继承了对象的toString方法,它返回了代表对象的字符串。

下面说说我们为什么要使用继承,它到底有哪些好处呢?好处是有的:

子类提供了特殊的行为,这是在父类中所没有的。通过使用继承,程序员可以多次重新使用在父类中的代码。

程序员可以执行父类(称为抽象类)来定义总的行为。这个抽象的父类可以定义并且部分执行行为,但是绝大多数的父类是未定义和未执行的。其它的部分由程序员来实现特殊的子类.2.6什么是接口

接口是一个收集方法和常数表单的契约。当类执行一个接口,它就许诺声明在那个接口中执行所有的方法。

接口是一个设备或者一个系统,它是用于交互的无关的实体。根据这个定义,远程控制是一个在你和电视的接口;而英语是两个人之间的接口;强制在军事中的行为协议是不同等价人之间的接口。在JAVA语言中,接口是一个设备,它是用来与其它对象交互的设备。一个接口可能对一个协议是类似的。实际上,其它面向对象语言有接口的功能,但它们调用它们的接口协议。

自行车类和它的类分级结构定义了什么是自行车。但是自行车在其它方面与现实世界交互作用,例如,仓库中的自行车可以由一个存货程序来管理。一个存货程序不关心管理项目的哪一类只要项目提供某一信息,比如价格和跟踪数字。取代强迫类与其它无关项的关系,存货程序建立了通讯的协议。这个协议是由包含在接口中的常数和方法定义组成的。这个存货清单接口将要定义(但不执行)方法来设置和得到零售价格,指定跟踪数字等等。

为了在存货清单程序中操作,自行车类必须在执行接口的时候遵守这个协议。当一个了执行一个接口的时候,类遵守定义在接口中的所有方法。因此,自行车将为这些设置和获得零售价格并指定跟踪数值等等的方法提供执行。

你可以使用接口来定义一个行为的协议,这个行为可以有在类分级结构中任何类来执行。接口的主要好处有一下几点:

不用人工强迫类关系在无关类中截获相似处。

声明想执行的一个或者更多类的方法。

在不暴露对象的类的前提下,暴露对象的编程接口。
2.7怎样将这些面向对象的概念转换为代码

这一小节将给你展现创建对象、执行类、发送消息、创建一个父类以及执行一个接口的代码。

以下是一个applet(applet是用JAVA编程语言编写的程序,它可以运行在兼容JAVA平台的网络浏览器,比如HotJava或者Netscape Navigator)的程序,名为ClickMe。

提示:上面的applet需要JDK1.1。如果你使用老的不支持JDK1.1的浏览器,你将不能运行这个applet。相反,你需要在一个1.1浏览器上来看这个网页,比如在HotJava、JDK Applect浏览器(appletviewer)或者某个版本的Netscape Navigator和Internet Explorer。

下面具体解释一下这个Applet。

ClickMe Applet是一个相对简单的程序因此它的代码就短了多了。但是,如果你还没有太多的编程经验,你可以发现这些代码也不是那么容易的。我们不要求你马上理解程序中的每个问题,并且这节教程也不是讲了十分详细的。这里的目的示暴露一些源代码给你并且跟你刚才所学道的概念和技术联系上。你将在以后的教程中学到更详细的内容。

2.7怎样将这些面向对象的概念转换为代码

2.7.1ClickMe的源代码和Applet标签

为了编译这个applet你需要两个源文件:ClickMe.java和Spot.java。为了运行这个applet你需要利用这个applet标签来创建一个html文件:

<applet code=“ClickMe.class”

width=“300” height=“150”>

其中ClickMe.java的源代码为:

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class ClickMe extends Applet implements MouseListener {

private Spot spot = null;

private static final int RADIUS = 7;

public void init() {

addMouseListener(this);

}

public void paint(Graphics g) {

//画一个黑边框和白背景

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

g.setColor(Color.black);

g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

//画红点

g.setColor(Color.red);

if (spot != null) {

g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2);

}

}

public void mousePressed(MouseEvent event) {

if (spot == null) {

spot = new Spot(RADIUS);

}

spot.x = event.getX();

spot.y = event.getY();

repaint();

}

public void mouseClicked(MouseEvent event) {}

public void mouseReleased(MouseEvent event) {}

public void mouseEntered(MouseEvent event) {}

public void mouseExited(MouseEvent event) {}

}

而Spot.java的源代码为:

public class Spot {

public int size;

public int x, y;

public Spot(int intSize) {

size = intSize;

x = -1;

y = -1;

}

}

然后装载网页到浏览器或者appletviewer工具。并且确保所有必要的文件都在相同的目录中。
2.7.2 ClickMe Applet中的对象

在这个applet中有许多对象。两个最明显的是:applet本身和红点。

浏览器在包含applet的HTML代码中碰到applet标签的时候就创建了applet对象。这个applet标签从创建applet对象的地方提供类的名字。在本例子中,这个类的名字为ClickMe。

ClickME.applet将创建一个对象来在屏幕上画出点。每次你在applet中点击鼠标的时候,applet就将通过改变对象的x和y坐标来移动红点。这个点不是自己画出来的,它是applet画出的,它是根据包含在点对象中的信息画出的。

除了前面两个明显的对象,另外还有一些看不见的对象呢。有代表三种颜色(黑、白、红)的三个对象以及代表点击鼠标的用户动作的事件对象等等。
2.7.3ClickMe Applet中的类

因为代表在屏幕上点的对象是很简单,接下来让我们看看这个名为spot的类吧。它声明了三个实例变量:包括点半径的size,包含点当前水平位置的x坐标以及包含点当前垂直位置的y坐标:

public class Spot {

//实例变量

public int size;

public int x, y;

//构造函数

public Spot(int intSize) {

size = intSize;

x = -1;

y = -1;

}

}

另外,类有一个构造函数,它用来初始化由类创建的新对象。构造函数跟类有相同的名字。这个构造函数初始化所有三个对象的变量。Size的初始化数值是在调用的时候座位参数提供的。x和y变量都被设置为-1,这里-1的目的是为了让点在开始的时候处于屏幕的外面,即产生假不可视的效果。

这个applet是在applet初始化的时候创建了一个新的点对象。下面是applet类的相关代码:

private Spot spot = null;

private static final int RADIUS = 7;

spot = new Spot(RADIUS);

第一行声明了一个名为spot的变量,它是Spot数据类型,并且初始化这个变量为NULL。第二行声明了一个整型变量,名为RADIUS,它的值为7。最后一行是创建一个对象。New关键字为对象分配了内存空间。Spot(RADIUS)调用了上面已经描述了的构造函数并且传递RADIUS数值,这样点对象的size就被设置为7。
2.7.4ClickMe Applet中的消息

就如所知道的,对象A可以使用消息来请求对象B做一些事情,一个消息有三个组成部分:

消息被寻址的对象

要执行执行方法的名字

方法需要的任何参数

在ClickMe applet种有以下两行这样的代码:

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

这两个消息都是从applet到名为g的对象。其中g是一个图形对象,它知道怎样在屏幕上简单画一些形状或者文本。这个对象在浏览器指示applet来画的时候提供了applet。上面代码的第一行设置颜色为白色,第二行是填充一个指定大小的矩形区域,它的颜色为白色。2.7.5 ClickMe Applet中的继承

为了在浏览器种运行,对象必须是一个applet。这就意味着对象必须是类的一个实例,这个类是从由JAVA平台提供的Applet类派生而来的。

ClickMe applet对象是一个ClickMe类的一个实例,它是这样声明的:

public class ClickMe extends Applet implements MouseListener {

}

上面的语句就产生了Applet的一个子类。ClickMe继承了父类的许多功能,包括初始化、由浏览器来开始和结束、在浏览器区域画图以及对接收到的鼠标事件注册。除了有了这些功能,ClickMe类还要实现以下的功能:它的画图代码在paint的方法中,初始化代码必须在init方法中等等。

public void init() {

… // 这里加入ClickMe的初始化代码

}

public void paint(Graphics g) {

… // 这里加入ClickMe的画图代码

}

2.7.6 ClickMe Applet中的接口

ClickMe applet是通过在鼠标点击出显示一个红点来响应鼠标的点击事件。如果对象想通知鼠标点击,JAVA平台事件系统需要对象执行MouseListener接口。这个对象必须同时作为鼠标监听器来注册。

这个MouseListener接口声明了五种不同的志芋工,每种方法是用在鼠标被点击的时候对不同鼠标事件的调用。当鼠标被点击的时候,或者当鼠标移动到applet外面的时候等等。

下面是ClickMe applet完整的代码。其中mousePressed是处理鼠标事件的:

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class ClickMe extends Applet implements MouseListener {

private Spot spot = null;

private static final int RADIUS = 7;

public void init() {

addMouseListener(this);

}

public void paint(Graphics g) {

// 画一个黑色边框和一个白色背景

g.setColor(Color.white);

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

g.setColor(Color.black);

g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

//画一个点

g.setColor(Color.red);

if (spot != null) {

g.fillOval(spot.x - RADIUS,

spot.y - RADIUS,

RADIUS * 2, RADIUS * 2);

}

}

public void mousePressed(MouseEvent event) {

if (spot == null) {

spot = new Spot(RADIUS);

}

spot.x = event.getX();

spot.y = event.getY();

repaint();

}

public void mouseClicked(MouseEvent event) {}

public void mouseReleased(MouseEvent event) {}

public void mouseEntered(MouseEvent event) {}

public void mouseExited(MouseEvent event) {}

}

JAVA程序员必读:基础篇(9)2007-07-23 09:502.8 面向对象概念的问题和练习

本节教程测试一下你对对象、类、消息等等的理解,我们是通过做一些练习以及回答一些问题来进行的。

2.8.1 问题

你可以使用API文档来回答这些问题:

ClickMe applet使用Color.red来设置画图颜色为红色。其它有什么颜色可以象这样来使用?

怎样设置颜色为紫色(purple)?

2.8.2 练习

现在,利用你从API文档中学到的知识来修改ClickMe applet。为了编译这个程序,你同样需要Spot.java文件。具体修改如下:

修改这个applet来画一个绿色的方框而不是一个红点。

修改这个applet来用紫色显示你的名字而不是一个红点。
查看文章
java程序员算法锻炼(3)2010-01-18 20:21【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。

public String classify(int socre){

String res = (socre>=90)?“A”?(socre>=60&&socre<90)?“B”:“C”);

return res;

}

【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。

public int GCD(int m,int n){

if(m<n){

int temp;

temp=m;

m=n;

n=temp;

}

int r = m%n;

if(r!=0){

n = this.GCD(n, r);

}

return n;

}

【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为 '\n '.

public String count(String str){

int letterNum=0;

int blankNum=0;

int otherNum=0;

int l = str.length();

int i=0;

while(str.indexOf("\n")>i||l>i){

int res = (int)str.charAt(i);

if(res>=65&&res<=90||res>=97&&res<=122){//字母的+进制值范围

letterNum++;

}else

if(res==32){//空格+进制值为32

blankNum++;

}else{

otherNum++;

}

i++;

}

return “字条串长度:”+l+"\n字母:"+letterNum+"\n"+“空格:”+blankNum+"\n"+“其它:”+otherNum;

}

Struts是对MVC2模型的实现,于是许多讲解Struts的书用Servlet做了个符合MVC2要求的Web应用,再用Struts做了个同样功能的Web应用。但是在对两种方式的对比中,我发现Struts似乎并没有为开发者带来很大的方便。以下是我的对比:目录
? 视图
? 控制器
? 模型
? 两者的主要差别
? 现在的一个主要问题是
[显示部分][显示全部]

视图
两者一样
控制器
利用Struts并不能完全摆脱这一层,开发者还是需要写Action.使用Servlet方式,也是写一个同Action一样的Servlet充当控制器。两者在代码量上没有区别,在程序逻辑上也一样;
模型
两者一样
两者的主要差别
Struts多了一个ActionServlet

既然编写一个类似Acition的Servlet就可以充当控制器,那么Struts在提供Action后,ActionServlet的意义何在?

ActionServlet的作用是拦截用户请求,并将用户请求转发给合适的Action,而自己的Web应用是将用户请求直接发送给功能等同于Action的自定义Servlet.ActionServlet在拦截过程中注入了一个ActionForm对象和一个ActionMapping对象。经过这个过程后,Struts为开发者带来了如下实际的好处:

通过ActionMapping,Action在转发时,并不是转发给一个实际的页面。而是转发给在strus-config.xml中已经配置的对象。这意味着,在不改变Action代码的情况下就可以更换其转发的页面;如果没有ActionMapping,当有100个Action都要更换转发页面时,我们不得不在庞大的Web应用中找出这100个Action,修改其转发页面,然后再重新编译它们。有了ActionMapping后,只需要在struts-config.xml中修改相应的配置即可,这样既查找方便,又不用重新编译。
现在的一个主要问题是
Web应用一旦投入使用之后,更换转发页面的可能性有多大?Action转发的页面,一般都是直接向用户展示的JSP页面。软件工程中,一切和用户直接打交道的部分都是极易发生变化的。

当然Struts肯定还有其它方面的便利之处,但是这些还并不足以打动我去使用Struts,即便它还提供了丰富的标签库。

最终一个重要的原因让我认为我的确需要采用像Struts这样的框架。当然,首先我一直是相信MVC模型所倡导的理念的:将视图和模型分开。把和用户交互的部分独立出来的好处是明显的。

首先如前面所述,和用户交互的部分是最易发生变化的,视图的独立意味着变化的隔离;然后是将视图分离出去后,开发者可以将精力集中在对业务流程的处理上。一个大型的系统,最复杂的最核心的部分就是处理业务流程。可是实际的情况是,繁琐地界面处理占用了程序员大量甚至是大部分的时间。

我相信了MVC模型带来的好处,所以开发Web应用时我一定会采用这种模式,但是我并不需要Struts,因为Servlet就可以让我实现MVC模型。我的这种想法似乎很自然,但是这里面隐含着一个前提是:我每次开发Web应用,都必须有意识的严格按照MVC规范来写。这看起来不是很困难,但是做起来却很难。因为有时候在业务处理过程中嵌入几行关于界面的代码似乎是非常自然而且简单的,于是我就真的这样做了。一段时间之后,我突然发现我的业务处理过程和界面显示部分又混杂在一起了。至此我才真正相信我要使用Struts.

因为Struts可以规范程序员的行为。也许Struts并不能降低实际的代码量,甚至有时候不使用Struts的代码可能更简洁,但是按照Struts写出来的Web应用却一定是符合MVC模型的。就我认为,这是采用Struts的最大好处。规范程序员的行为,让程序在不知不觉中写出符合优秀架构的代码,这应该是所有框架的共同目的,也应该是根本目的。
外企办公室常用的接电话口语2009-09-25 18:17电话往来是外企办公的一部分。得体娴熟的英文会在生意上帮你不少忙哦!这次就来给你一些非常实用的句子。
1、ABC Corporation. May I help you?
这里是ABC公司,我能帮你什么吗?
这句话算是制式的讲法。一般接起电话的人通常会先报公司的名字 “ABC corporation”, 然后再说, “May I helpyou?” 或是如果要更客气一点的话则可以说 “How can I help you?” (我该怎么帮你?),因为这样的问法表示我’该’怎么帮你, 而非我’需不需要’帮你? 但基本上 “May I help you?” 跟 “How can Ihelp you?” 都很常见就是了。
不过如果是机器接的电话, 则听到的多半是这样, “Thanks for calling ABC corporation, ifyou know your party’s last name or extension, press 1. If you want toreceive information or publication, press 2. If you want to talk to theoperator, press the pound sign or remain on the line.” (感谢你打电话到 ABC 来,如果你知道你要找的人的姓或是分机号码, 请按1, 如果是想要本公司的简介或出版品, 请按2, 如果是要找总机, 请按#, 或是请别挂断。
2、 And you are?
请问您是?
如果人家打电话来是要找你的上司, “May I talk to your manager?” (我能不能跟你们经理讲话?)这时你总不能糊里糊涂地就把电话拿给经理说, 说不定人家是打电话来跟你经理勒索一百万的呢! 所以通常我们一定要先确定打电话来的是谁。最客气的问法是, “Whom I am speaking with?” 或是 “Whom am I talking to?”(我正在跟谁讲话呢?) 但是人家一听是像我这种小毛头打电话找他们经理, 他们就会用比较口语的说法, “And you are?” (你是?)如果人家这样问我, 我就可以答, “This is …”
像是 “And you are?” 这么口语的英文书上大概学不到, 但这却是外国人天天在用的句子,只怕你学了之后还不敢用。其实真的不用怕,越简单的句子大家越听得懂。 而且事实上 “And you are?” 这句话还有许多适用的场合,例如在公司的接待处 (reception)。 来访的客人如果说, “I’m looking for Mr. Wolf.” (我要找伍夫先生)接待小姐就可以反问他, “And you are?” (你是?) 所以像这种简单又好用的句子大家一定要记起来喔!
3、 I’ll put her on the phone. Just a second。
我会请她听电话, 请等一下。
Put someone on the phone 这个短语就是说请某人听电话。 例如你打电话找你女朋友, 结果女朋友的同事接了电话,就开始跟你东扯西扯, 问你们昨天是不是吵架了啊? 什么时候要结婚啦, 这时如果你实在不想跟她讲了, 就可以说, “Could youplease just put her on the phone?” (你能不能请她来听电话啊?) 反过来如果今天是你接到了电话,结果要找的是别人, 你就可以说, “Ok. I’ll put her on the phone. Just a second.” (好,我会请她听电话, 请稍等一下。)
上面讲的 put someone on the phone, 指的多半是只有一部电话时, 但如果像公司里有许多分机,则用"转接"transfer 或是 redirect会比较恰当, 例如同样的情况你可以说, “I’m transferring yourcall.” 或是 “I’m redirecting your call.” (我帮你转接她的分机。) 如果是接线生转接的话,他们有时就只简单地说, “One moment, please.” 或是, “OK. I’ll put you through.”
4、 Would you mind holding for one minute?
你介不介意稍微等一分钟啊?
在美国如果有机会打电话给客户服务 (Customer Service)部门, 如果没意外的话都会听到以下的电话录音, “All ofour representatives are currently busy serving their customers. Yourcall will be answered in approximate 5 minutes” (我们所有的客服人员都在忙着服务他们的顾客,请等五分钟后, 就会有人接听你的电话), 然后十分钟过去了, “Please continue to hold, your call isvery important to us.” (请继续等候, 你的来电对我们非常重要)。 可以想象,大家对这种无止境的等待是深恶痛绝的。所以要记得, 如果人家打电话来, 千万不要因为听不懂就说, “Hold on”, 然后就跑去求救兵, 这对打电话来的人是十分不礼貌的。
如果万不得已一定要请他稍候, 我们要客气一点地说, "Would you mind holding for one minute?“所以记得要给对方一个明确的时间, 例如 one second 或是 five minutes 不要让对方无止境地等下去。但是如果一分钟到了你还没忙完, 则最好再说一次, “Sorry, I am still on the phone. Could youhold for another minute?” (对不起, 我还在讲电话, 能不能再请你稍候一分钟。)
5、 He’s out for lunch. Would you like to try again in an hour?
他出去吃午餐了,你要不要一小时后再打来?
受到中文的影响,许多人要讲某人’出去’吃午餐了常会说成, “He went out for lunch.” 其实这个 went是多余的, 通常只讲 be out for something 就行了。 如果要再简化一点, 单说, “He is on lunch.” 或是"He is on (lunch) break.” (他正在休息时间。)
如果别人要找的人不在,通常我们有两种选择,第一种是请别人晚点再打来, 除了像例句用 try again/ call again之外, 我们也可以用 call back/ try back 这样的讲法. 例如你可以建议别人, “Why don’t you callback in 30 minutes?” (你何不 30 分钟后再打来呢?) 第二种选择就是请对方留言, 客气一点的讲法是,“May Itake a message?” 或是 “Would you like to leave a message?” (你想留言吗?)
6、 She is not here but you can call her machine。
她不在这里, 但是你可以打她的电话答录机。
国外的很多电话都有录音功能,叫 answering machine 或是也有少数人叫 answer machine,但是在一般的对话中常常简称 machine, 例如 “You can call her machine.” 就是说,你可以打她的电话答录机留言. 或是你打电话给某人, 但你想他很可能不在, 这时你就可以说, “I’m expecting amachine.” (我想会是电话答录机接的电话。) 如果是 "I want to check my machine."则是说我要检查电话答录机里的留言。
记得喔! 通常人家讲 someone’s machine 时百分之九十九都是指电话答录机而言, 你可别傻傻地问人,“Answering machine?” 像六人行 (Friends) 里有一集 Chandler 说, “I got hermachine.” 结果 Joey 还呆呆地问他, “Her answering machine?” Chandler 就讽刺 Joey的无知说, “No. Interestingly enough, her leaf blower (machine) picked upthe phone.” (很有趣喔, 不是电话答录机喔! 而是她的吹落叶机接的电话。) 注: 美国的落叶都不是用扫的, 而是用吹的,很神奇吧? 而 leaf blower 就是那种背在身上拿来吹落叶的机器啦!
7、 I’m interested in your CRM software. Can you give me a quote?
我对你们的客户关系管理软体有兴趣, 能跟我报个价吗?
之前讲的都是别人打电话进来要怎么回答, 现在要讲的是如果你打电话给别的公司要怎么讲。 通常你会打电话给别的公司不外乎以下几种状况:询价, 下订单, 追踪订单, 应征工作, 推销产品等等。 首先讲讲询价。 如果只是要请对方大略地估个价钱, 你可以说, “Can yougive me a quote?” 或 “Can you give me an estimate?” 但是提醒大家, 这个 quote 发/kwot/ 的音, 记得要特别强调那个 /wo/ 的音, 不然老美会以为你在说 coat /kot/ 或是 court /kort/这个字, 那可就错大了, 所以最好的办法就是用 estimate, 这个字是绝对不会发错的。
另外, estimate 和 quote 也可以指’报价单’而言, 例如你可以要求别人, “Can you send me a sample with an estimate ASAP?” (能不能请你尽快送一份样品和报价单给我?)
8、 I’d like to place an order for a DL-1100 color printer。
我想要下一份DL-1100 彩色印表机的订单。
以前每次为了买东西而打电话给人家, 我都直接说, "I want to buy this, I want to buy that.“当然啦! 要买东西的人最大, 不管你说什么别人都一定会想办法把东西卖给你的。 只是你如果直接说 buy 听来比较像是日常生活在说的对话。如果像是公司要采购商品时, 最好正式一点用 order, 或是更完整一些说 place an order for, 例如 “I want toorder a color printer.” 或是, “I want to place an order for a colorprinter.” 都是不错的用法。
9、 I’m calling to check my order status。
我打电话来查看我订单的状况。
如果不会这样说,那你可能会用, “I ordered something yesterday. Can you check ifyou’ve shipped it or not?” 这句话听起来是不是有点啰嗦呢? 其实只要简简单单地说 “I want to checkmy order status.” 或是 “I want to track my order status.” 就能完整地表达这句话的意思了。
同样的,如果在机场你也可以用这句话来查一下航班的信息,比如那班飞机有没有晚点, 大概几点会到, 只要用一句"I wanna check passenger status.” 就可以了。
10、 I was referred to you by Mr. Gordon。
是Gordon 先生介绍我来的。
打电话到别人公司如果是有求于人的话,例如要去应征啦或是推销东西啦, 最好能先攀点关系啦! 例如最常用的招数, 我是某某人介绍来的,就是 “I was referred to you by someone.” (注意, 介绍在这里用 refer 而不是用introduce。) 还有呢? 如果你今天拿到了该公司的折扣券, 最好也是开宗明义地说, “I got your number from acoupon, which says your product is 50% off today.” (我是根据你们折扣券上的号码打过来的,它上面写着今天产品五折优待。) 这样子让他想赖都赖不掉。总之呢? 先表明自己是怎么搭上这条线的, 这样子别人才不会有突兀的感觉啦。

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值