Java面试题总结.docx

上传人:b****8 文档编号:9350371 上传时间:2023-02-04 格式:DOCX 页数:41 大小:45.79KB
下载 相关 举报
Java面试题总结.docx_第1页
第1页 / 共41页
Java面试题总结.docx_第2页
第2页 / 共41页
Java面试题总结.docx_第3页
第3页 / 共41页
Java面试题总结.docx_第4页
第4页 / 共41页
Java面试题总结.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

Java面试题总结.docx

《Java面试题总结.docx》由会员分享,可在线阅读,更多相关《Java面试题总结.docx(41页珍藏版)》请在冰豆网上搜索。

Java面试题总结.docx

Java面试题总结

Java面试题总结

●面向对象(OOP)

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

答:

主要有以下四方面:

(1)抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。

抽象包括两个方面,一是过程抽象,二是数据抽象。

(2)继承:

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。

对象的一个新类可以从现有的类中派生,这个过程称为类继承。

新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。

派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

(3)封装:

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。

面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

(4)多态性:

多态性是指允许不同类的对象对同一消息作出响应。

多态性包括参数化多态性和包含多态性。

多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

2、在java中一个类被声明为final类型,表示了什么意思?

表示该类不能被继承,是顶级/终太类。

3、谈谈final,finally,finalize的区别。

final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。

因此一个类不能既被声明为abstract的,又被声明为final的。

将变量或方法声明为final,可以保证它们在使用中不被改变。

被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。

被声明为final的方法也同样只能使用,不能重写。

finally—异常处理时提供finally块来执行任何清除操作。

如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。

finalize—方法名。

Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

它是在Object类中定义的,因此所有的类都继承了它。

子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。

finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

4、Overload和Override的区别。

Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。

重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。

子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

Overloaded的方法是可以改变返回值的类型。

5、abstractclass和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。

不能创建abstract类的实例。

然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。

不能有抽象构造函数或抽象静态方法。

Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。

取而代之,在子类中实现该方法。

知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。

在接口中,所有方法都是抽象的。

多继承性可通过实现这样的接口而获得。

接口中的所有方法都是抽象的,没有一个有程序体。

接口只可以定义staticfinal成员变量。

接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。

当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。

然后,它可以在实现了该接口的类的任何对象上调用接口的方法。

由于有抽象类,它允许使用接口名作为引用变量的类型。

通常的动态联编将生效。

引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。

6、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

都不能

7、接口是否可继承接口?

抽象类是否可实现(implements)接口?

抽象类是否可继承实体类(concreteclass)?

接口6可以继承接口。

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

8、构造器Constructor是否可被override?

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

9.是否可以继承String类?

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

●Struts

1、STRUTS的应用(如STRUTS架构)

答:

Struts是采用JavaServlet/JavaServerPages技术,开发Web应用程序的开放源码的framework。

采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。

Struts有如下的主要功能:

一.包含一个controllerservlet,能将用户的请求发送到相应的Action对象。

二.JSP自由tag库,并且在controllerservlet中提供关联支持,帮助开发员创建交互式表单应用。

三.提供了一系列实用对象:

XML处理、通过JavareflectionAPIs自动处理JavaBeans属性、国际化的提示和消息。

2.Struts2与Struts1的对比

Action类:

(1)Struts1要求Action类继承一个抽象基类。

Struts1的一个普遍问题是使用抽象类编程而不是接口。

(2)Struts2Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。

Struts2提供一个ActionSupport基类去实现常用的接口。

Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:

(1)Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。

单例策略限制了Struts1Action能作的事,并且要在开发时特别小心。

Action资源必须是线程安全的或同步的。

(2)Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。

