1. 靜態模塊和構造模塊的區別
靜態塊:用static申明,JVM加載類時執行,僅執行一次
構造塊:類中直接用{}定義,每一次創建對象時執行
執行順序優先級:靜態塊>main()>構造塊>構造方法
靜態塊按照申明順序執行,所以先執行public staticB t1 = newB();
該語句創建對象,則又會調用構造塊,輸出構造塊
接着執行public static B t1 = new B();
輸出構造塊
再執行
static {
System.out.println("靜態塊");
}
輸出靜態塊
最後main方法執行,創建對象,輸出構造塊。
例如:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("構造塊");
}
static
{
System.out.println("靜態塊");
}
public static void main(String[] args)
{
B t = new B();
}
}
輸出結果是:構造塊 構造塊 靜態塊
2.構造函數
父類沒有無參的構造函數,所以子類需要在自己的構造函數中顯式調用父類的構造函數,
添加
super("nm");
否則報錯:
Implicit super constructor Person() is undefined. Must explicitly
invoke another constructor
class Person {
String name = "No name";
public Person(String nm) {
name = nm;
}
}
class Employee extends Person {
public Employee(String nm) {
super(nm);
// TODO Auto-generated constructor stub
}
String empID = "0000";
}
public class Test {
public static void main(String args[]) {
Employee e = new Employee("123");
System.out.println(e.empID);
}
}
3. super()和this()的區別
1)調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
2)super()和this()類似,區別是,super從子類中調用父類的構造方法,this()在同一類內調用其它方法。
3)super()和this()均需放在構造方法內第一行。
4)儘管可以用this調用一個構造器,但卻不能調用兩個。
5)this和super不能同時出現在一個構造函數裏面,因爲this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。
6)this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
7)從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
4. JSP分頁代碼
先取總記錄數,得到總頁數,再取所有的記錄,最後顯示本頁的數據。
5. final的使用:
final所修飾的成員變量只能賦值一次,可以在類方法中賦值,也可以在聲明的時候直接賦值,而final修飾的局部變量可以在聲明的時候初始化,也可以在第一次使用的通過方法或者表達式給它賦值。Final修飾的類不能被繼承,修飾的方法不能被子類覆蓋,修飾的局部變量爲常量,只能賦值一次。
6. ThreadLocal類
1)ThreadLocal的類聲明:
public class ThreadLocal可以看出ThreadLocal並沒有繼承自Thread,也沒有實現Runnable接口。
2)ThreadLocal類爲每一個線程都維護了自己獨有的變量拷貝。每個線程都擁有了自己獨立的一個變量。所以ThreadLocal重要作用並不在於多線程間的數據共享,而是數據的獨立。
由於每個線程在訪問該變量時,讀取和修改的,都是自己獨有的那一份變量拷貝,不會被其他線程訪問,變量被徹底封閉在每個訪問的線程中。
3)ThreadLocal中定義了一個哈希表用於爲每個線程都提供一個變量的副本:
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
/**
* The table, resized as necessary.
* table.length MUST always be a power of two.
*/
private Entry[] table;
}
7. stract class 和 interface 有什麼區別
含有abstract修飾符的class即爲抽象類,abstract類不能創建的實例對象。含有abstract方法的類必須定義爲abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義爲abstract類型。
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。
兩者的語法區別:
1.抽象類可以有構造方法,接口中不能有構造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然 eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型。
5. 抽象類中可以包含靜態方法,接口中不能包含靜態方法
6. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即爲public static final類型。
7. 一個類可以實現多個接口,但只能繼承一個抽象類。
兩者在應用上的區別:
接口更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,
例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的所有Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼,僞代碼如下:
package com.lei;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet extends HttpServlet {
/**
* serialVersionUID屬性概述
*
*/
private static final long serialVersionUID = 1L;
public final void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
// 記錄訪問日誌
// 進行權限判斷
if (true)// if條件裏寫的是“具有權限”
{
try {
doService(request, response);
} catch (IOException e) {
// 記錄異常信息
}
}
}
protected abstract void doService(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException;
}
實例類如下:
package com.lei;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends BaseServlet{
/**
* serialVersionUID屬性概述
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doService(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
// TODO Auto-generated method stub
}
}
父類方法中間的某段代碼不確定,留給子類幹,就用模板方法設計模式。
備註:這道題的思路是先從總體解釋抽象類和接口的基本概念,然後再比較兩者的語法細節,最後再說兩者的應用區別。
比較兩者語法細節區別的條理是:先從一個類中的構造方法、普通成員變量和方法(包括抽象方法),靜態變量和方法,繼承性等6個方面逐一去比較回答,接着從第三者繼承的角度的回答,特別是最後用了一個典型的例子來展現自己深厚的技術功底。
8. request的forward和response的redirect
1)redirect地址欄變化,forward發生在服務器端內部從而導致瀏覽器不知道響應資源來自哪裏
2)redirect可以重定向到同一個站點上的其他應用程序中的資源,forward 只能將請求 轉發給同一個WEB應用中的組件
3)redirect默認是302碼,包含兩次請求和兩次響應
4)redirect效率較低