Java专业面试问题

2024-05-29

Java专业面试问题(精选11篇)

篇1:Java专业面试问题

你刚毕业,在一家公司实习了一个月。

面试人问:

你在这公司实习一个月学到了什么?

[java面试问题]

篇2:Java专业面试问题

你在这公司实习一个月学到了什么?

篇3:Java专业面试问题

随着信息技术的发展, 计算机成为各行各业必不可少的辅助工具。为适应社会的发展, 要求非计算机专业的学生具备一定的编程能力。Java语言是20世纪90年代初推出的面向对象编程语言, 由于该语言具有简单易学、开发效率高等特性, 获得了业界的一致推崇, 已经成为一个覆盖面最广的主流开发语言。

Java语言已经纳入全国计算机应用能力等级考试的范围 ,一些高校也为非计算机专业的理工科学生开设了这门课。目前非计算机专业的理工科专业的Java语言程序设计教学存在应试教育现象, 以等级考试为指南, 考核学生对语法知识的掌握程度。非计算机专业的理工科专业开设Java语言程序设计课程的教学目标应该是培养应用能力, 锻炼学生的计算机编程能力; 实现素质教育, 培养学生面向对象的思维方式和软件开发的工程素质, 更好地适应社会发展需求。

结合在Java语言程序设计教学及改革经验, 对非计算机专业的理工科专业开设Java语言教学, 以培养应用能力和素质为目标的教学方式进行了探讨。

2 明确对象,因材施教

2.1 合理选择教材

非计算机专业的理工科专业Java语言程序设计的教学基本目标是培养学生学会用计算机处理实际问题的方法, 初步具备用Java编程的应用能力, 为今后进一步学习和工作奠定基础。因此对非计算机专业的理工科专业的Java语言教学, 以掌握基本内容为主, 锻炼学生的编程能力, 培养学生面向对象的思想和软件开发的工程素质。当前许多教材往往追究理论的系统性和完整性, 使得教材内容繁杂, 学生在较少的学时内难以把握知识重点。在为非计算机专业的学生选教材时, 不追究教材内容系统性和完整性, 以讲解面向对象编程的基本理论基本方法为主。

还有一类教材也不太适合非计算机专业学生使用, 这类教材忽视了非计算机专业学生的实际情况, 不重视教学示例的编写。由于教材示例不完整不详细, 缺乏可操作性, 学生上机不能顺利调试, 打击了学生的学习积极性[1]。虽然示例难度不大, 但非计算机专业的学生由于计算机知识较少, 计算机水平普遍较低, 又是初学, 往往不能举一反三。没有完整的示例上机调式观察, 对理论知识的理解也是流于一知半解,达不到教学目的。因此教材应以讲授基本内容为主, 同时附有完整的示例, 如果教材的示例不完整, 教师应完善示例,作为教学补充资料提供给学生。完整的示例具有可操作性,便于学生上机调试观察, 有助于学生理解课堂上的理论教学。

2.2 交互式教学方式

目前高校普遍使用多媒体教学, 部分运用多媒体教学的教师, 在制作教学课件时, 也往往是罗列教材上的知识点和预先设计好的示例程序。上课时通过投影显示课件, 教师向学生介绍语言的语法规则和使用方法, 示例程序编写的要点。这种教学方式, 教师和学生缺乏有效的沟通, 学生处于被动接受知识的状态。学生反映, 投影显示往往缺乏中间过程,而老师又过于依赖多媒体教学, 缺乏必要的板书, 投影一闪而过, 缺乏中间解析过程, 学生没有思考的余地, 难以理解,容易造成厌学情绪, 丧失学习的积极性。

教学改革是改革旧的教学手段和教学方法, 充分利用各种教学设备和仪器来组织教学, 达到提高教学效率和教学效果的目的。因此在制作课件时不是罗列书本一般知识点, 而是记录重点难点。教材上写的很清楚明白, 简单易懂的地方,引导学生自学。课堂教学则充分利用多媒体的优势, 现场编写程序, 设置疑问, 启发学生思考, 和学生共同探讨分析问题, 通过调试运行观察程序的结果。对于初学者易犯错的地方, 故意设置错误, 让学生排除错误, 使学生有成就感, 加深学习映像。这种通过鲜活示例组织教学的方式, 融合了启发式、讨论式教学方法, 使学生能积极主动思考, 同时实际操作性强, 便于学生课后上机模仿验证, 对培养的学生动手编程的能力是有很大帮助的。非计算机专业的学生对这种教学方式反映普遍较好, 认为老师编写程序的过程也是自己思索的过程, 思维能跟得上; 更重要的是见证了程序编写到调试运行的全过程, 可模仿性强, 易于课后自己上机实践。

2.3 浅显直观的讲授方法

非计算机专业的学生, 除了学过C语言之外, 再没有其他计算机专业背景的知识。尽管他们学过C语言, 但很多同学对指针的概念仍是一知半解。因此对非计算机专业的知识的学生要尽量用浅显的语言讲解名词术语, 避免用术语解释术语, 力争让那些基础差的同学也能理解。

Java语言中虽然没有指针的概念, 但引用、栈内存和堆内存仍然是无法回避概念。在教学过程, 在黑板上用图形的方法, 向学生讲解Java程序的内存布局模型。介绍什么样的数据存入栈内存, 什么样的数据存入堆内存, 在此基础上再介绍引用的概念。课堂上编写一段简单的代码, 和学生一起画图分析哪些数据存入了栈内存, 哪些数据存入了堆内存, 栈内存的引用类型的变量如何引用堆存。在分析程序运行时这些数据的生命周期的过程中, 水到渠成地介绍了Java语言中垃圾回收器的工作机制。

一幅直观的图形对帮助学生理解概念的本质, 往往起到事半功倍的效果。在讲到Object类的equals (Object obj) 方法时, 学生基本会联想到运算符“= =”, 想知道二者之间的异同点。对于引用类型的变量, 何时用运算符“= =”, 何时用equals (Object obj) 方法 , 仍然用图示的方法 , 结合Java程序的栈内存和堆内存的概念, 讲解运算符“= =”和equals (Object obj) 方法的差异。学生不仅理解了二者的差异 , 对Java语言中方法覆盖 (Override) 也有了新的认识。

3 培养素质和能力

3.1 培养工程素质

长期以来计算机程序设计课程强调语法规则的讲解, 编程技巧的训练。客观上造成了注重培养学生个人编程技巧, 忽视了对学生工程素质的培养, 使学生的实际应用能力赶不上软件开发行业的需求。在教学中从3个方面培养学生的工程素质。

(1) 选择主流的开发平台。对于Java程序而言 , 目前应用最广的开发工具是Eclipse, Eclipse是开源的免费软件, 功能强大, 使用便利。学生学会使用Eclipse既提高了实验效率,也使学生与社会同步接轨, 能快速进入职业程序员的角色。

(2) 让学生养成良好的代码风格。要求学生在编写程序用Java命名规范对标识符进行命名, 注意代码块的缩进对齐,添加必要的注释。清晰、美观的代码风格, 不仅有利于程序员间的沟通协作, 也有利于软件的维护。

(3) 纠正错误的认识。很多学生以为软件开发就是编写源代码, 应告诉学生软件是由程序、文档、数据3部分构成。文档能够有效地帮助软件开发人员的交流, 有助于软件产品的开发和后期的维护。培养学生学会利用Java标记和JavaDoc工具生成文档。

3.2 培养面向对象的思想

非计算机专业的学生学习Java编程不仅是进行编程技能训练, 更重要的是领悟面向对象的编程思想。教学过程中要逐步让学生理解面向对象的基本概念和基本特征, 领悟面向对象的思想, 然后用面向对象的设计思想指导编程训练。

在面向对象的设计方法中类、对象、方法是基本概念, 封装性、继承性和多态性是基本特征。在对基本概念和基本特征讲解的基础上, 用图示的方式有助于直观表达这些概念和特征, 使学生能够更加深刻领悟面向对象的概念和特征。我们以通用的UML图作为面向对象的描述语言, 利用业界广泛使用标准化图形工具有助于培养学生的实际设计能力和沟通能力。面向对象的程序设计思想是基于解决问题的设计而不是基于编程技术的设计。应该抛开具体的语言, 集中精力学习分析业务逻辑, 描述软件的业务, 解决主要问题, 然后在实现的过程中再去解决细节问题。在教学过程中有意地培养学生这种抽象的思维方式,学生就会潜移默化地学会用面向对象的思维去设计和编写程序。

3.3 培养自学能力

学习Java编程必定会用到系统定义好的Java基本类库,类库是Java语言的重要组成部分, 它包含多个包, 每个包具有特定功能, 提供了若干相关的类和接口, 程序员可以使用这些类和接口快捷方便地开发应用程序。学习Java基本类库中的基本类的正确使用是学习Java编程的一个重要组成部分,对基本类掌握了多少, 直接决定了学生开发能力的强弱。教材也都会讲解一些Java基本类的使用, 但是数量上有限。学习Java基本类的最好资料是官方的Java API文档, Java API文档随着Java版本的提升还在不断地丰富中, 因此要培养学生学习文档的能力。在教学过程中对教材中出现的基本类, 课堂上直接引导学生查阅API文档, 培养学生阅读API文档的习惯。在实验教学中特意安排使用教材之外的基本类解决问题, 潜移默化地引导学生去查阅API。这样一方面对学生提出更高的学习要求, 锻炼了学生自学的能力, 另一方面也培养了学生解决问题的应用能力, 实现传授知识与培养能力相结合的素质教育。

4 结语

篇4:Java专业面试问题

【关键词】Java;实践教学;教学改革

随着我国高等教育改革的实施,中外合作办学成为一种普遍的办学模式,这种办学模式与传统的办学模式有本质的区别。中、外双方教师共同上课,使得中外合作办学专业的授课方式和内容要和外方紧密联系,同时也要求我们的课程设置也要符合国内同行业的要求,使学生将来既能适应国内用人单位的要求,又能适应到国外继续深造。基于这个目的,我们需要对课程体系结构、教学方法、考核方式等做一系列的改革和调整。本文将对我校与美国克拉克大学合作办学的信息管理与信息系统专业(简称信管专业)在Java系列课程所做的教学改革进行探讨。

1.我校信管专业学生的特点

我校信管专业自2010年开始招生,本专业是文理兼收,相对于我校非合作办学专业来说,该专业学生基础比较薄弱,特别是一部分文科生,对计算机课程有一种天生的恐惧感,对专业课失去信心,甚至有一部分学生直接放弃计算机相关专业课的学习。为了兼顾这部分学习有困难的学生,同时考虑到美方对课程的要求,我们对Java系列课程体系做了一系列的探索性的调整,使学生都能获得良好的学习效果。

2.Java系列课程设置

随着高校教学改革的步伐,我校也进行了一系列的改革,比较明显的一点的是我校开始实施“小学期”制,即打破以往一年2个学期的制度,变为一年三个学期,第一、第二学期和以往安排一样,进行常规教学,第三学期设置为3周,专门安排学生的实习、实践教学课程。

Java课程在学生整个学习过程中占有举足轻重的地位[2],所以我们在第一学年的第二学期安排54学时的《Java程序设计基础》,其中授课40学时,实验14学时,主要让学生掌握Java程序设计的思想和方法,讲授内容主要包括Java运行环境、程序设计基础、数组、类和对象、继承与多态等基础知识。通过该课程让学生把语言基础打扎实,为以后的专业课程做好准备。为了加强学生的实际应用能力,在第一学年的第三学期安排为期1周的《Java课程设计》。到了第二学年的第一学期安排《基于Java的数据结构》,共54学时,其中授课40学时,实验14学时,讲解数据的组织形式。在第二学年的第二期安排《数据库系统原理及应用》课程,共72学时,其中授课48学时,实验24学时,主要讲解数据库的使用。这两门课程都是Java的后续课程,在第二学年的第三学期,分别安排了课程设计,使学生进一步提高了Java语言的应用能力。《Java程序设计基础》、《基于Java的数据结构》和《数据库系统原理及应用》三门课程是一脉相承、前后贯穿的,所以分布在三个连续的学期进行,使得学生的学习具有很强的连贯性。