(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet依赖:

(1)Struts1Action依赖于ServletAPI,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。

(2)Struts2Action不依赖于容器,允许Action脱离容器单独被测试。

如果需要,Struts2Action仍然可以访问初始的request和response。

但是,其他的元素减少或者消除了直接访问HttpServetRequest和HttpServletResponse的必要性。

可测性:

(1)测试Struts1Action的一个主要问题是execute方法暴露了servletAPI(这使得测试要依赖于容器)。

一个第三方扩展--StrutsTestCase--提供了一套Struts1的模拟对象(来进行测试)。

(2)Struts2Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:

(1)Struts1使用ActionForm对象捕获输入。

所有的ActionForm必须继承一个基类。

因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。

动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

(2)Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。

输入属性可能是有自己(子)属性的rich对象类型。

Action属性能够通过web页面上的taglibs访问。

Struts2也支持ActionForm模式。

rich对象类型,包括业务对象,能够用作输入/输出对象。

这种ModelDriven特性简化了taglib对POJO输入对象的引用。

表达式语言:

(1)Struts1整合了JSTL,因此使用JSTLEL。

这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

(2)Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"ObjectGraphNotationLanguage"(OGNL).

绑定值到页面(view):

(1)Struts1使用标准JSP机制把对象绑定到页面中来访问。

(2)Struts2使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。

ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

 

类型转换:

(1)Struts1ActionForm属性通常都是String类型。

Struts1使用Commons-Beanutils进行类型转换。

每个类一个转换器,对每一个实例来说是不可配置的。

(2)Struts2使用OGNL进行类型转换。

提供基本和常用对象的转换器。

校验:

(1)Struts1支持在ActionForm的validate方法中手动校验,或者通过CommonsValidator的扩展来校验。

同一个类可以有不同的校验内容,但不能校验子对象。

(2)Struts2支持通过validate方法和XWork校验框架来进行校验。

XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:

(1)Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

(2)Struts2支持通过拦截器堆栈(InterceptorStacks)为每一个Action创建不同的生命周期。

堆栈能够根据需要和不同的Action一起使用。

3.一个牛人出给软件工程师的面试题2010-11-0416:

101.struts,spring,hibernate这样的开源框架,他们的历史局限性在哪里?

在何种情况下会不适合用这些框架?

struts是以请求回答方式为基础的.ajax,flash等富客户端越来越多了.....

spring是由于java的静态类型限制,等java可以支持动态方法添加之后.....

hibernate是由于数据库都是关系型的,等数据库面向了对象之后.....

综上所述...ssh蹦达不了几天了.

4.如果要设计一个搜索引擎,像google那样只有两个页面,要求性能最大化,web方面应该如何设计?

(不需要考虑搜索的逻辑)

性能:

1客户端:

js的写法,数据排列,不同浏览器区别.

2服务器:

逻辑,计算,缓存,减少I/O,提高命中

3传输:

带宽,缓存,异步,进度条,并发,集群,数据压缩.

我认为最主要的性能是人的体验,其它都是可以放到第二位去的.

5.如果要设计一个用于小型路由器中的web系统,应该如何来设计?

使用不需要并发多线程的简单文件服务器提交后直接改文件.

不使用常规异常捕获方式

(由于选择性少所以根本不使用异常,只提供软硬的复位)

6.请评价下你所熟悉的web框架的可测试性如何,struts,springMVC,webwork或其他均可.在什么样的条件下才能对web系统引入自动化测试?

请描述一套完备的面向web系统的自动化测试框架所应当具有的特性.

由于容器的限制所以:

web,spring,hibernate都不是很好测试.

由于大多数web是以人的体验为主的.主观概念变成代码代价过高

由于页面生成工具没有足够的测试支持.所以写出的代码非常难以程序化自动化

现有的seleniumIDE还不是很稳定

如果把html,js,css分开,页面内容以json或xml来传输,页面的逻辑由js二次绚染成型那么测试成本会下降很多.....

(开发成本提高2到5倍)

 

7.企业级应用有哪些特殊要求?

在何种情况下我们不需要考虑这些要求?

性能,扩展性,7*24小时,

性能问题在出现性能问题之前不考虑

扩展性问题在签定长期维护,二期开发合同之前不考虑

7*24工作系统一般不考虑...开发中本身就是

8.你们从前的研发流程是怎样的?

如果由你来设计研发流程,是否能大幅提高生产力和开发质量?

如果能,那体现在哪些方面?

如果不能,瓶颈在哪里?

......................我设计的.........

瓶颈很大一部分是由于没有勇气去尝试新的实践.

-----------------------------------------------------------------------------------------------------------------------------

1.struts,spring,hibernate这样的开源框架,他们的历史局限性在哪里?

在何种情况下会不适合用这些框架?

ssh框架的目的是节省开发成本,提高应用的可扩展性。

但是由于框架的运行时速度相对缓慢,所以在需要提供高性能的、与体验无关的应用时建议直接使用Servlet/JSP作为基础架构。

 

2.如果要设计一个搜索引擎,像google那样只有两个页面,要求性能最大化,web方面应该如何设计?

(不需要考虑搜索的逻辑)

在WEB方面追求性能最大化就意味着用户从进入第一个页面到获得准确结果的时间最小化,所以:

a.采用至简的WEB设计,以及明示的功能引导。

b.一定要有诸如搜索下拉框提示等辅助工具

c.搜索结果格式鲜明、重点突出。

 

3.如果要设计一个用于小型路由器中的web系统,应该如何来设计?

a.因需要强调高性能,故需要采取最原生态的WEB技术作为基础机构(观点类似于问题1)。

b.因需要强调实时性,故采用AJAX技术作为信息获取基础手段,以定时获取相应信息。

c.不要加入任何RIA特性。

d.页面中要以图表为主要展示手段。

e.其他一些常规注意事项在此略过。

 

4.请评价下你所熟悉的web框架的可测试性如何,struts,springMVC,webwork或其他均可.在什么样的条件下才能对web系统引入自动化测试?

请描述一套完备的面向web系统的自动化测试框架所应当具有的特性.

a.Struts2和SpringMVC的可测试性强于Strust1。

Struts1非常难于测试。

b.自动化测试需要一套完备的解决方案支持,需要根据具体需要定制测试方案,系统代码需要预先做好单元测试和模块测试方面的准备,这样之后的集成测试以及自动化测试才有基础、有意义。

c.主要要从几个方面考虑:

单元测试及集成测试的统一执行能力;系统用户输入模拟测试测试;并发访问测试能力;测试覆盖度检查能力;测试中断的问题跟踪能力;完备准确地报告生成能力等等。

 

5.企业级应用有哪些特殊要求?

在何种情况下我们不需要考虑这些要求?

需要关注

a.业务优先,做好系统分析,紧跟用户需求。

b.系统界面风格需要与企业文化相匹配。

c.系统各操作的示意和导向明确,要针对目标用户群进行必要调整。

d.要着眼于怎样能使系统真正帮助企业实现更多的价值。

e.根据需要做好外部交互和接口。

f.可移植的系统。

(根据不同客户的已有资源进行环境搭建,如果整个系统只是针对个别用户定制则此条忽略)

可暂时忽略:

a.超高性能系统构建

b.玄酷的用户界面

c.集群和并行扩展能力(如确无需要)

 

6.你们从前的研发流程是怎样的?

如果由你来设计研发流程,是否能大幅提高生产力和开发质量?

如果能,那体现在哪些方面?

如果不能,瓶颈在哪里?

软件研发工作最重要的就是流程和规范的贯彻和执行。

具体流程略,研发流程是否高效往往取决于团队管理的合理性。

从团队管理方面建议从几方面考虑:

a.关注木桶原则,注重团队中每位成员,尤其是水平较低人员的培训和技能提高。

b.明确开发方式和流程,并严格贯彻执行。

c.制定开发中的各种规范,并根据规范严格要求每位成员,必要时进行培训。

d.建立良好的代码测试、审查和责任制度,严格绩效管理。

这方面的关键点和瓶颈均存在于贯彻执行上,如果执行不力则任何流程规范都会形同虚设。

这就需要团队管理者拥有较强的执行力甚至是自我约束力。

-----------------------------------------------------------------------------------------------------------------------------

1.struts,spring,hibernate这样的开源框架,他们的历史局限性在哪里?

在何种情况下会不适合用这些框架?

ssh针对EJB的改良,适用于企业级应用。

历史局限性:

动态性不足,不能快速修改功能模块,OO和关系数据的阻抗不匹配,开发效率低

不适用场景:

简单的web系统,逻辑处理少的应用。

2.如果要设计一个搜索引擎,像google那样只有两个页面,要求性能最大化,web方面应该如何设计?

(不需要考虑搜索的逻辑)

服务器方面对请求频繁的页面进行缓存和预读;客户端尽量使用本地缓存;传输数据进行压缩。

3.如果要设计一个用于小型路由器中的web系统,应该如何来设计?

使用cgi或者自己开发web服务器,尽可能的精炼简单,需要考虑并发冲突

4.请评价下你所熟悉的web框架的可测试性如何,struts,springMVC,webwork或其他均可.在什么样的条件下才能对web系统引入自动化测试?

请描述一套完备的面向web系统的自动化测试框架所应当具有的特性.

struts:

应该是struts1的测试性最差;springMVC和webwork的测试性良好,主要是Mock测试。

web自动化测试在系统正常运行,并功能完成后引入。

自动化测试框架的特性:

定时,测试数据的准备和回复,页面显示和逻辑诊断,截图。

5.企业级应用有哪些特殊要求?

在何种情况下我们不需要考虑这些要求?

系统运行的稳定性,业务要求多种多样,功能的扩展性,数据的备份和回复。

针对某一业务需求时,不需要考虑扩展性

6.你们从前的研发流程是怎样的?

如果由你来设计研发流程,是否能大幅提高生产力和开发质量?

如果能,那体现在哪些方面?

如果不能,瓶颈在哪里?

psp和tdd

研发人员的执行能力是瓶颈

7.谈谈你对Struts的理解。

答:

(1).struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。

我们可以在web.xml文件中将符合某种特征的所有请求交给

这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。

(2).ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java

类,这个类中的每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?

看配置文件。

(3).要说明的是,ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性,我们后面结合实际的运行效果进行分析。

(4).action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。

 

5.Struts优缺点

优点:

1.实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.

2.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率

3.页面导航

使系统的脉络更加清晰。

通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。

尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

4.提供Exception处理机制.

5.数据库链接池管理

6.支持I18N

缺点

一、转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器

二、Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。

所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。

三、测试不方便.Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。

不过有一个Junit的扩展工具StrutsTestCase可以实现它的单元测试。

四、类型的转换.Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。

但它的转化都是在Class级别,而且转化的类型是不可配置的。

类型转化时的错误信息返回给用户也是非常困难的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1