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)接口是公開的,里面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的。
(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?
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個內置對象的神秘面紗也會被揭開。
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調用對象肯定會報空指針錯了。