一、選項中哪一行代碼能夠替換題目中//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)接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是能夠有私有方法或私有變量的。函數
(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?
七、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調用對象確定會報空指針錯了。