根据本专业文理兼收的特点,结合学生的实际,我们探索出一条既适应专业要求又符合学生特点的课程设置,即到了第二学年第二学期我们在专业内部又分为系统开发方向和系统分析方向两个方向,其中系统开发方向侧重开发,即对计算机课程要求较高,而系统分析方向侧重理论分析,对计算机课程要求较低,比较适合文科学生。对于系统开发方向,在第二学年的第二学期开设《Java高级程序设计》,共48学时,其中授课28学时,实验20学时,主要讲解Java常用类库、多线程、图形界面设计、网络通信编程等。在第三学年的第一学期开设《Web开发技术》,共54学时,其中授课30学时,实验24学时,主要讲解HTML基础知识、JSP基础知识、JDBC技术、JavaBean技术、Servlet技术等,在以后教学中,我们会根据学生掌握情况,考虑增加框架技术的课程,使学生在网站设计方面能接触当前企业正在使用的前沿技术。对于系统分析方向,我们只在第三学年的第一学期开设《JSP技术基础》这一门与Java相关的课程,要求学生掌握网站设计的基本方法,能进行简单网站的开发。

3.实践教学的尝试

Java系列课程的实践性要求很强,单靠老师课堂上讲解,学生很难真正掌握,学生只有自己动手去编写代码才能掌握具体的应用[1]。鉴于此,我们在教学过程中,逐渐加大了实践教学环节,亲自引导学生理论和实际相结合。在实践教学探索中我们主要做了以下几点。

3.1改变传统的上课方式

我们改变了传统的理论课和实验课分开上的模式,改为一起上,即课堂上每人一台电脑,老师讲解完知识点,紧跟着学生做练习,一节课下来,学生能把老师讲的内容全部实践一遍,这样,当堂课的内容当堂课消化,从学生的反映来看,这种教学效果还是不错的,相比传统的方法,学生更易接受这种方式。为了提高学生的动手操作能力,每门课程都设置了课程设计环节,通过设计一个综合例子,使学生能把整门课的内容前后贯穿起来,形成一个完整的知识体系。

3.2实行“导师制”

为了让学生对自己所学专业有更深入的了解,我系每年对大二年级学生配备一名老师,实行本科生的导师制。老师负责解决学生的学习困惑,帮助他们进行职业规划,在生活上给他们提供指导和帮助,帮助他们找准自己的奋斗目标等。学生课余时间可以进导师的实验室,参与到导师的科研项目中来,加强了他们对本专业深层次知识的认识,进一步提高了他们的动手实践能力。老师一直负责他们到大四毕业,到最后毕业设计时还是跟随导师做,这样学生大学四年一直都有专人辅导,能够形成一个完整的专业知识体系。

3.3鼓励学生参加各种比赛

为了让学生检验自己所学知识的应用能力,我们鼓励学生积极参加各种比赛,只要学生感兴趣、时间允许,我们都鼓励学生积极参加,例如全国软件和信息技术专业人才大赛、齐鲁软件设计大赛、全国大学生数学建模竞赛、电子设计大赛等。参加比赛的成绩也非常好,这几年,有学生获得了省级甚至国家级奖。实践证明这种方式非常有效,通过比赛获得奖项,极大地提高了学生的学习兴趣,也使他们更加喜欢自己的专业,对自己的前途充满信心。

4.结束语

通过对Java系列课程教学的改革,取得了一定的成效,一是整个专业的学风大大好转。二是随着实践教学的加强,学生不再感觉课堂内容生硬、难懂,学生学习的主观能动性进一步提高。三是涌现出了一批专业技术水平较高的兴趣小组。通过“导师制”活动的引导,一批热爱学习的学生主动参与到社团活动中来,在他们的带动下,整个专业的学习氛围浓厚起来。今后应进一步拓宽学生的实践渠道,加强与企业间的合作,使学生能够学到当今企业正在应用的最新前沿技术,很快地适应企业的工作需求。进一步开通、完善网络学习通道,使网络学习平台充分发挥它应有的作用。 [科]

【参考文献】

[1]刘瑞歌,宋锋,周爱华等.Java系列课程的教学改革探讨与实践[J].信息技术与信息化,2012(1):21-23.

篇5:java面试问题及答案

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:

class t

{

transient int a; //不需要维持

int b; //需要维持

}

这里,如果t类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。

volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。在多线程程序中,有时两个或更多的线程共享一个相同的实例变量。考虑效率问题,每个线程可以自己保存该共享变量的私有拷贝。实际的变量副本在不同的时候更新,如当进入synchronized方法时。 用strictfp修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的java版本那样准确。切断只影响某些操作的指数。当一个类被strictfp修饰,所有的方法自动被strictfp修饰。

strictfp的意思是fp-strict,也就是说精确浮点的意思。在java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内java的编译器以及运行环境会完全依照浮点规范ieee-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。

你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:

strictfp interface a {}

public strictfp class fpdemo1 {

strictfp void f {}

}

2. 错误的使用方法

interface a {

strictfp void f();

}

public class fpdemo2 {

strictfp fpdemo2() {}

}

一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合ieee-754规范

的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。

2)抽象类和接口有什么区别?(瞬联)

1.abstract class 在 java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是“is-a”关系,interface表示的是“like-a”关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public,abstract 类型的。

3)能说一下java的反射(reflection)机制吗?(瞬联)

开放性和原因连接(causally-connected)是反射系统的两大基本要素

4)在java中怎样实现多线程?(瞬联)

extends thread

implement runnable

方法一:继承 thread 类,覆盖方法 run(),我们在创建的 thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:

public class mythread extends thread

{

int count= 1, number;

public mythread(int num)

{

number = num;

system.out.println

(“创建线程 ” + number);

}

public void run() {

while(true) {

system.out.println

(“线程 ” + number + “:计数 ” + count);

if(++count== 6) return;

}

}

public static void main(string args[])

{

for(int i = 0;i 〈 5; i++) new mythread(i+1).start();

}

}

这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 applet 类),则无法再继承 thread 类,这时如果我们又不想建立一个新的类,应该怎么办呢?

我们不妨来探索一种新的方法:我们不创建thread类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给 thread 类的实例,有点类似回调函数。但是 java 没有指针,我们只能传递一个包含这个方法的类的实例。

那么如何限制这个类必须包含这一方法呢?当然是使用接口!(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?)

java 提供了接口 java.lang.runnable 来支持这种方法。

方法二:实现 runnable 接口

runnable接口只有一个方法run(),我们声明自己的类实现runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是runnable接口并没有任何对线程的支持,我们还必须创建thread类的实例,这一点通过thread类的构造函数 public thread(runnable target);来实现。下面是一个例子:

public class mythread implements runnable

{

int count= 1, number;

public mythread(int num)

{

number = num;

system.out.println(“创建线程 ” + number);

}

public void run()

{

while(true)

{

system.out.println

(“线程 ” + number + “:计数 ” + count);

if(++count== 6) return;

}

}

public static void main(string args[])

{

for(int i = 0; i 〈 5;i++) new thread(new mythread(i+1)).start();

}

}

严格地说,创建thread子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖 thread 类的 run 方法,否则该线程执行的将是子类的 run 方法,而不是我们用以实现runnable 接口的类的 run 方法,对此大家不妨试验一下。

使用 runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 thread 来得紧凑。

综上所述,两种方法各有千秋,大家可以灵活运用。

下面让我们一起来研究一下多线程使用中的一些问题。

三、线程的四种状态

1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。

2. 可执行状态:线程可以执行,虽然不一定正在执行。cpu 时间随时可能被分配给该线程,从而使得它执行。

3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。

4. 阻塞状态:线程不会被分配 cpu 时间,无法执行。

四、线程的优先级

线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 cpu 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 cpu 时间,优先级高的线程有更大的机会获得 cpu 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。

你可以调用 thread 类的方法 getpriority() 和 setpriority()来存取线程的优先级,线程的优先级界于1(min_priority)和10(max_priority)之间,缺省是5(norm_priority)。

5)你用过哪种设计模式?(瞬联,ibm,aspentech)

设计:design

模式:pattern

框架:framework

创建模式,结构模式和行为模式

gof设计模式

a.创建模式

设计模式之factory(工厂模式)

使用工厂模式就象使用new一样频繁./10/9更新

设计模式之prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

设计模式之builder

汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,builder模式就是将这两种情况分开进行。

设计模式之singleton(单态模式)

保证一个类只有一个实例,并提供一个访问它的全局访问点 /10/9更新

b.结构模式

设计模式之facade

可扩展的使用jdbc针对不同的数据库编程,facade提供了一种灵活的实现.

设计模式之proxy

以jive为例,剖析代理模式在用户级别授权机制上的应用

设计模式之adapter

使用类再生的两个方式:组合(new)和继承(extends),这个已经在“thinking in java”中提到过.

设计模式之composite

就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于和单位做买卖。文章中还对jive再进行了剖析。

设计模式之decorator

decorator是个油漆工,给你的东东的外表刷上美丽的颜色.

设计模式之bridge

将“牛郎织女”分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合)

设计模式之flyweight

提供java运行性能,降低小而大量重复的类的开销.

c.行为模式

设计模式之template

实际上向你介绍了为什么要使用java 抽象类,该模式原理简单,使用很普遍.

设计模式之memento

很简单一个模式,就是在内存中保留原来数据的拷贝.

设计模式之observer

介绍如何使用java api提供的现成observer

设计模式之chain of responsibility

各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个.

设计模式之command

什么是将行为封装,command是最好的说明.

设计模式之state

状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换.

设计模式之strategy

不同算法各自封装,用户端可随意挑选需要的算法.

设计模式之mediator

mediator很象十字路口的红绿灯,每个车辆只需和红绿灯交互就可以.

设计模式之interpreter

主要用来对语言的分析,应用机会不多.

设计模式之visitor

访问者在进行访问时,完成一系列实质性操作,而且还可以扩展.

设计模式之iterator

篇6:面试时遇到的部分JAVA问题

29.简述java编程中事件处理模式。

30.你编写过applet吗?applet的安全权限如何?试列举java application或者applet中与servlet/jsp通信可以采用的方式。

31.简述逻辑操作(如&,|)与条件操作(如&&,||)的区别。

32.简述 Java Server Page 和 Servlet 的联系和区别。

33.简述synchronized和java.util.concurrent.locks.Lock的异同 ?

篇7:Java专业面试问题

问题:进程和线程的区别

解答:一个进程对应一个程序的执行,而一个线程则是进程执行过程中的一个单独的执行序列,一个进程可以包含多个线程,线程有时候也被称为轻量级进程.

一个Java虚拟机的实例运行在一个单独的进程中,不同的线程共享Java虚拟机进程所属的堆内存。这也是为什么不同的线程可以访问同一个对象。线 程彼此共享堆内存并保有他们自己独自的栈空间。这也是为什么当一个线程调用一个方法时,他的.局部变量可以保证线程安全。但堆内存并不是线程安全的,必须通 过显示的声明同步来确保线程安全。

问题:列举几种不同的创建线程的方法.

解答:可以通过如下几种方式:

•  继承Thread 类

•  实现Runnable 接口

•  使用Executor framework (这会创建一个线程池)

