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調用對象確定會報空指針錯了。

相關文章
相關標籤/搜索