Java學習筆記

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效率較低

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章