123456789101112131415classCounter extendsThread {     //method where the thread execution will start     publicvoidrun(){        //logic to execute in a thread        }     //let’s see how to start the threads    publicstaticvoidmain(String[] args){       Thread t1 = newCounter();       Thread t2 = newCounter();       t1.start();  //start the first thread. This calls the run() method.       t2.start(); //this starts the 2nd thread. This calls the run() method.      }}123456789101112131415classCounter extendsBase implementsRunnable{     //method where the thread execution will start     publicvoidrun(){        //logic to execute in a thread        }     //let us see how to start the threads    publicstaticvoidmain(String[] args){         Thread t1 = newThread(newCounter());         Thread t2 = newThread(newCounter());         t1.start();  //start the first thread. This calls the run() method.         t2.start();  //this starts the 2nd thread. This calls the run() method.      }}

通过线程池来创建更有效率,

问题:推荐通过哪种方式创建线程,为什么?

解答:最好使用Runnable接口,这样你的类就不必继承Thread类,不然当你需要多重继承的时候,你将 一筹莫展(我们都知道Java中的类只能继承自一个类,但可以同时实现多个接口)。在上面的例子中,因为我们要继承Base类,所以实现Runnable 接口成了显而易见的选择。同时你也要注意到在不同的例子中,线程是如何启动的。按照面向对象的方法论,你应该只在希望改变父类的行为的时候才去继承他。通 过实现Runnable接口来代替继承Thread类可以告诉使用者Counter是Base类型的一个对象,并会作为线程执行。

问题:简要的说明一下高级线程状态.

解答:下图说明了线程的各种状态.

篇8:Java专业面试问题

(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了Java线程方面一些典型的问题,这些问题经常被高级工程师所问到。

0、Java中多线程同步是什么?

在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。

1、解释实现多线程的几种方法?

一Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。

2、Thread.start()与Thread.run()有什么区别?

Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。

3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗? 我们需要run()&start()这两个方法是因为JVM创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的Java的多继承问题。

4、什么是ThreadLocal类,怎么使用它?

ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。

下面是线程局部变量(ThreadLocal variables)的关键点:

一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独的变量。

ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。

当多个线程访问ThreadLocal实例时,每个线程维护ThreadLocal提供的独立的变量副本。

常用的使用可在DAO模式中见到,当DAO类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)ThreadLocal难于理解,下面这些引用连接有助于你更好的理解它。《Good article on ThreadLocal on IBM DeveloperWorks 》、《理解

ThreadLocal》、《Managing data : Good example》、《Refer Java API Docs》

6、Sleep()、suspend()和wait()之间有什么区别?

Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。

注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。

object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁。

7、在静态方法上使用同步时会发生什么事?

同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。

8、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗? 可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Java没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

9、在一个对象上两个线程可以调用两个不同的同步实例方法吗?

不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有执行完该方法释放对象锁后才能执行其它同步方法。

看下面代码示例非常清晰:Common 类 有synchronizedMethod1()和synchronizedMethod2()方法,MyThread调用这两个方法。

10、什么是死锁

死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止。就JavaAPI而言,线程死锁可能发生在一下情况。

● 当两个线程相互调用Thread.join()

● 当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必需的锁,互相等待时被阻塞就有可能出现死锁。

11、什么是线程饿死,什么是活锁?

线程饿死和活锁虽然不想是死锁一样的常见问题,但是对于并发编程的设计者来说就像一次邂逅一样。

当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。JavaAPI中线程活锁可能发生在以下情形:

● 当所有线程在程序中执行Object.wait(0),参数为0的wait方法。程序将发生活锁直到在相应的对象上有线程调用Object.notify()或者

Object.notifyAll()。

● 当所有线程卡在无限循环中。

篇9:Java专业面试问题

如题,java开发工程师找工作时一般面试和笔试的问题??给点实际的题

[java开发工程师找工作时一般面试和笔试的问题?给点实际的题]

篇10:java面试官面试技巧

2、介绍自己和公司,把公司的优势做个简单的描述。

3、表明资料来源和招聘的职位,现在很多应聘者是在找工作时,海投简历,如果有必要的话简单介绍职位内容。这样做,就唤起了应聘者的记忆,获得了他的信任,而且还提高了他听电话的注意力。

4、在学历、工作经历等方面适当称赞应聘者,增加应聘者对公司的认同度。

5、告知对方已经通过了简历筛选,让应聘者觉得企业招聘有一定的门槛、流程正规,进一步增加应聘者对企业的认同度。

6、沟通中注意倾听,并恰当的做到将自己的看法拿出和对方分享或讨论。

7、邀约,提供1-2个时间供选择告知至少两个面试时间让对方选择,让对方感受到企业的重视。。

篇11:JAVA面试题

封装:

继承:子类继承父类,除private修饰以外的所以方法和属性 多态:一个对象多种状态,可以把子类对象当作父类对象来看,一旦这样做了,就只能

去调用父类中原有定义的属性和方法,也就是子类中扩展的方法或属性就不能调用了。

抽象:

2、abstractclass 和interface的区别

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

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

3、final、finally、finalize的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

4、匿名内部类是否可以作为父类被其他类继承,或做为接口被实现?

匿名内部类不被继承也不能被实现,因为它没有名字,而一个内部类只要有名字就可以作为父类被继承,也可以作为借口被实现。

5、多线程有几种实现方法,同步有几种实现方法,都是什么?

多线程有两种实现方法,分别继承继承Thread类与实现runnable借口。

同步的实现方法有两种,分别是synchronized,wait与notify。

6、string 与 stringbuffer的区别?

String的长度是不可变的,而stringbuffer的长度是可变的。如果你对字符中的内容经常进行操作,特别是内容修改时,那么就要使用stringbuffer,如果最后需要使用string,那么使用stringbuffer的tostring()方法。

7、解析XML文件的几种方式和区别

DOM:处理大型文件时其性能下降的非常厉害

SAX:SAX是事件驱动型的XML解析方式,它是顺序读取XML文件,不需要一次性全部装载整个文件。

8、sleep()和wait()有什么区别?

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

9、数组有没有length这个方法?string有没有length这个方法?

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

String有length()这个方法

10、LinkedList、ArrayList和Vector的区别? ArrayList和Vector是采用数组方式存储数据,此数组元素总数大于实际存储的数据个数以便增加和插入元素,二者都允许直接序号索引元素,但是插入数据要移动数组元素等内存操作,所以它们索引数据快、插入数据慢。

Vector由于使用了synchronized同步方法(如add、insert、remove、set、equals、hashcode等操作),因此是线程安全,性能上比ArrayList要差。

LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!LinkedList双向链表,是指可以从first依次遍历至last(从头到尾),也可以从last遍历至first(从尾到头),但首尾没有构成环,不同于双向循环链表(注意区分):

11、hashmap与hashtable的区别?

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

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

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

12、Jsp有哪些内置对象,作用分别是什么?(至少能说出五个)

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page表示从该页面产生的一个servlet实例

13、Javaservletapi中forward()与redirect()的区别?

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

14、重载(overload)与重写(override)的区别?

Overload:方法名相同,参数不同,与返回值无关

Override:方法名相同,参数相同,相同的返回值,建立在继承的基础之上

15、什么是单例模式,在程序中如何使用?

单例模式确保一个类只有一个实例 饿汉式单例类

public class Singleton {

private Singleton(){}

private static Singleton instance = new Singleton();

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;

}

}

16、Servlet生命周期?

加载和实例化

初始化init()

请求处理service()

服务终止destroy()

17、spring中IOC与AOP的含义?

IOC:控制反转,是一种设计模式,一层含义控制权的转移,由传统的在程序中控制依赖转移到由容器来控制,第二层是依赖注入将互相依赖的对象分离,在spring配置文件中描述它们的依赖关心,它们的依赖关系只是在使用的时候才建立

AOP:面向切面,是一种编程思想,oop的延续,将系统中非核心的业务提取出来,进行单独的处理,比如事务、日志和安全等

Spring的AOP和IOC都是为了解决系统代码耦合度过高的问题,使用代码重用性高,易于维护,不过AOP和IOC并不是spring中特有的,只是spring把它们应用的更灵活方便。

18、hibernate与JDBC的区别?

相同点:

1>两者都是JAVA的数据库操作中间件。

2>两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。

3>两者都可以对数据库的更新操作进行显式的事务处理。

不同点:

1>使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言

2>操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。3>数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。

19、struts中的标签库有几种,分别是?

有5种标签,分别是:bean标签库、html标签库、logic标签库、tiles标签库nested标签库

20、Error与Exception有什么区别?

Error表示系统级的错误和程序不必处理的异常,Exception表示需要捕捉或者需要程序进行处理的异常。

21、Collection和Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

22、GC是什么?为什么要有GC?(基础)。

GC是垃圾收集器。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

要请求垃圾收集,可以调用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

23、启动一个线程是用run()还是start()?

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

24、&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

25、heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方

式进行处理。

堆是栈的一个组成元素

26、List, Set, Map是否继承自Collection接口?

List,Set是,Map不是

27、MVC的各个部分都有那些技术来实现?如何实现?

MVC 是Model-View-Controller的简写。“Model” 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View” 是应用的表示面(由JSP页面产生),“Controller” 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

28、Static Nested Class 和 Inner Class的不同。

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

29、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类

(concrete class)?

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

30、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

31、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 不能,一个对象的一个synchronized方法只能由一个线程访问。

32、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

33、JSP中动态INCLUDE与静态INCLUDE的区别?

动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。

上一篇:关于“扶起与不扶摔倒老人”的论文下一篇:2010年乡镇工作思路与计划