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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM