程序员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.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
- 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
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;
则ab将是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中有哪些种类的变量。
- 类的属性,或者叫值域
- 方法里的局部变量
- 方法的参数
对于第一种变量,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文件: