Java笔试题解答

一、选项中哪一行代码能够替换题目中//add code here而不产生编译错误?()java

public abstract class MyClass {

     public int constInt = 5;
     //add code here
     public void method() {
     }
}

Apublic abstract void method(int a);web

B constInt = constInt + 5;数据库

C public int method();设计模式

D public abstract void anotherMethod() {}服务器

答案:Asession

解析:考察抽象类的使用。并发

抽象类遵循的原则:app

(1)abstract关键字只能修饰类和方法,不能修饰字段。
(2)抽象类不能被实例化(没法使用new关键字建立对象实例),只能被继承。
(3)抽象类能够包含属性,方法,构造方法,初始化块,内部类,枚举类,和普通类同样,普通方法必定要实现,变量能够初始化或不初始化但不能初始化后在抽象类中从新赋值或操做该变量(只能在子类中改变该变量)。
(4)抽象类中的抽象方法(加了abstract关键字的方法)不能实现。
(5)含有抽象方法的类必须定义成抽象类。
 
扩展:抽象类和接口的区别,作个总结吧:

(1)接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是能够有私有方法或私有变量的。函数

(2)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。可是,一个类却能够实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的做用。ui

(3)在abstract class 中能够有本身的数据成员,也能够有非abstarct的成员方法,而在interface中,只可以有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中通常不定义数据成员),全部的成员方法默认都是 public abstract 类型的。

(4)abstract class和interface所反映出的设计理念不一样。其实abstract class表示的是"is-a"关系,interface表示的是"has-a"关系。

(5)实现接口的必定要实现接口里定义的全部方法,而实现抽象类能够有选择地重写须要用到的方法,通常的应用里,最顶级的是接口,而后是抽象类实现接口,最后才到具体类实现。抽象类中能够有非抽象方法。接口中则不能有实现方法。

(6)接口中定义的变量默认是public static final 型,且必须给其初值,因此实现类中不能从新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值能够在子类中从新定义,也能够在子类中从新赋值。

二、下面程序的运行结果是什么()

 1 class HelloA {
 2 
 3     public HelloA() {
 4         System.out.println("HelloA");
 5     }
 6     
 7     { System.out.println("I'm A class"); }
 8     
 9     static { System.out.println("static A"); }
10 
11 }
12 
13 public class HelloB extends HelloA {
14     public HelloB() {
15         System.out.println("HelloB");
16     }
17     
18     { System.out.println("I'm B class"); }
19     
20     static { System.out.println("static B"); }
21     
22     public static void main(String[] args) { 
23      new HelloB(); 
24    }
25 
26 }

答案

static A
static B
I'm A class
HelloA
I'm B class
HelloB

解析:

     说实话我以为这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。

     对象的初始化顺序:(1)类加载以后,按从上到下(从父类到子类)执行被static修饰的语句;

                              (2)当static语句执行完以后,再执行main方法;

                              (3)若是有语句new了自身的对象,将从上到下执行构造代码块、构造器(二者能够说绑定在一块儿)。

三、[问答题]谈一下拦截器和过滤器的区别。

      拦截器和过滤器均可以用来实现横切关注功能,其区别主要在于:

      ①拦截器是基于Java反射机制的,而过滤器是基于接口回调的。

      ②过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。

      ③拦截器只能对Action请求起做用,而过滤器能够对全部请求起做用。

      ④拦截器能够访问Action上下文、值栈里的对象,而过滤器不能。

四、[问答题]Struts2中如何实现I18N?

     首先,为不一样语言地区编写不一样的资源文件;
     而后在Struts 2配置文件中配置struts.i18n.custom.resources常量;
     在Action中能够经过调用getText()方法读取资源文件获取国际化资源。
 
五、[问答题] 单例模式常见的应用场景分析。
   
     在23种设计模式中,单例模式排行老大。虽然理解简单,可是对于应用场景。你真正的熟悉么?使用单例,是因为不必每一个请求都新建一个对象,这样既浪费CPU又浪费内存;之因此用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另外一个请求,而以前请求对对象状态的改变致使了对象对另外一个请求作了错误的处理。先来讲说Java web中的单例应用场景:数据库链接池就是单例模式,有且仅有一个链接池管理者,管理多个链接池对象。咱们经常使用的service和dao层的对象一般都是 单例的(因为其全部的请求都用一个对象来处理),而struts2中的action则是多例,因为每一个请求是用一个新的对象来处理的(由于action本 身含有请求参数的值,便可改变的状态)。 log4j日志记录也是单例模式,由于从始至终都仅维护一个对象。(应用程序的日志应用,通常都何用单例模式实现,这通常是因为共享的日志文件一直处于打 开状态,由于只能有一个实例去操做,不然内容很差追加)。
 
六、[问答题]简述拦截器的工做原理以及你在项目中使用过哪些自定义拦截器。
 
      Struts 2中定义了拦截器的接口以及默认实现,实现了Interceptor接口或继承了AbstractInterceptor的类能够做为拦截器。接口中的init()方法在拦截器被建立后当即被调用,它在拦截器的生命周期内只被调用一次,能够在该方法中对相关资源进行必要的初始化。每拦截一个请求,intercept()方法就会被调用一次。destory()方法将在拦截器被销毁以前被调用, 它在拦截器的生命周期内也只被调用一次。 项目中使用过的有权限拦截器、执行时间拦截器、令牌拦截器等。

七、JSP有哪些内置对象?做用分别是什么? 

答:JSP有9个内置对象: 
     - request:封装客户端的请求,其中包含来自GET或POST请求的参数; 
     - response:封装服务器对客户端的响应; 
     - pageContext:经过该对象能够获取其余对象; 
     - session:封装用户会话的对象; 
     - application:封装服务器运行环境的对象; 
     - out:输出服务器响应的输出流对象; 
     - config:Web应用的配置对象; 
     - page:JSP页面自己(至关于Java程序中的this); 
     - exception:封装页面抛出异常的对象。

补充:若是用Servlet来生成网页中的动态内容无疑是很是繁琐的工做,另外一方面,全部的文本和HTML标签都是硬编码,即便作出微小的修改,都须要进行从新编译。JSP解决了Servlet的这些问题,它是Servlet很好的补充,能够专门用做为用户呈现视图(View),而Servlet做为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。基于Java的Web开发不少都同时使用了Servlet和JSP。JSP页面实际上是一个Servlet,可以运行Servlet的服务器(Servlet容器)一般也是JSP容器,能够提供JSP页面的运行环境,Tomcat就是一个Servlet/JSP容器。第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。JspPage接口是Servlet的子接口,所以每一个JSP页面都是一个Servlet。转换成功后,容器会编译Servlet类,以后容器加载和实例化Java字节码,并执行它一般对Servlet所作的生命周期操做。对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,若是修改过就会从新转换并从新编译并执行。若是没有则执行内存中已经存在的Servlet实例。咱们能够看一段JSP代码对应的Java程序就知道一切了,并且9个内置对象的神秘面纱也会被揭开。

 八、下面程序能正常运行吗()
public class NULL {

    public static void haha(){
        System.out.println("haha");
    }
    public static void main(String[] args) {
        ((NULL)null).haha();
    }

}

答案:能正常运行

解析:输出为haha,由于null值能够强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值仍是为null,而static方法的调用是和类名绑定的,不借助对象进行访问因此能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象确定会报空指针错了。

相关文章
相关标签/搜索