导航:首页 > 编程语言 > java请描述oo的内涵

java请描述oo的内涵

发布时间:2025-10-09 15:44:03

⑴ 什么是OO,OOP的核心思想是什么请简述你对OOP的理解

1、什么是OO
OO(Object–Oriented )面向对象,OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,Object Oriented是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
2、OOP的核心思想是什么?
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
核心思想:封装,继承,多态.
OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
OOP 主要有以下的概念和组件:
组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。
继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。
由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。Python 和 Ruby 是最近才出现的语言,在开发时完全采用了 OOP 的思想,而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体成为 javaScript(ECMAScript) 得以流行的原因,有论证表明对组件进行适当的组合就可以在英特网上代替 HTML 和 XML 的文档对象模型(DOM)。

⑵ 计算机专业学生Java实训心得体会合集6篇

时间不停流逝,java实训工作即将落下帷幕,回头看我们的实训经历,我获取了很多知识和为人处世的道理,为了帮助我们发现工作中存在的问题,我们不妨来写java实训心得体会,那么大家的java实训心得体会要怎么写呢?下面是我为大家整理的“计算机专业学生Java实训心得体会”,供您参考,希望能够帮助到大家。

计算机专业学生Java实训心得体会 篇1

在本学期我们进行了为期三周的java实训。回首本学期的java学习,虽说时间很短,但其中的每一天都使我收获很大、受益匪浅,它不但极大地加深了我对一些理论知识的理解,不仅使我在理论上对java有了全新的认识,在实践能力上也得到了提高,真正地做到了学以致用,更学到了很多做人的道理,对我来说受益非浅。除此以外,我知道了什么叫团队,怎样和团队分工合作;同时我还学会了如何更好地与别人沟通,如何更好地去陈述自己的观点,如何说服别人认同自己的观点。这也是第一次让我亲身感受到理论与实际的相结合,让我大开眼界。也是对以前所学知识的一个初审吧!这次实训对于我以后学习、找工作也是受益菲浅的,在短短的三周中相信这些宝贵的经验会成为我今后成功的重要的基石;这对于我的学业,乃至我以后人生的影响无疑是极其深远的。

这次实训虽然是我们的第一次,心得体会不过同学们表现不错,由此看来,我们在进入大学的这几个月里学到了不少的专业知识,只是自己感觉不到而已。对于所学专业,我们不能过于自卑和担忧,否则会妨碍自己学习。实训是学习java的重要环节,有利于我们巩固专业知识、掌握工作技能,提高就业筹码。

我把本次为期三周的实训看作是“理论与实践相结合的桥梁”。通过这周的实训和学习,我知道了此次实训的目的,也清楚目前自己的不足,那就是缺乏相应的知识与经验,对所学的专业知识不能够很好地运用于实践操作。正所谓“百闻不如一见”,经过这次自身的切身实践,我才深切地理会到了“走出课堂,投身实践”的必要性。平时,我们只能在课堂上与老师一起纸上谈兵,思维的认识基本上只是局限于课本的范围之内,也许就是这个原因就导致我们对专业知识认识的片面性,使得我们只知所以然,而不知其之所以然!限制了我们网络知识水平的提高。但是课本上所学到的理论知识是为我们的实际操作指明了方向、提供相应的方法,真正的职业技巧是要我们从以后的实际工作中慢慢汲取的。而针对实际操作中遇到的一些特殊的问题,我们不能拘泥于课本,不可纯粹地“以本为本”。

在这次实训中我得到了许多收获,我第一次体会到java工程师的工作是什么样子的,也发现了很多不曾注意到的细节,在实训的演示过程中,我对作为一名java工程师注意的事项应该从小事做起、从基本做起。把职业能力训练与职业素质有机的结合起来。相信这对我接下来学习专业知识会起到很有效的帮助,在接下来的几个月里,我会以作为一名职业人的身份在这几个方面要求自己,严格自我,向java工程师靠近。

而经过这次实训,让我明白如果是一个完整项目的开发,必须由团队来分工合作,否则,即费力又费时还做不好这个项目。因此不管在工作中还是在生活中要和老师、同学保持良好的关系是很重要的。做事首先要学做人,要明白做人的道理,如何与人相处是现代社会的做人的一个最基本的问题。对于自己这样一个即将步入社会的人来说,需要学习的东西很多,他们就是最好的老师,正所谓“三人行,必有我师”,我们可以向他们学习很多知识、道理。

实训结束了感觉虽然辛苦,但很充实。我想这就是java工程师的工作。我也体会到java工程师成功地完成一个任务的那种兴奋,那种小有成就的感觉是只有置身其中的人才能体会的。

总之,这次实训为我提供了与众不同的学习方法和学习体会,个人简历从书本中面对现实,为我将来走上社会打下了扎实的基础。作为在校计算机专业的学生,现在我能做的就是吸取知识,提高自身的综合素质,提高自己的职业技能,自己有了能力,到时候才会是“车到山前必有路”。我相信在不久的未来,会有属于我自己的一片天空。

我希望计算机专业的同学在以后的学习或工作中以务实的态度给提供更多的机会锻炼自己,为大家的成才与就业奠定坚实的基础;并希望同学们要做好角色定位,将自己所学的知识,学熟、学精。

多学习和收集与项目有关的资料,来提高自己的业务水平,同时多请教经验丰富的老师,使他们好的经验能够对自己起到借鉴作用,在他们的帮助下,能够很快的培养自己的管理技能及节省时间,避免做无用功,也可以让自己了解很多项目管理上的捷径,从而减少自己会遇到的挫折和错误。

20xx—20xx学年度第一学期生物教研组工作计划

指导思想

以新一轮课程改革为抓手,更新教育理念,积极推进教学改革。努力实现教学创新,改革教学和学习方式,提高课堂教学效益,促进学校的内涵性发展。同时,以新课程理念为指导,在全面实施新课程过程中,加大教研、教改力度,深化教学方法和学习方式的研究。正确处理改革与发展、创新与质量的关系,积极探索符合新课程理念的生物教学自如化教学方法和自主化学习方式。

主要工作

一、教研组建设方面:

1、深入学习课改理论,积极实施课改实践。

2、以七年级新教材为“切入点”,强化理论学习和教学实践。

3、充分发挥教研组的作用,把先进理念学习和教学实践有机的结合起来,做到以学促研,以研促教,真正实现教学质量的全面提升。

4、强化教学过程管理,转变学生的学习方式,提高课堂效益,规范教学常规管理,抓好“五关”。

(1)备课关。要求教龄五年以下的教师备详案,提倡其他教师备详案。要求教师的教案能体现课改理念。

(2)上课关。

(3)作业关。首先要控制学生作业的量,本着切实减轻学生负担的精神,要在作业批改上狠下工夫。

(4)考试关。以确保给学生一个公正、公平的评价环境。

(5)质量关。

5、加强教研组凝聚力,培养组内老师的团结合作精神,做好新教师带教工作。

二、常规教学方面:

1、加强教研组建设。兴教研之风,树教研氛围。特别要把起始年级新教材的教研活动作为工作的重点。

2、教研组要加强集体备课,共同分析教材,研究教法,探讨疑难问题,由备课组长牵头每周集体备课一次,定时间定内容,对下一阶段教学做到有的放矢,把握重点突破难点.

3、教研组活动要有计划、有措施、有内容,在实效上下工夫,要认真落实好组内的公开课教学。

4、积极开展听评课活动,每位教师听课不少于20节,青年教师不少于40节,兴“听课,评课”之风,大力提倡组内,校内听随堂课。

5、进一步制作、完善教研组主页,加强与兄弟学校的交流。

我们将继续本着团结一致,勤沟通,勤研究,重探索,重实效的原则,在总结上一学年经验教训的前提下,出色地完成各项任务。

计算机专业学生Java实训心得体会 篇2

时间犹如白驹过隙,学习Accp 5.0课程已经一个月有余了。在这一个多月的时间里,我学习了计算机基础、进入软件编程世界和使用Java语言理解程序逻辑三门课程。其中最重点的就是使用Java语言理解程序逻辑这门课程,这可以说是我第一门正式接触的编程语言,虽然以前学过CC++,但这仅限于浅尝辄止而已,根本就没有去深层次的了解过,连一个简单的程序背着书都不会编写。Java这门课程是我进入软件编程世界的第一道坎,因此我必须要发扬笨鸟先飞,持之以恒的精神来学习它,争取把第一只拦路虎给消灭了。

为了学好Java语言,我自认为还是比较刻苦的,基本上每天九点之前就来到了中心机房上机,把书上的代码反复地练习,书上的代码看似简单,但是有时候照着书敲上去一编译运行却不是这里出错就是那里有问题,高的焦头烂额的;更令人郁闷的是,有时候编译没有问题,但是运行的时候却报错了,这种情况十有八九是因为一些情况没有考虑清楚:有时候我们定义的是整型变量,输入却输入了非整型变量;有时候是因为数组的下标越界;有时候是什么空指针异常……这些情况使得初学编程的我痛不欲生,有好几次一冲动差点把机器给砸了,但是一想到把电脑砸坏了还得赔偿就忍住了,所以大家有时候遇到问题不能解决的时候千万不要冲动。

计算机专业学生Java实训心得体会 篇3

经过五天的Java实训,感触很深,收获也很大,对自己的缺点也有了很多的认识,回首本学期JAVA学习,重点还是在学习概念等一些常识性的东西,关于类型、变量、接口、输入输出流、分析异常、抛出异常,后期主要是小程序运用,Gui界面设计和事件。

在我学习的语言中,我自己认为Java是一门比较强大的面向对象的编程语言,不仅仅是因为它的跨平台型还有它的较强的实用性,强悍的嵌入性。

本次实训主要是针对我们对项目流程不熟悉和对整体项目的把握不清楚,学习数据库的设计和表的建设以及表与表之间的联系,还有一些代码的编写,这些都是我们所不熟悉的也是我们最薄弱的部分。

通过这一周的实训,虽然实训的时间不长,但是总体上收获挺大的,当我们正式准备学习实训java编程技术时,让我感到非常高兴,因为java一直学的是课本知识,所以实训对于我来说是必须要学会熟练操作的。当然开始学习后也并非是想象中那样顺利,开始的学习让我异常感到学习任务的艰巨,因为学习中我遇到了很多以前未曾遇到的难点,有时后也难免会失去耐心,但是,通过老师的指导,自己的努力的练习,我顺利的化解了一道道的障碍。克服了Java学习上的一道道难关,现在自己已经基本掌握了java的基础知识。

有些知识点以前没有学过,但我也没有去研究,实训时突然间觉得自己真的有点无知,虽然现在去看依然可以解决问题,但要浪费许多时间,这一点是我必须在以后的学习中加以改进的地方,同时也要督促自己在学习的过程中不断的完善自我。另外一点,也是在实训中必不可少的部分,就是同学之间的互相帮助。所谓当局者迷,旁观者清,有些东西感觉自己做的是时候明明没什么错误,偏偏程序运行时就是有错误,让其他同学帮忙看了一下,发现其实是个很小的错误。所以说,相互帮助是很重要的一点,这在以后的工作或生活中也是很关键的。

俗话说:要想为事业多添一把火,自己就得多添一捆材。此次实训,我深深体会到了积累知识的重要性。在实训当中我们遇到了不少难题,但是经过我们大家的讨论和老师细心的一一指导,问题得到了解决。两个月的实训结束了,收获颇丰,同时也更深刻的认识到要做一个合格的程序员并非我以前想像的那么容易,最重要的还是细致严谨。社会是不会要一个一无是处的人的,所以我们要更多更快地从一个学生向工作者转变,总的来说我对这次实习还是比较满意的,它使我学到了很多东西,为我以后的学习做了引导,点明了方向。

这次实训,我们更多学到的是不懂就要问和自己应该尽自己的全力去尝试,哪怕失败,也要尽自己的全力,和身边的同学一起探讨而不是抄袭,团队合作和发挥团队意识,最后在自己的努力下终于运行成功,这种感觉美不可言,心情愉悦至极,有很强的成就感。

最后,我自己感觉这次实训的收获还是很大的,我相信在不久的将来我们会有自己的一片天空。

计算机专业学生Java实训心得体会 篇4

在甲骨文盈佳科技学习JAVA软件开发也有一段时间了,现在java面向对象的学习结束了,我对java有了初步的认识了。面向对象是个很严肃的问题,就向上下级关系一样,下级在有的方面就得遵守上级的指令做事,这样就便于管理,更是提高了生产的效率。

面向对象和面向过程最大的区别在与,面向对象大大降低了程序的难度。开始是面向过程的编程设计,常常是一个文件就包含了所有的功能,看起来实现还是蛮简单,很是方便,但是随着后面的程序的运用越来越广,这就大大的加大了程序的难度,提高的编程成本。不过在有的时候,对小的问题还是可以使用面向过程来编程的。

面向对象是按照哲学层面上设计的。它按照事物的本来面目的一些属性和方法,所以在后面规模越来越大的时候,更合理。面向对象的三大主要特征:继承、封装、多态。继承就是子类对父类的扩展和延续。封装就是类内部对类外部的屏蔽。多态就是对借口的使用,借口的使用就是更好的实现了程序的设计。

因为我现在只是学到了面向对象这块的内容,现在结束了,写了一个简单的个人体会。

计算机专业学生Java实训心得体会 篇5

在上学期的最后一周和本学期的第一周,我和同组的学员在学校机房进行了JAVA暑期实训,现在已经结束了。

回首上学期的java学习,重点还是在学习概念等一些常识性的东西,Application应用程序和Applet小程序,它的开发工具、数据类型、变量、接口、输入输出流等。学会分析异常,抛出异常,后期主要是小程序运用,Gui界面设计和事件。我觉得这两种程序结构有很大的不同,不管是体系结构还是运行方式,都有很大的区别,而我主要偏向于小程序的学习。因为我感觉它实用性比较大,可以做出很多不错的游戏、运用程序等,而且它比较灵活。当然学知识不能仅凭自己的爱好和一时兴趣,要一步一个脚印、认认真真、踏踏实实,理论与实践相结合。在掌握课本实例和内容之后,要有一定的扩展阅读和课外学习,充分全面的了解JAVA的应用和扩展运用。在我所学的语言当中,我自认为JAVA是一门比较强大的面向对象编程语言。不仅仅因为它的跨平台性,更多的是因为它的灵活多变和实用性,而且它比较的经典和强悍。

这次实训,面对老师布置的任务,一开始有些慌张和无措。不过,事后我首先想到这和课本上的某些知识具有结合点,回忆和分析了老师教过的算法和具体实施方法,并综合考虑了其他的方面。在编写时,一个小小的符号、一个常量变量的设定,这都无不考量着我的细心和严谨。所以学习JAVA,不仅对我们以后学习其他语言有很大的好处,而且也让我们知道了和理解了作为一个编程人员首先应具有的良好心理素质,那就是冷静思考和专心致志。

在此次实训中,我意识到一个好的编程人员要善于沟通和团结拼搏。实训结束后,我觉得要学好一门计算机语言必须牢记以下几点:

计算机专业学生Java实训心得体会 篇6

1、项目一定要全新的项目,不能是以前做过的。

2、项目一定要企业真实项目,不能是精简以后的,不能脱离实际应用系统。

3、在开发时要和企业的开发保持一致。

4、在做项目的时候不应该有参考代码。

长话短说就是以上几点,如果你想要更多的了解,可以继续往后看。

一、项目的地位

因为参加就业培训的学员很多都是有一定的计算机基础,大部分都具备一定的编程基础,尤其是在校或者是刚毕业的学生,多少都有一些基础。

他们欠缺的主要是两点:

(1)不能全面系统的、深入的掌握某种技术,也就是会的挺多,但都是皮毛,不能满足就业的需要。

(2)没有任何实际的开发经验,完全是想象中学习,考试还行,一到实际开发和应用就歇菜了。

解决的方法就是通过项目练习,对所学知识进行深化,然后通过项目来获取实际开发的经验,从而弥补这些不足,尽快达到企业的实际要求。

二、如何选择项目

项目既然那么重要,肯定不能随随便便找项目,那么究竟如何来选择呢?根据java的研究和实践经验总结,选择项目的时候要注意以下方面:

1、项目不能太大,也不能太小

这个要根据项目练习的阶段,练习的时间,练习的目标来判断。不能太大,太大了做不完,也不能太小,太小了没有意义,达不到练习的目的。

2、项目不能脱离实际应用系统

项目应该是实际的系统,或者是实际系统的简化和抽象,不能够是没有实战意义的教学性或者是纯练习性的项目。因为培训的时间有限,必须让学员尽快地融入到实际项目的开发当中去。任何人接受和掌握一个东西都需要时间去适应,需要重复几次才能够真正掌握,所以每个项目都必须跟实际应用挂钩。

3、项目应能覆盖所学的主要知识点

学以致用,学完的知识点需要到应用中使用,才能够真正理解和掌握,再说了,软件开发是一个动手能力要求很高的行业,什么算会了,那就是能够做出来,写出代码来,把问题解决了,你就算会了。

4、最后综合项目一定要是实际应用系统

学员经过这个项目的练习,就要走上实际的工作岗位了,如果这个系统还达不到实际应用系统的标准,学员练习过后也还是达不到企业实际的需要,那么这个培训应该说质量就不高了。理想的状况是这个项目就是实际项目,到时候学员就业到另外一个公司,不过是换个地方干活而已,完全没有技能上的问题。

三、java怎么选择项目

这个不是靠想象,而是根据实际的情况一步一步分析出来的(呵呵要卖弄一下:这也算是逻辑思维),当然这里只是讨论方法,不涉及具体的项目案例。

我们可以采用倒推的方式来分析:

(1)最终的项目一定是真实的项目,也就是要把学员训练到能够独立开发实际应用,通常我们还不能选最简单的项目,因为学员的吸收还要有一个折扣,所以最终的项目应该选实际项目中中等难度的项目

(2)最终项目定下来过后,开始分解这个项目,看看为了达到完成这个项目需要哪些技术和知识点,以及每部分知识点的深度,然后定出每个分阶段的任务。

(4)然后是选择上课期间的演示项目,演示的项目是为了做分阶段项目服务的,可以认为是分阶段项目的分阶段项目。

(5)最终把要求掌握的知识点和要求掌握的深度,分散到日常教学和练习中。

好了,把上面的分析用正向描述就是:

日常教学和练习中学习和掌握的知识——演示项目——分阶段项目——综合项目——胜任企业实际开发需要。

附注:有了好的项目还要有好的训练方法(这个另外立文讨论),最最基本和重要的一条就是:绝对要指导学生亲自动手做,而不是看和听,所以尽量不要选择有现成代码的项目,演示用的项目也最好不配发代码,让学生能够跟着做出来才是真的掌握了。

上面阐述了java对项目的态度和基本选择方法,这里再把其中几个重要的、与众不同的特点阐述如下:

1、真项目

项目一定要真实,要是企业实际应用的,不能是教学性的项目,否则会脱离实达不到项目实训的效果。还有一个一定要是最新的项目,企业的要求也是在不断变化的,应用技术的方向和层次也在不断变化,这些都体现在最新项目的要求上,旧项目所要求的技术和层次很可能已经过时了,根本达不到训练的目的。

java的做法是:没有固定项目,每个班做项目之前会从企业获取最新的项目需求,然后经过挑选和精心设计,以保证既能训练技术,又能得到实际的开发经验。这样实现了跟企业的同步,企业做什么,我们就学什么,然后也跟着做什么。

2、真流程

开发的流程也要跟企业的实际开发保持一致。从项目立项开始,到需求分析、概要设计、详细设计、编码、测试的各个环节,都要完全按照真实的开发流程来做。

java的主力老师都是实战出身,在java开发方面都至少有七年以上的开发经验,同时具备多年的项目管理经验,所以能够完全按照企业开发的流程来训练学生。

3、真环境

开发的环境也要跟企业一样,包括常用的开发工具、开发平台、应用服务器、常用插件、测试工具、项目管理工具、项目管理文档等等。

java的做法是:构建跟企业完全一样的环境,然后跟企业开发一样,分团队开发。老师就相当于项目经理,一个班分成多个小组,每个组有自己的teamleader,大家分工合作,共同完成项目。

4、真开发

这是java最与众不同的一点,java深知:软件是做出来的,而不是听出来或者看出来的,企业需要能实际开发的人员,而不是只听过、看过但不能做的人。所以java非常强调:项目一定要让学生动手写出来。

java的做法是:老师做为项目经理,带领着大家一起去做需求分析、概要设计、数据结构设计、接口设计、重要业务流程的分析设计等,然后由学生们分团队进行开发,实现整个项目。这里有几个与众不同:

(1):现场带领学生一起做分析和设计,而不是预先做好了来讲讲。因为需要学生学习的是分析设计的过程和方法,而不是已经做好的结果。

(2):java选用的项目基本都是企业最新的项目,很多都是java的学生和企业在同期开发,所以是不配发源代码的。这样也断绝了学生的依赖思想,认认真真去开发。可能有同学会问:为什么不选择有源代码的项目呢,那样还可以参考学习啊!

事实上,java界最不缺的就是代码了,那么多开源软件,小到一个工具,到企业级erp都有开源的,而且很多都是大师级的作品,说实话比你参考的那些代码质量高多了,但是又有多少人能真正看明白呢,原因就在于达不到那个水平,看不懂代码背后所体现的设计和思想以及为什么要这么做,效果也就不好了。

当然不排除有这样的高人是能够完全能理解和掌握这些大师级作品的,但估计不会是刚开始学习java开发的学生,所以java根据多年的培训经验,友情提示:在初学阶段,看一千遍,听一千遍,都不如自己动手写一遍所达到的学习效果。自己能写出来的功能才是你真正掌握的功能,而不是你看得代码或者是听老师讲的,就算讲过看过,但是自己做不出来,那都不算会。

(3):java在课堂上除了带领学生去分析设计外,还会分析一些重点、难点功能的实现机制和原理,然后指导学生去实现。

5、真技术

java在每个项目中,特别会抽取有难度的部分让学生们在老师指导下实现,专门啃硬骨头,那才能真正锻炼学生的开发能力。

比如:在做oa类的项目时,会重点去做工作流、公文收发、在线office控制等;在做crm类项目时:会重点去做销售自动化和市场块的业务;在做人力资源类项目的时候会重点去做人力跟踪和人力评测模型等。

java在每个项目中,都会使用目前企业最新最流行的技术,按照最新的难度去要求,从而让学员能更符合企业的需要。

6、真经验

java的项目都是企业最新的真实项目,经过开发训练,学员能够积累足够的真实的开发经验,以胜任企业的工作需要。在进行项目分析时,还会全面讲解项目所要求的业务,让学员从业务和技术上都能充分积累。

7、真实力

作为就业培训,项目的好坏对培训质量的影响非常大,常常是决定性的作用。这篇文章是关于在学习java软件开发时练习项目的总结,简单总结为以下几点:事实上,不采用有源代码的教学性项目对java的要求非常高。试想一下,如果项目分发下去,老师带着分析后,学生都不会做会出现什么样的后果?这对java的教学质量提出了极高的要求,如果教学质量达不到让学员独立开发的水平,对依靠质量取胜和口碑发展的java将是毁灭性的。

另外一个,由于是全真的项目,在开发的过程中,肯定会有很多的问题出现,这些都要老师去解决,由于不像教学项目那样预先做好,又需要老师能很快地解决各个问题,这对老师的真实开发水平有极高的要求,这可是需要真功夫的。

总结:

总之,java通过真实的项目,真实的开发环境和开发流程,指导学员去真正开发,让学员得到真正的锻炼,收获真正的开发能力。

有了真正的开发能力——能够胜任企业的实际需要——高薪好工作。

⑶ java中如何定义常量

在Java中定义常量可以通过普通类中使用static final修饰变量的方法。

final关键字使用的范围。这个final关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。如数组就是一 个对象引用。为此可以使用final关键字来定义一个常量的数组。这就是Java语言中一个很大的特色。

一旦一个数组对象被final关键字设置为常量数 组之后,它只能够恒定的指向一个数组对象,无法将其改变指向另外一个对象,也无法更改数组(有序数组的插入方法可使用的二分查找算法)中的值。

(3)java请描述oo的内涵扩展阅读:

关于Java中的常量:

final:一个常量,或不能覆盖的一个类或方法。

interface:接口,一种抽象类型,仅有方法和常量的定义

⑷ 学习java最重要的思想是什么

当然是面向对象的思想咯。 OOP的许多原始思想都来之于Simula语言,并在Smalltalk语言的完善和标准化过程中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促进的。与函数式程序设计(functional-programming)和逻辑式程序设计(logic-programming)所代表的接近于机器的实际计算模型所不同的是,OOP几乎没有引入精确的数学描叙,而是倾向于建立一个对象模型,它能够近似的反映应用领域内的实体之间的关系,其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。由此,导致了一个自然的话题,那就是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息就构成OOP计算模型的根本。
对象的产生有两种基本方式。一种是以原型(prototype)对象为基础产生新的对象。一种是以类(class)为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性,原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象,代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOP中常被引用的---子类型(subtype)不等于子类(subclass)[Budd 2002]。而在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的程序设计语言(如果我们暂时把静态与动态的差别放在一边)。是的,我们经常接触的C++,Java都是使用基于类的对象模型,但除此之外还有很多我们所没有接触的OOPL采用了完全不一样的对象模型,他们是在用另外一种观点诠释OOP的内涵。
什么是类型(type)?
类型以及类型系统的起源以及研究与发展是独立于OOP的。早在五十年代的FORTRAN语言编译器实现中,就已经采用类型系统作为类型检查的一种手段。广义的类型一般被定义为一种约束,也就是一种逻辑公式。而在对类型的研究过程中产生多种方法,比如[C&W 1985]等。而代数方法(algebraic approach)是一种非常好的建立类型的形式化规范的方法。代数中的一个类型对应于一系列元素,在它们之上定义代数操作。同时在此基础上二阶λ演算已经被用于继承和模板所支持的模型。在上面两种方法中,类型被认为是一系列满足确定约束条件的元素,更抽象的方式可以把一个类型当作规定一个约束条件,如果我们规定的约束条件越好,相对应的被定义元素的集合就越精密,所以逻辑公式(logical formulas)就成为描叙类型特征的最合适工具。在这里,我们不想深入的探究对于类型理论的各种不同的数学模型,我们需要明白的是类型(type)以及类型理论这个在编程语言中经常应用到的概念的内涵是极其丰富的,而其自身理论的发展并非局限于OOP之中,但当两者相结合的时候就对我们的程序观产生了巨大的影响。
类(class),类型(type),接口(interface)
这三个概念是在OOP中出现频率最多,也最容易混淆的。而对于这三个概念的澄清也是文章写作的初衷。让我们先看看大师们对于这三个概念的描叙----
“The fundamental unit of programming in Java programming language is the class, but the fundamental unit of the object-oriented design is the type.while classes define types,it is very useful and powerful to be able to define a type without defining a class.Interface define types in an abstract form as a collection of methods or other types that form the contract for the type.” [Jams 2000]。
“In C++,A class is a user definite type”[B.S 1998]。
“A type is a name used to denote a particular interface……An object may have many types,and widely different objects can share a type.Part of an object’s interface may be characterized by one type ,and other parts by other types.Two objects of the same type need only share parts of their interface.Interface can contain other interface as subset.We say that a type is a subtype of another if its interface contain the interface of its supertype.Often we speak of a subtype inheriting the interface of its supertype”[Gamma 1995]
在其中,一共出现了四个概念:类(class),类型(type),接口(interface)以及契约(contract)。这里我们说到的类型和上面提到的类型有所不同,是狭义的OOP中的类型。为了理解这几个概念,我先划分出三个概念域:一个是针对现实世界的,一个是针对特定程序设计范型的(在这里就是OO设计范型),最后一个是针对编译器实现的。也就是说,在现实世界中的概念必须有一种手段映射到OO范型中去,而OO范型中的概念也应该在编译器实现中有相同的概念对应。由此,我们可以这样说,类是做为现实世界中的概念,而传统的OOPL都会提供class关键字来表示对现实世界模拟的支持。而接口,是作为OO程序设计范型中与类对应的一个概念。在OO设计中,我们所要做的就是针对接口进行设计和编程,而接口的实质含义就是对象之间的一种契约。而类型就是编译器实现中针对类和接口所定义的对应概念。可以这样说,类是现实世界中存在的客观概念,是唯物的。接口是设计人员定义出来的,存在于设计人员心中的概念,是唯心的。而类型是类和接口这两种概念的编译器实现的映射概念,也是唯物的。类型主要是用来指导编译器的类型检查的谓词,类是创建现实对象的模板,接口是OO设计中的关键概念。这三个概念相互区别(分别位于不同的概念域),又相互联系(都是代表相同的概念的不同概念域的映射)。有了上面的理解,我们看看下面最常见的Java语句:
people a=new man();
这代表了什么?程序员向编译器声明了一个people类型(type)的对象变量a,而对象变量a本身却指向了一个man类(class)的实体(而在编译器中理解是对象变量a指向了一个类型为man的实体)。再让我们回到[Jams 2000],其中句子的根本含义我们可以概括如下:声明一个类或者一个接口都同时向编译器注册了一个新的类型,而此类或者接口以及类型都是共享同样的一个名字。也就是说。编译器所能理解的全部都是类型,而程序员的工作是把现实中的类概念转化为设计中的接口概念,而编译器对应于上两种概念都有直接的支持,那就是一个类声明或者接口声明在编译器的理解来看就是一个类型声明。但是反过来却不一定成立。一个类可以有多个接口(一个类完全有可能实现了设计人员的多个契约条件),同时也就可能有多个类型(因为类型不过是接口这个设计域内的概念在编译器中的实现)。
多态,替换原则,对象切割
多态作为OO中的核心机制之一拥有着丰富的内涵。顾名思义,多态就是一种名称多种形态的意思。其主要有三种形式:函数多态,对象变量多态,泛型多态。函数多态主要包括函数重载(overload)和改写(overriding)。泛型多态(genericity)主要是提供了一种创建通用工具的方法,可以在特定的场合将其特化。在这里,我们重点要考量的是对象变量多态。在理解对象变量多态之前,我们首先了解一下OO核心机制之一的替换原则。静态类型的OOPL的一个特征就是一个变量所包含的值(value)的类型可能并不等于这个变量所声明的类型,在传统的编程语言中并不具备这样的特征,因为我们不可能把声明为整型的变量赋上字符串的变量值。而替换原则发生作用的情况就隐含的描叙了两种不同类型所具有的关联----类型继承。Barbara Liskov曾经这样描叙替换原则以及起作用的类型之间的关联:对于类型为S的每个对象s,存在一个类型为T的对象t,对于根据类型T所定义的所有程序P,如果用对象s替换对象t,程序P的行为保持不变,那么类型S就是类型T的子类型[Liskov 1988]
在理解了多态以及替换原则后,我们可以继续深入理解继承与替换原则相结合所带来的新的观点。可以说继承与替换原则的引入影响了几乎所有的OOPL,包括类型系统,值语义/引用语义,对象内存空间分配等等。下面,我将试图逐步的拨开其中的各种因果。
首先考虑,people a; 这样的代码在编译器中将如何实现?可以肯定是首先将把类型people绑定到对象a上,然后必须为对象a分配空间。同时,我们创建people的子类man,由于man IS A people。根据多态以及替换原则,我们当然可以让对象a保存一个man类型的值(这就是替换原则的表现)。这是一种直观的描叙,但在编程语言的实现过程中就出现一些困难。我们知道继承是一种扩展接口与实现的方式,那么我们就很难保证man类型不对people类型做扩展,而一旦做出扩展,我们如何能用存储people对象的空间去存储man类型的对象值呢?
people a;
man b=new man();
a=b;
这样的代码将首先把b对象进行切割,然后再存储到a对象空间去。然而这并不是我们所期望的。那么,为了支持OOP的继承,多态,替换原则,但却需要避免对象切割的发生,面对对象a我们将采用何种分配空间模型呢?常用的有下面三种方式:
1, 只为a分配基类people的存储空间,不支持对象多态以及替换原则。这样的模型内存分配紧凑,存储效率很高。
2, 分配继承树中的最大类对象所需要空间(在这里是man类的对象值空间),这样的模型简单,同时可以实现多态和替换原则而避免对象切割问题,但是十分浪费内存空间十分明显。
3, 只分配用于保存一个指针所需要的存储空间,在运行时通过堆来分配对象实际类型所需要的空间大小,这样也可以实现多态和替换原则而避免对象切割问题。(也就是说a只是一个对象的引用,而不是真实的对象,真实对象的生成必须靠程序员显式的声明)。
对于上面提到的三种内存模型,1和3都被一些程序设计语言所采用。相信说到这里,大家应该开始慢慢明白了。是的,C++作为C语言的继承者,对于效率的追求迫使它必须采用第一种最小静态空间分配的方式,由于基于栈空间的程序运行效率要比基于堆空间的程序运行效率高出许多,所以C++允许用栈空间保存对象,但同时也允许堆空间保存对象,可以说C++是采用了1和3两种相混合的内存模型,而C++中基于1内存模型的对象,也就是说基于栈内存空间的对象是没有办法体现多态和替换原则的(请思考一下在C++中什么对象是基于栈的),而基于3内存模型的对象将支持多态和替换原则(又想一想在C++中什么对象是基于堆的)。这里,我们终于可以揭开第一层迷雾了,很多人都知道在C++中只有指针和引用才能支持对象的多态行为,但是为什么会如此?上面做出了最好的解释。
Java语言由于设计理念和C++有着很大的区别,它采用的是第3种对象模型,一切对象(除了基本类型对象)都是基于堆分配的。这也是Java语言必须采用虚拟机的原因所在。在C++中很大一部分对象是不需要程序员进行管理的(静态空间对象),而在Java中,如果不采用虚拟机机制,所有的对象都需要程序员管理,而这样的开发代价将是巨大而不现实的。这也就揭开了第二层迷雾,当我们在对比C++和Java语言的时候总是为虚拟机是否有其价值而争论不休,但当你抛开所谓的好与不好的简单讨论,进入到其语言本身的内在对象存储本质的时候,也许对于各种声音才会有一个属于自己的清醒认识。
让我们继续望下走,不同的对象内存分配模型直接影响到其程序设计语言的赋值的含义。在各种编程语言中,赋值可以给出两种不同的语义解释:复制语义和指针语义。很明显,由于C++支持两种相混合的对象存储模型(但是默认的存储方式是栈存储),所以在C++中默认赋值语义采用的是前者,但C++同时提供了指针语义的功能支持(在拷贝构造函数和=运算符重载中用户进行自定义)。而在Java中采用的是后者。这也就是我们揭开的最后一道迷雾,不同的对象存储模型直接导致了不同的赋值语义。
面向对象的计算模型和可计算性
编程就是用计算所需要的指令构成一种运算装置,无论我们的程序设计思想以及程序设计语言如何发展和提高,最终我们所使用的底层计算数学模型并没有改变。但高级程序设计语言给我们带来的变革是在其语言环境中构建起了一个全新的,更抽象的虚拟计算模型。Smalltalk语言引入的对象计算模型从根本上改变了以前的传统计算模型,以前的计算模型突出的是顺序计算过程中的机器状态,而现在的对象计算模型突出的对象之间的协作其计算结果由参加计算的所有的对象的状态总体构成。而由于对象本身具有自身状态,我们也可以把一个对象看成是一个小的计算机器。这样,面向对象的计算模型就演变成了许多小的计算机器的合作计算模型。图灵机作为计算领域内的根本计算模型,精确的抓住了计算的要点:什么是可计算的,计算时间和空间存储大小开销有多大。计算模型清楚的界定了可计算性的范围,也就界定了哪些问题是可求解,哪些问题是不可求解的。OOP为程序员提供了一种更加抽象和易于理解的新的计算模型,但其本身并没有超越冯.诺依曼体系所代表的图灵机数学计算模型。所以我们不能期望OOP能帮助我们解决更多的问题,或者减少运算的复杂度。但OOP却能帮助我们用一种更容易被我们所理解和接受的方式去描叙和解决现实问题。

