Java笔试题解答

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

public abstract class MyClass {

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

Apublic abstract void method(int a);

B constInt = constInt + 5;

C public int method();

D public abstract void anotherMethod() {}

答案:A

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

抽象类遵循的原则:

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

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

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

(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 型,其值可以在子类中重新定义,也可以在子类中重新赋值。

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

 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了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

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

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

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

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

      ③拦截器只能对Action请求起作用,而过滤器可以对所有请求起作用。

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

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

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

7、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个内置对象的神秘面纱也会被揭开。

 8、下面程序能正常运行吗()
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调用对象肯定会报空指针错了。

原文地址:https://www.cnblogs.com/lwlxqlccc/p/6370829.html