java笔试试题

一.智力测试

12个钉子一个天平,现知道只有一个和其它的重量不同,问能否称三次就能找到那个钉子。 
(注意:此题并未说明那个钉子比其他钉子重或轻,没有砝码,天平足够承受12个钉子重量)

答:

第一次称,在天平两端分别放四个,如果平衡,说明问题钉子在没称的四个中,第二步从这四个钉子中拿出三个放一边,另一边拿三个正常钉子,如果平,则钉子就 是没称过的那个钉子,否则钉子在拿上来的三个钉子里,而且如果这三个钉子比三个正常钉子重,说明有问题的钉子重,否则轻。第三步随便从三个中拿两个出来 称,如果平,就是余下的那个,如果不平,则根据第二步得出的钉子是重还是轻可知问题钉子是重点还是轻的那个。

如果第一次不平衡,则记下哪 四个重,哪四个轻。第二次从四个重的钉子中拿出三个,再加上一轻的一边的钉子放左边,右边放余下的重的一边的钉子加三个正常钉子,这样如果左边重,则问题 钉子在左边的三个重钉子中,而且它比普通钉子重,因为右边是三个钉子是正常钉子,余下那个如果是比正常钉子重的话,应该是右倾,而不是左倾。如果右边重, 则问题钉子就是右边那个唯一的重边的钉子。如果平衡,说明不所有称上钉子正常,问题钉子不是重钉子,而是轻钉子,而且在三个未拿上称的轻边钉子中。

这样第三次称是就已知哪三个钉子有问题,而且问题是偏重还是偏轻,随便拿两个钉子一称,如果平衡,说明钉子是没称的那个,如果不平衡,则根据第二步得出的结论,找出偏轻,或偏重的那个钉子既可。

二.jsp内置对象

1.request对象

  客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
  response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
  session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例. 
4.out对象
  out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
  page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
  
  application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动, 直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性 的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
  exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
  pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
9.config对象
  config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
三。Java中final,finalized,finally
final:
final可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一。
final成员
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,二是在构造函数中,两者只能选其一。
下面程序很简单的演示了final的常规用法:
public class Test{
final int t = 1; // 在定义时给值
// 或者(两者只能选其一)
final int t;
public Test(){
t = 3; // 构造时给值
}
}

还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以 在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也 会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
public class Test{
void print(final String str){
class InnerTest{
InnerTest (){
System.out.println(str);
}
}
InnerTest it=new InnerTest ();
}
public static void main(String[] args){
Test test=new Test();
test.print("Hello word!!!");
}
}
final方法
将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写 这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline(行内)调用的机制,它会使 你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你 的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的 设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

finally:
finally 关键字是对 Java 异常处理模型的最佳补充。 finally 结构使代码总会执行,而不管有无异常发生。使用finally 可以维护对象的内部状态,并可以清理非内存资源。如果没有 finally,您的代码就会很费解。例如,下面的代码说明,在不使用finally 的情况下您如何编写代码来释放非内存资源:

public void writeFile(String filePath, String fileName, String args)
throws IOException

{

FileWriter fw = new FileWriter(filePath+ fileName);
try {

fw.write(args);
} catch (IOException e) {
//1
fw.close();
throw e;
}
//2
fw.close();
}
这段代码创建了一个FileWriter object,并调用 write 方法。在退出该方法之前,您必须关闭FileWriter object,以避免资源漏洞。为了完成这一任务,我们在 //2 处调用 close,它是该方法的最后一条语句。但是,如果 try 块中发生一个异常会怎么样呢?在这种情况下,//2 处的 close 调用永远不会发生。因此,您必须捕获这个异常,并在重新发出这个异常之前在//1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭FileWriter object。这样编写代码既麻烦又易于出错,但在没有finally 的情况下这是必不可少的。有了 finally,前面的代码就可以重写为以下的形式:

public void writeFile(String filePath, String fileName, String args)
throws IOException

{

FileWriter fw = new FileWriter(filePath+ fileName);
try {

fw.write(args);
} catch (IOException e) {
throw e;
} finally {

fw.close();
}
}
finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用close 方法。这样您就可以确信FileWriter object被关闭并且您没有泄漏资源。

finalize:

  根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。

  通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键 的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应 该仅仅依靠finalize来释放资源。

你可能感兴趣的:(java,jsp,object,String,服务器,application)