⑸ Java中解决安全问题的技术有哪些

对付高严重性暴露的技巧
请遵循下列建议以避免高严重性静态安全性暴露:

限制对变量的访问
让每个类和方法都成为 final,除非有足够的理由不这样做
不要依赖包作用域
使类不可克隆
使类不可序列化
使类不可逆序列化
避免硬编码敏感数据
查找恶意代码
限制对变量的访问
如果将变量声明为 public,那么外部代码就可以操作该变量。这可能会导致安全性暴露。

影响
如果实例变量为 public,那么就可以在类实例上直接访问和操作该实例变量。将实例变量声明为 protected 并不一定能解决这一问题:虽然不可能直接在类实例基础上访问这样的变量,但仍然可以从派生类访问这个变量。

清单 1 演示了带有 public 变量的代码,因为变量为 public 的,所以它暴露了。

清单 1. 带有 public 变量的代码
class Test {
public int id;
protected String name;

Test(){
id = 1;
name = "hello world";
}
//code
}

public class MyClass extends Test{
public void methodIllegalSet(String name){
this.name = name; // this should not be allowed
}

public static void main(String[] args){
Test obj = new Test();
obj.id = 123; // this should not be allowed
MyClass mc = new MyClass();
mc.methodIllegalSet("Illegal Set Value");
}
}

建议
一般来说,应该使用取值方法而不是 public 变量。按照具体问题具体对待的原则,在确定哪些变量特别重要因而应该声明为 private 时,请将编码的方便程度及成本同安全性需要加以比较。清单 2 演示了以下列方式来使之安全的代码:

清单 2. 不带有 public 变量的代码
class Test {
private int id;
private String name;

Test(){
id = 1;
name = "hello world";
}
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}

让每个类和方法都为 final
不允许扩展的类和方法应该声明为 final。这样做防止了系统外的代码扩展类并修改类的行为。

影响
仅仅将类声明为非 public 并不能防止攻击者扩展类,因为仍然可以从它自己的包内访问该类。

建议
让每个类和方法都成为 final,除非有足够的理由不这样做。按此建议,我们要求您放弃可扩展性,虽然它是使用诸如 Java 语言之类的面向对象语言的主要优点之一。在试图提供安全性时,可扩展性却成了您的敌人;可扩展性只会为攻击者提供更多给您带来麻烦的方法。

不要依赖包作用域
没有显式地标注为 public、private 或 protected 的类、方法和变量在它们自己的包内是可访问的。

影响
如果 Java 包不是封闭的,那么攻击者就可以向包内引入新类并使用该新类来访问您想保护的内容。诸如 java.lang 之类的一些包缺省是封闭的,一些 JVM 也让您封闭自己的包。然而,您最好假定包是不封闭的。

建议
从软件工程观点来看,包作用域具有重要意义,因为它可以阻止对您想隐藏的内容进行偶然的、无意中的访问。但不要依靠它来获取安全性。应该将类、方法和变量显式标注为 public、private 或 protected 中适合您特定需求的那种。

使类不可克隆
克隆允许绕过构造器而轻易地复制类实例。

影响
即使您没有有意使类可克隆,外部源仍然可以定义您的类的子类,并使该子类实现 java.lang.Cloneable。这就让攻击者创建了您的类的新实例。拷贝现有对象的内存映象生成了新的实例;虽然这样做有时候是生成新对象的可接受方法,但是大多数时候是不可接受的。清单 3 说明了因为可克隆而暴露的代码:

清单 3. 可克隆代码
class MyClass{

private int id;
private String name;

public MyClass(){
id=1;
name="HaryPorter";
}

public MyClass(int id,String name){
this.id=id;
this.name=name;
}

public void display(){
System.out.println("Id ="+id+"
"+"Name="+name);
}
}
// hackers code to clone the user class

public class Hacker extends MyClass implements Cloneable {

public static void main(String[] args){
Hacker hack=new Hacker();
try{
MyClass o=(MyClass)hack.clone();
o.display();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
}
}

建议
要防止类被克隆,可以将清单 4 中所示的方法添加到您的类中:

清单 4. 使您的代码不可克隆
public final Object clone()
throws java.lang.CloneNotSupportedException{

throw new java.lang.CloneNotSupportedException();
}

如果想让您的类可克隆并且您已经考虑了这一选择的后果,那么您仍然可以保护您的类。要做到这一点,请在您的类中定义一个为 final 的克隆方法,并让它依赖于您的一个超类中的一个非 final 克隆方法,如清单 5 中所示:

清单 5. 以安全的方式使您的代码可克隆
public final Object clone()
throws java.lang.CloneNotSupportedException {

super.clone();
}

类中出现 clone() 方法防止攻击者重新定义您的 clone 方法。

使类不可序列化
序列化允许将类实例中的数据保存在外部文件中。闯入代码可以克隆或复制实例,然后对它进行序列化。

影响
序列化是令人担忧的,因为它允许外部源获取对您的对象的内部状态的控制。这一外部源可以将您的对象之一序列化成攻击者随后可以读取的字节数组,这使得攻击者可以完全审查您的对象的内部状态,包括您标记为 private 的任何字段。它也允许攻击者访问您引用的任何对象的内部状态。

建议
要防止类中的对象被序列化,请在类中定义清单 6 中的 writeObject() 方法:

清单 6. 防止对象序列化
private final void writeObject(ObjectOutputStream out)
throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot
be serialized");
}

通过将 writeObject() 方法声明为 final,防止了攻击者覆盖该方法。

使类不可逆序列化
通过使用逆序列化,攻击者可以用外部数据或字节流来实例化类。

影响
不管类是否可以序列化,都可以对它进行逆序列化。外部源可以创建逆序列化成类实例的字节序列。这种可能为您带来了大量风险,因为您不能控制逆序列化对象的状态。请将逆序列化作为您的对象的另一种公共构造器 ? 一种您无法控制的构造器。

建议
要防止对对象的逆序列化,应该在您的类中定义清单 7 中的 readObject() 方法:

清单 7. 防止对象逆序列化
private final void readObject(ObjectInputStream in)
throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot
be deserialized");
}

通过将该方法声明为 final,防止了攻击者覆盖该方法。

避免硬编码敏感数据
您可能会尝试将诸如加密密钥之类的秘密存放在您的应用程序或库的代码。对于你们开发人员来说,这样做通常会把事情变得更简单。

影响
任何运行您的代码的人都可以完全访问以这种方法存储的秘密。没有什么东西可以防止心怀叵测的程序员或虚拟机窥探您的代码并了解其秘密。

建议
可以以一种只可被您解密的方式将秘密存储在您代码中。在这种情形下,秘密只在于您的代码所使用的算法。这样做没有多大坏处,但不要洋洋得意,认为这样做提供了牢固的保护。您可以遮掩您的源代码或字节码 ? 也就是,以一种为了解密必须知道加密格式的方法对源代码或字节码进行加密 ? 但攻击者极有可能能够推断出加密格式,对遮掩的代码进行逆向工程从而揭露其秘密。

这一问题的一种可能解决方案是:将敏感数据保存在属性文件中,无论什么时候需要这些数据,都可以从该文件读取。如果数据极其敏感,那么在访问属性文件时,您的应用程序应该使用一些加密/解密技术。

查找恶意代码
从事某个项目的某个心怀叵测的开发人员可能故意引入易受攻击的代码,打算日后利用它。这样的代码在初始化时可能会启动一个后台进程,该进程可以为闯入者开后门。它也可以更改一些敏感数据。

这样的恶意代码有三类:

类中的 main 方法
定义过且未使用的方法
注释中的死代码
影响
入口点程序可能很危险而且有恶意。通常,Java 开发人员往往在其类中编写 main() 方法,这有助于测试单个类的功能。当类从测试转移到生产环境时,带有 main() 方法的类就成为了对应用程序的潜在威胁,因为闯入者将它们用作入口点。

请检查代码中是否有未使用的方法出现。这些方法在测试期间将会通过所有的安全检查,因为在代码中不调用它们 ? 但它们可能含有硬编码在它们内部的敏感数据(虽然是测试数据)。引入一小段代码的攻击者随后可能调用这样的方法。

避免最终应用程序中的死代码(注释内的代码)。如果闯入者去掉了对这样的代码的注释,那么代码可能会影响系统的功能性。

可以在清单 8 中看到所有三种类型的恶意代码的示例:

清单 8. 潜在恶意的 Java 代码
public void unusedMethod(){
// code written to harm the system
}

public void usedMethod(){
//unusedMethod(); //code in comment put with bad intentions,
//might affect the system if uncommented
// int x = 100;
// x=x+10; //Code in comment, might affect the
//functionality of the system if uncommented
}

建议
应该将(除启动应用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代码从应用程序代码中除去。在软件交付使用之前,主要开发人员应该对敏感应用程序进行一次全面的代码评审。应该使用“Stub”或“mmy”类代替 main() 方法以测试应用程序的功能。

对付中等严重性暴露的技巧
请遵循下列建议以避免中等严重性静态安全性暴露:

不要依赖初始化
不要通过名称来比较类
不要使用内部类
不要依赖初始化
您可以不运行构造器而分配对象。这些对象使用起来不安全,因为它们不是通过构造器初始化的。

影响
在初始化时验证对象确保了数据的完整性。

例如,请想象为客户创建新帐户的 Account 对象。只有在 Account 期初余额大于 0 时,才可以开设新帐户。可以在构造器里执行这样的验证。有些人未执行构造器而创建 Account 对象,他可能创建了一个具有一些负值的新帐户,这样会使系统不一致,容易受到进一步的干预。

建议
在使用对象之前,请检查对象的初始化过程。要做到这一点,每个类都应该有一个在构造器中设置的私有布尔标志,如清单 9 中的类所示。在每个非 static 方法中,代码在任何进一步执行之前都应该检查该标志的值。如果该标志的值为 true,那么控制应该进一步继续;否则,控制应该抛出一个例外并停止执行。那些从构造器调用的方法将不会检查初始化的变量,因为在调用方法时没有设置标志。因为这些方法并不检查标志,所以应该将它们声明为 private 以防止用户直接访问它们。

清单 9. 使用布尔标志以检查初始化过程
public class MyClass{

private boolean initialized = false;
//Other variables

public MyClass (){
//variable initialization
method1();
initialized = true;
}

private void method1(){ //no need to check for initialization variable
//code
}

public void method2(){
try{
if(initialized==true){
//proceed with the business logic
}

else{
throw new Exception("Illegal State Of the object");
}
}catch(Exception e){
e.printStackTrace();
}
}
}

如果对象由逆序列化进行初始化,那么上面讨论的验证机制将难以奏效,因为在该过程中并不调用构造器。在这种情况下,类应该实现 ObjectInputValidation 接口:

清单 10. 实现 ObjectInputValidation

interface java.io.ObjectInputValidation {
public void validateObject() throws InvalidObjectException;
}

所有验证都应该在 validateObject() 方法中执行。对象还必须调用 ObjectInputStream.RegisterValidation() 方法以为逆序列化对象之后的验证进行注册。 RegisterValidation() 的第一个参数是实现 validateObject() 的对象,通常是对对象自身的引用。注:任何实现 validateObject() 的对象都可能充当对象验证器,但对象通常验证它自己对其它对象的引用。RegisterValidation() 的第二个参数是一个确定回调顺序的整数优先级,优先级数字大的比优先级数字小的先回调。同一优先级内的回调顺序则不确定。

当对象已逆序列化时,ObjectInputStream 按照从高到低的优先级顺序调用每个已注册对象上的 validateObject()。

不要通过名称来比较类
有时候,您可能需要比较两个对象的类,以确定它们是否相同;或者,您可能想看看某个对象是否是某个特定类的实例。因为 JVM 可能包括多个具有相同名称的类(具有相同名称但却在不同包内的类),所以您不应该根据名称来比较类。

影响
如果根据名称来比较类,您可能无意中将您不希望授予别人的权利授予了闯入者的类,因为闯入者可以定义与您的类同名的类。

例如,请假设您想确定某个对象是否是类 com.bar.Foo 的实例。清单 11 演示了完成这一任务的错误方法:

清单 11. 比较类的错误方法
if(obj.getClass().getName().equals("Foo")) // Wrong!
// objects class is named Foo
}else{
// object's class has some other name
}

建议
在那些非得根据名称来比较类的情况下,您必须格外小心,必须确保使用了当前类的 ClassLoader 的当前名称空间,如清单 12 中所示:

清单 12. 比较类的更好方法
if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){
// object's class is equal to
//the class that this class calls "com.bar.Foo"
}else{
// object's class is not equal to the class that
// this class calls "com.bar.Foo"
}

然而,比较类的更好方法是直接比较类对象看它们是否相等。例如,如果您想确定两个对象 a 和 b 是否属同一个类,那么您就应该使用清单 13 中的代码:

清单 13. 直接比较对象来看它们是否相等
if(a.getClass() == b.getClass()){
// objects have the same class
}else{
// objects have different classes
}

尽可能少用直接名称比较。

不要使用内部类
Java 字节码没有内部类的概念,因为编译器将内部类转换成了普通类,而如果没有将内部类声明为 private,则同一个包内的任何代码恰好能访问该普通类。

影响
因为有这一特性,所以包内的恶意代码可以访问这些内部类。如果内部类能够访问括起外部类的字段,那么情况会变得更糟。可能已经将这些字段声明为 private,这样内部类就被转换成了独立类,但当内部类访问外部类的字段时,编译器就将这些字段从专用(private)的变为在包(package)的作用域内有效的。内部类暴露了已经够糟糕的了,但更糟糕的是编译器使您将某些字段成为 private 的举动成为徒劳。

建议 如果能够不使用内部类就不要使用内部类。

对付低严重性暴露的技巧
请遵循下列建议以避免低严重性静态安全性暴露:

避免返回可变对象
检查本机方法
避免返回可变对象
Java 方法返回对象引用的副本。如果实际对象是可改变的,那么使用这样一个引用调用程序可能会改变它的内容,通常这是我们所不希望见到的。

影响
请考虑这个示例:某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。即使数组对象本身是不可改变的,也可以在数组对象以外操作数组的内容,这种操作将反映在返回该数组的对象中。如果该方法返回可改变的对象,那么事情会变得更糟;外部实体可以改变在那个类中声明的 public 变量,这种改变将反映在实际对象中。

清单 14 演示了脆弱性。getExposedObj() 方法返回了 Exposed 对象的引用副本,该对象是可变的:

清单 14. 返回可变对象的引用副本
class Exposed{
private int id;
private String name;

public Exposed(){
}
public Exposed(int id, String name){
this.id = id;
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public void setId(int id){
this.id=id;
}
public void setName(String name){
this.name = name;
}
public void display(){
System.out.println("Id = "+ id + " Name = "+ name);
}
}

public class Exp12{
private Exposed exposedObj = new Exposed(1,"Harry Porter");

public Exposed getExposedObj(){
return exposedObj; //returns a reference to the object.

}
public static void main(String[] args){
Exp12 exp12 = new Exp12();
exp12.getExposedObj().display();
Exposed exposed = exp12.getExposedObj();
exposed.setId(10);
exposed.setName("Hacker");
exp12.getExposedObj().display();
}
}

建议
如果方法返回可改变的对象,但又不希望调用程序改变该对象,请修改该方法使之不返回实际对象而是返回它的副本或克隆。要改正清单 14 中的代码,请让它返回 Exposed 对象的副本,如清单 15 中所示:

清单 15. 返回可变对象的副本
public Exposed getExposedObj(){
return new Exposed(exposedObj.getId(),exposedObj.getName());
}

或者,您的代码也可以返回 Exposed 对象的克隆。

检查本机方法
本机方法是一种 Java 方法,其实现是用另一种编程语言编写的,如 C 或 C++。有些开发人员实现本机方法,这是因为 Java 语言即使使用即时(just-in-time)编译器也比许多编译过的语言要慢。其它人需要使用本机代码是为了在 JVM 以外实现特定于平台的功能。

影响
使用本机代码时,请小心,因为对这些代码进行验证是不可能的,而且本机代码可能潜在地允许 applet 绕过通常的安全性管理器(Security Manager)和 Java 对设备访问的控制。

建议
如果非得使用本机方法,那么请检查这些方法以确定:

它们返回什么
它们获取什么作为参数
它们是否绕过安全性检查
它们是否是 public、private 等等
它们是否含有绕过包边界从而绕过包保护的方法调用
结束语
编写安全 Java 代码是十分困难的,但本文描述了一些可行的实践来帮您编写安全 Java 代码。这些建议并不能解决您的所有安全性问题,但它们将减少暴露数目。最佳软件安全性实践可以帮助确保软件正常运行。安全至关重要和高可靠系统设计者总是花费大量精力来分析和跟踪软件行为。只有通过将安全性作为至关紧要的系统特性来对待 ? 并且从一开始就将它构建到应用程序中,我们才可以避免亡羊补牢似的、修修补补的安全性方法。

阅读全文

与java请描述oo的内涵相关的资料

热点内容
java返回空数组 浏览:67
word图片导出到文件夹 浏览:118
如何保存网站里的文件 浏览:570
如何查看服务器镜像文件 浏览:480
苹果型号a1700图片高防 浏览:567
web文件上传后服务器端如何接收 浏览:287
word的常用工具栏有哪些 浏览:868
78升级萤石云 浏览:271
eclipsejava生成可执行文件 浏览:822
word编写回头文件 浏览:999
strutsjava代码使用标签 浏览:79
递归数据怎么设计表 浏览:965
大众探岳怎么匹配app 浏览:979
饭店分店开张微信推广 浏览:577
电脑文件excel是什么 浏览:866
互动大师vxplo在线编辑工具 浏览:927
造型编程用到哪些软件 浏览:417
苹果内存卡是什么样的 浏览:578
把文件夹变成exe的病毒 浏览:323
数据怎么引入sql 浏览:638

友情链接