簡答題:
static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。這實際上正是static方法的主要用途
1面向對象的特徵:抽象,繼承,封裝,多態性
2基本數據類型:byte,char,short,int,lang,float,double,boolean
3String和StringBuffer的區別?前者的字符串不可改變,後者可以修改。
4說出ArrayList,Vector, LinkedList的存儲性能和特性?ArrayList和Vector都採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
5EJB是基於哪些技術實現的?SessionBean,EntityBean,Message Driven Bean,基於JNDI,RMI,JAT等技術實現。SessionBean是非持久性對象,
EntityBean是持久性對象
6HashMap和Hashtable的區別?Hashtable和HashMap對象可以讓你把一個key和一個value結合起來,key和value必須是對象,所以原始數據類型必須轉化爲對象後才能進行存儲,爲了將一個特定類的對象作爲key,這個類必須必須提供hashCode(),equals()方法。
區別:hashMap允許存儲null(空) key,是非線程安全的,多線程訪問它是,它必須提供同步方法;hashTable不允許存儲null,是線程安全的,不用提供同步方法。
7final, finally, finalize的區別?final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。finally是異常處理語句結構的一部分,表示總是執行。finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
8sleep() 和 wait() 有什麼區別?sleep()是線程類(Thread)的方法,調用此方法時,可以使線程暫時進入暫停狀態,等到其他線程執行完畢後會自動恢復,不會放棄對象鎖。而wait()是Object類的方法,會使本線程放棄對象鎖,必須通過notify()方法才能喚醒它。
9Overload和Override的區別?二者是多態性的不同表現,重載Overloa是一個類中多態性的表現(定義多個同名方法,它們具有不同的參數個數或者參數類型);重寫Override是類之間多態性的表現。
10forward 和redirect的區別?forward是服務器請求資源,服務器直接訪問目標URL地址,並把響應內容發給瀏覽器,地址欄中的地址不會變;redirect是服務端根據邏輯,發出一個狀態嗎,告訴瀏覽器重定向哪個URL地址
11什麼時候用assert?assertion是一種調試方式,它一般是程序中的一條語句,對一個boolean表達式進行檢查,一個正確的程序必須保證這個表達式的值爲true。
12short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)
short s1 = 1; s1 += 1;(可以正確編譯),這兩個表達式都被稱爲賦值表達式。(x = x + i)表達式使用的是簡單賦值操作符(=),而(x += i)表達式使用的是複合賦值操作符。Java語言規範中講到,複合賦值(E1 op=E2)等價於簡單賦值(E1=(T)((E1) op (E2))),其中T是E1的類型,除非E1只被計算一次。 換句話說,複合賦值表達式自動地將所執行計算的結果轉型爲其左側變量的類型。
13給我一個你最常見到的runtime exception? BufferOverflowException,BufferUnderflowException,EmptyStackException,IllegalArgumentException, IndexOutOfBoundsException, MissingResourceException。
14接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。
現在,你應該瞭解了資料給的那句語焉不詳的“實體類必須有明確的構造函數”的含義:
1.沒寫構造器的,那是擁有默認無參公有構造函數的,子類可以什麼都不寫,讓默認構造器去調用它。這是最初那兩行代碼的情況。
2.寫了子類可訪問的無參構造器的,也是一樣,子類裏可以什麼都不寫,用默認機制調用。
3.寫了 有參構造器卻沒寫無參構造器的,父類裏沒有子類可訪問的無參構造器,子類必須在子類構造器裏的第一句寫明,調用父類有參構造器,並把參數傳進去。
4.聲明爲final的以及所有構造器都不在子類訪問權限之內的類無法繼承
其實只要是在類的繼承中,無論抽象還是實體,都需要符合這個規則的。
15abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?都不能
16Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
Set裏的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等。
17構造器Constructor是否可被override? 構造器不能被繼承,所以不能重寫,但可以重載
18 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。
19請說出你所知道的線程同步的方法。
wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
20多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
同步的實現方面有兩種,分別是synchronized,wait與notify
21什麼情況下調用doGet()和doPost()?
Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。
21servlet的生命週期
web容器加載servlet,生命週期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
22頁面間傳遞對象的方法:session,request,cookie,application
23JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?JSP本質上市Servlet的簡易表現,JSP側重於視圖,Servlet側重於控制邏輯。
24四種會話跟蹤技術 page 當前頁面有效 request 瀏覽器對服務器的一次請求有效,服務器返回請求後失效 session 在服務器規定會話最長時間範圍內有效,對瀏覽器串口和其子窗口。 application 就是對整個正在運行的項目有效了。 25簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別。 區別主要答兩點:a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以操作數值型 b.邏輯操作不會產生短路
26簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。
27EJB的幾種類型
會話(Session)Bean ,實體(Entity)Bean 消息驅動的(Message Driven)Bean
會話Bean又可分爲有狀態(Stateful)和無狀態(Stateless)兩種
28Servlet執行時一般實現哪幾個方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
29排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序)
30請對以下在J2EE中常用的名詞進行解釋(或簡單描述)
web容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,我們把遵守以上標準的WEB服務器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。例如郵件服務、事務管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分佈式應用程序的功能。
JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通訊。包括點對點和廣播。
JTA:(Java Transaction API)JAVA事務服務。提供各種分佈式事務服務。應用程序只需調用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,我們可以在本地計算機上實現對其直接調用。當然這是要通過一定的規範才能在異構的系統之間進行通信。RMI是JAVA特有的
31throw語句用來明確地拋出一個“異常”。throws用來標明一個成員函數可能拋出的各種“異常”。
32MVC的各個部分都有那些技術來實現?如何實現?
MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
33java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
字節流,字符流。字節流繼承於InputStream OutputStream,字符流繼承於InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是爲了提高性能和使用方便。
34什麼是java序列化,如何實現java序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的
35List、Map、Set三個接口,存取元素時,各有什麼特點?
List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 保存key-value值,value可多值。
36jsp有哪些動作?作用分別是什麼?
JSP共有以下6種基本動作 jsp:include:在頁面被請求的時候引入一個文件。 jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設置JavaBean的屬性。 jsp:getProperty:輸出某個JavaBean的屬性。 jsp:forward:把請求轉到一個新的頁面。 jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記。
37
public class ByteDemo {
2 public static void main(String[] args) {
3 byte b1=2;
4 byte b2=3;
5 b1=(byte)(b1+b2); // 語句1 加法,轉int
6 b1+=b2; //語句2 賦值,不轉int
7 }
8 }
b1+=b2;是否和語句b1=b1+b2完全等價?
答案是否定的,上面程序中的語句1和語句2給出了證明。語句1中byte類型參數與運算時要先轉換爲int型,因此要進行強制類型轉換。而語句2中,自動進行類型轉換(我的理解:我們可以把“b11+=b2;”看做是對“b1=(byte)(b1+b2);”的優化!)
1 public class Test5 {
2 public static void main(String [] args){
3 int i=2;
4 System.out.println(i++); //2
5 System.out.println(i); //3
6 int a=i++ + ++i; //3+5=8
7 System.out.println(a);
8 System.out.println(i); //5
9 for(int j=0;j<1000;j++){
10 i=i++;
11 }
12 System.out.println(i); //5
13 }
14 }
程序分析:
爲什麼經過1000次循環後,i=i++;的結果仍然是5?
(老師講解)++的運算符優先級高於=(賦值)運算符,i++的運算結果爲5,進入寄存器,這時寄存器中存放的值爲5。然後i的值變爲6,繼續執行賦值語句,賦值時,把寄存器中的值賦5值給i,因此i的值是5和6之間來回切換的!
(我的理解)++的運算符優先級高於=(賦值)運算符,因此這個表達式的執行順序如下:①運算i++這個表達式的結果爲5 。----> ②i的值自加1(i++先參與運算,再自加1),即i的值變爲6。----> ③將i++這個表達式的值,即第①部的結果賦值給變量i。("="表達式是將右邊表達式的值賦值與左邊的變量,因此是將5賦於i,而不是將6賦於i)。整個循環過程i的值在5和6之間來回切換。
3 字符串是常量,一旦被創建,他們的值就不能改變
1 String a="a";
2 String b="b";
3 String c="ab";
4 String d="ab";
5 String e=a+b;
程序中用來存放數據的內存分爲四塊
1、全局區(靜態區)(static)
2、文字常量區 :常量字符串就是放在這塊區域,即是我們常說起的常量池。
3、棧區(stack):存放函數的參數值,局部變量的值等。
4、堆區(heap) : 存放對象
當我們定義字符串
String a = "a";
a在棧區,“a”是字符串常量,在常量池中
String b = "b";
b在棧區,“b”在常量池
String c="ab";
c在棧區,“ab”在常量池
String d="ab";
d在棧區,這個時候常量池裏已經有"ab",所以直接使用已經有的那個“ab”
所以這個時候c和d都指向的常量池裏面的同一個“ab”
String e=a+b;
e在棧區,a+b實際上產生了一個新的String對象,既然是String對象,所以結果“ab”放在堆區中,即e指向的是堆裏的“ab”
這樣的情況下,c==d爲true,c==e爲false
另外,如果定義的是字符串對象
String str1 = new String("ab");
str1在棧區,創建的“ab”字符串對象在堆區
String str2 = new String("ab");
str2在棧區,又創建的一個新的“ab”對象也在堆區,不過和剛纔的“ab”不是同一個。
相當於堆區中有兩個字符串對象,不過正好內容都是“ab”而已。
Java 接口和Java 抽象類對比
1 )Java 接口和 Java 抽象類最大的一個區別,就在於 Java 抽象類可以提供某些方法的部分實現,而 Java 接口不可以,這大概就是 Java 抽象類唯一的優點吧,但這個優點非常有用。如果向一個抽象類里加入一個新的具體方法時,那麼它所有的子類都一下子都得到了這個新方法,而 Java 接口做不到這一點,如果向一個 Java 接口裏加入一個新方法,所有實現這個接口的類就無法成功通過編譯了,因爲你必須讓每一個類都再實現這個方法才行,這顯然是Java 接口的缺點。
2 )一個抽象類的實現只能由這個抽象類的子類給出,也就是說,這個實現處在抽象類所定義出的繼承的等級結構中,而由於 Java 語言的單繼承性,所以抽象類作爲類型定義工具的效能大打折扣。在這一點上,Java 接口的優勢就出來了,任何一個實現了一個 Java 接口所規定的方法的類都可以具有這個接口的類型,而一個類可以實現任意多個 Java 接口,從而這個類就有了多種類型。
3 )從第 2 點不難看出,Java 接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行爲,而且具有其他的次要行爲。
4 )結合 1、2 點中抽象類和Java 接口的各自優勢,具經典的設計模式就出來了:聲明類型的工作仍然由Java 接口承擔,但是同時給出一個Java 抽象類,且實現了這個接口,而其他同屬於這個抽象類型的具體類可以選擇實現這個 Java 接口,也可以選擇繼承這個抽象類,也就是說在層次結構中,Java 接口在最上面,然後緊跟着抽象類,哈,這下兩個的最大優點都能發揮到極至了。這個模式就是“缺省適配模式”。
在Java 語言 API 中用了這種模式,而且全都遵循一定的命名規範:Abstract +接口名。 Java 接口和Java抽象類的存在就是爲了用於具體類的實現和繼承的,如果你準備寫一個具體類去繼承另一個具體類的話,那你的設計就有很大問題了。Java 抽象類就是爲了繼承而存在的,它的抽象方法就是爲了強制子類必須去實現的。
方法、代碼塊
注1. 一個方法中定義的局部變量是不能被聲明爲靜態的。因爲靜態修飾符 static是一個與類而非類實例相關的概念,而方法是一個局部概念,它們附屬於類實例,其生命週期不同於類實例,更不同於類,而方法內部變量會隨着方法的推出而被撤銷,因此一個方法體中聲明的局部變量是不能被 static 修飾的。即使方法被聲明爲靜態的,其內部變量也不能被聲明爲靜態的。一個被 static 修飾符修飾的靜態方法,除了可以訪問中其內部定義的變量外,則只能訪問被static 修飾符修飾的靜態變量。如果需要訪問非靜態類的屬性,則必須先實例化一個類實例,再通過該類實例引用非靜態類的屬性。但是,一個非靜態的方法可以訪問一個靜態變量。
注2. 對靜態方法和非靜態方法的調用方式不同,對非靜態方法的調用時在運行期決定的,而對靜態方法的調用則發生在編譯期。一個非靜態方法可以調用一個靜態方法,但是不允許一個靜態方法直接調用非靜態方法,除非通過類實例調用。
注3. 一個靜態方法不能重寫爲一個非靜態方法,只能被重寫爲一個靜態方法,但是可以被重載爲一個非靜態的方法,重寫的含義是始終只有一個定義,只是原來的含義完全被後來的含義所取代,即形式不能變,而重載的含義是指同一個樣的東西在不同的地方具有不同的含義。
注4. 靜態代碼塊不是一個方法,實際上只是一個 static修飾符,後跟一個方法主體(一對大括號內的一組語句) 。靜態代碼塊主要用於初始化,該代碼塊中的代碼僅被執行一次,即在構造函數執行前執行,而且只執行一次,如果繼承的父類裏有靜態代碼塊,先執行父類的,但是子類的靜態代碼塊還是要先於父類的構造函數。如果一個類中存在多個靜態代碼塊,那麼其運行次序取決於在類中定義的次序。
注5. 非靜態代碼塊不是一個方法,實際上只是一個方法主體( 一對大括號內的一組語句)。每當創建類實例時,非靜態代碼塊獲得執行,其運行在父類構造器之後,所在類構造器之前。如果一個類中存在多個非靜態代碼塊,那麼其運行順序取決於在類中定義的次序。
&與&&的區別:&&還具有短路的功能,即如果第一個表達式爲false,則不再計算第二個表達式,例如,對於if(str!=null&&!str.equals(“”))表達式,當str爲null時,後面的表達式不會執行,所以不會出現NullPointerException如果將&&改爲&,則會拋出NullPointerException異常。If(x==33&++y>0)y會增長,If(x==33&&++y>0)不會增長
用最有效率的方法算出2乘以8等於幾?
2<<3,因爲將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2<<3。
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以改變的。
public class Test {
2 public static void main(String[] args) {
3 final StringBuffer a=new StringBuffer("Hello");
4 //a=new StringBuffer("hello");//編譯錯誤
5 a.append(",world");
6 System.out.println(a.toString());//Hello,world
7 }
8 }
Integer和int的區別
1)int是java提供的8中原始數據類型之一,java爲每個呀un是數據類型提供了封裝類,Integer是java爲int提供的封裝類(封裝類=數據+操作)。
2)int的默認值爲0,而Integer的默認值爲null,即Integer可以區分出爲賦值和值爲0的區別,int無法表達出爲賦值的情況。例如:想要表達出沒有參加考試和考試成績爲0的區別,只能使用Integer。在JSP中Integer的默認值爲null,所以用EL表達式在文本框中顯示時,值爲空表字符串,而int默認值爲0,所以用EL表達式在文本框中顯示時,結果爲0,所以,int不適合作爲WEB層的表單數據的類型。
訪問權限:public、private、protected和默認
當前類 同一package 子孫類 其他package
public Y Y Y Y
protected Y Y Y N
friendly Y Y N N
private Y N N N
注:friendly並不是java的關鍵字,只有當變量前面沒有寫明任何訪問權限修飾符時,就默認以friendly作爲訪問權限。
拷貝對象返回的是一個新對象,而不是一個引用。二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
面向對象編程語言有封裝、繼承、抽象、多態4個主要的特徵。
1)封裝:封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的“高內聚、低耦合”,防止程序相互依賴而帶來的變動影響。在面向對象的編程語言中,對象是封裝的基本單位。面向對象的封裝就是把描述一個對象的屬性和行爲的代碼封裝到一個“模塊”中,即一個類中。只要把變量和訪問這個變量的方法放在一起,將一個類中的成員變量全部定義爲私有的,只有這個類的方法可以訪問,這就基本上實現了對象的封裝。
2)抽象:抽象就是找出一些事物的相似和共性之處,然後將這些事物歸爲一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的哪些部分,將注意力集中在與當前目標有關的方面。
3)繼承:繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提高了軟件的重用性和可擴展性。
4)多態:多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行時才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在程序運行期間才能決定。因爲在程序運行時才能確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,、重載Overloading是一個類中多態性的一種表現。
控制反轉:傳統模式中是類和類之間直接調用,所以有很強的耦合度,程序之間的依賴關係比較強,後期維護時牽扯的比較多。
IOC,用配置文件(XML)來描述類與類之間的關係,由容器來管理,降低了程序間的耦合度,程序的修改可以通過簡單的配置文件修改來實現
aop(面向切面編程):可以 通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一 添加功能的一種技術。