java基礎題

1. finally什麼時候執行?html

答:
  1. 無論有木有出現異常,finally塊中代碼都會執行;
  2. 當try和catch中有return時,finally仍然會執行;
  3. finally是在return後面的表達式運算後執行的(此時並無返回運算後的值,而是先把要返回的值保存起來,無論finally中的代碼怎麼樣,返回的值都不會改變,仍然是以前保存的值),因此函數返回值是在finally執行前肯定的;
  4. finally中最好不要包含return,不然程序會提早退出,返回值不是try或catch中保存的返回值。
  5. 假設利用 return 語句從 try 語句塊中退出。在方法返回前,finally子句的內容將被執行。若是 finally 子句中也有一個 return 語句,這個返回值將會覆蓋原始的返回值。

1.try和catch語句 
●將要處理的代碼放入try塊中,而後建立相應的catch塊的列表。若是生成都異常與catch中提到的相匹配,那麼catch條件中的塊語句就被執行。try塊後可能有許多catch塊,每一個都處理不一樣的異常。每一個catch中的參數都是Exception的子類。 
2.finally語句 
●finally語句定義一個老是執行的代碼,而不考慮異常是否被捕獲。 
3.throw引發一個異常 java

‍●‍‍調用申明拋出異常
●‍throw語句強制拋出異常

 

2. java中有兩種傳遞方式。值傳遞和引用傳遞, 基本類型和以String str="aa"這種方式建立的字符串都是值傳遞,對象,數組等是引用傳遞。c++

 

 

3. java中子類的初始化程序員

  • 初始化過程: 
  • 1. 初始化父類中的靜態成員變量和靜態代碼塊 ; (  java虛擬機加載類時,就會執行該塊代碼,故只執行一次)
  • 2. 初始化子類中的靜態成員變量和靜態代碼塊 ; (  java虛擬機加載類時,就會執行該塊代碼,故只執行一次)
  • 3.初始化父類的普通成員變量和代碼塊,再執行父類的構造方法;(每次new,每次執行 )
  • 4.初始化子類的普通成員變量和代碼塊,再執行子類的構造方法; (每次new,每次執行 )

 

類從被加載到虛擬機內存中開始,到卸載出內存爲止,它的整個生命週期包括:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其中準備、驗證、解析3個部分統稱爲鏈接(Linking)。如圖所示。
這裏寫圖片描述 
加載、驗證、準備、初始化和卸載這5個階段的順序是肯定的,類的加載過程必須按照這種順序循序漸進地開始,而解析階段則不必定:它在某些狀況下能夠在初始化階段以後再開始,這是爲了支持Java語言的運行時綁定(也稱爲動態綁定或晚期綁定)。如下陳述的內容都已HotSpot爲基準。web

加載

在加載階段(能夠參考java.lang.ClassLoader的loadClass()方法),虛擬機須要完成如下3件事情:數據庫

  1. 經過一個類的全限定名來獲取定義此類的二進制字節流(並無指明要從一個Class文件中獲取,能夠從其餘渠道,譬如:網絡、動態生成、數據庫等);
  2. 將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構;
  3. 在內存中生成一個表明這個類的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口;

加載階段和鏈接階段(Linking)的部份內容(如一部分字節碼文件格式驗證動做)是交叉進行的,加載階段還沒有完成,鏈接階段可能已經開始,但這些夾在加載階段之中進行的動做,仍然屬於鏈接階段的內容,這兩個階段的開始時間仍然保持着固定的前後順序。設計模式

驗證

驗證是鏈接階段的第一步,這一階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機自身的安全。
驗證階段大體會完成4個階段的檢驗動做:數組

  1. 文件格式驗證:驗證字節流是否符合Class文件格式的規範;例如:是否以魔術0xCAFEBABE開頭、主次版本號是否在當前虛擬機的處理範圍以內、常量池中的常量是否有不被支持的類型。
  2. 元數據驗證:對字節碼描述的信息進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規範的要求;例如:這個類是否有父類,除了java.lang.Object以外。
  3. 字節碼驗證:經過數據流和控制流分析,肯定程序語義是合法的、符合邏輯的。
  4. 符號引用驗證:確保解析動做能正確執行。

驗證階段是很是重要的,但不是必須的,它對程序運行期沒有影響,若是所引用的類通過反覆驗證,那麼能夠考慮採用-Xverifynone參數來關閉大部分的類驗證措施,以縮短虛擬機類加載的時間。安全

準備

準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些變量所使用的內存都將在方法區中進行分配。這時候進行內存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將會在對象實例化時隨着對象一塊兒分配在堆中。其次,這裏所說的初始值「一般狀況」下是數據類型的零值,假設一個類變量的定義爲:服務器

1
publicstaticintvalue=123;

那變量value在準備階段事後的初始值爲0而不是123.由於這時候還沒有開始執行任何java方法,而把value賦值爲123的putstatic指令是程序被編譯後,存放於類構造器()方法之中,因此把value賦值爲123的動做將在初始化階段纔會執行。
至於「特殊狀況」是指:public static final int value=123,即當類字段的字段屬性是ConstantValue時,會在準備階段初始化爲指定的值,因此標註爲final以後,value的值在準備階段初始化爲123而非0.

解析

解析階段是虛擬機將常量池內的符號引用替換爲直接引用的過程。解析動做主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符7類符號引用進行。

初始化

類初始化階段是類加載過程的最後一步,到了初始化階段,才真正開始執行類中定義的java程序代碼。在準備極端,變量已經付過一次系統要求的初始值,而在初始化階段,則根據程序猿經過程序制定的主管計劃去初始化類變量和其餘資源,或者說:初始化階段是執行類構造器<clinit>()方法的過程.

<clinit>()方法是由編譯器自動收集類中的全部類變量的賦值動做和靜態語句塊static{}中的語句合併產生的,編譯器收集的順序是由語句在源文件中出現的順序所決定的,靜態語句塊只能訪問到定義在靜態語句塊以前的變量,定義在它以後的變量,在前面的靜態語句塊能夠賦值,可是不能訪問
原文連接  http://www.importnew.com/18548.html
 
 

4. equal和==的區別

答:

  • equal:是用來比較兩個對象內部的內容是否相等的。
  • ==:是用來判斷兩個對象的地址是否相同,便是否是指相同一個對象。
  • 沒有重寫equals時,是直接用==判斷的,而String中重寫了equals方法。

equals只是進行值判斷不對類是否是同一個引用不進行判斷,而==判斷包括值和類引用.經過String a = "1234"這種產生的字面字符串,若是內存中存在字符串「1234」則會直接引用,若是沒有則分配內存,所以a==b的結果爲true。而String c = new String("1234"),則會分配內存控件存儲字符串,不考慮以前是否存在。所以a==c的結果false.因爲a和c的值都是"1234"所以a.equals(c)的結果爲true.同時Integer中也是相似的原理,所以使用Integer a = 12;時會在某種狀況下提升程序的性能。

 

5. java中類型轉換:

兩個數值進行二元操做時,會有以下的轉換操做:
  • 若是兩個操做數其中有一個是double類型,另外一個操做就會轉換爲double類型。
  • 不然,若是其中一個操做數是float類型,另外一個將會轉換爲float類型。
  • 不然,若是其中一個操做數是long類型,另外一個會轉換爲long類型。
  • 不然,兩個操做數都轉換爲int類型。
  • 數值型變量在默認狀況下爲Int型,byte和short型在計算時會自動轉換爲int型計算,結果也是int 型。因此a1*a2的結果是int 型的。

 

6. 關於TLS(線程局部存儲)

概念:線程局部存儲(Thread Local Storage,TLS)用來將數據與一個正在執行的指定線程關聯起來。

進程中的全局變量與函數內定義的靜態(static)變量,是各個線程均可以訪問的共享變量。在一個線程修改的內存內容,對全部線程都生效。這是一個優勢也是一個缺點。說它是優勢,線程的數據交換變得很是快捷。說它是缺點,一個線程死掉了,其它線程也性命不保; 多個線程訪問共享數據,須要昂貴的同步開銷,也容易形成同步相關的BUG。

  若是須要在一個線程內部的各個函數調用都能訪問、但其它線程不能訪問的變量(被稱爲static memory local to a thread 線程局部靜態變量),就須要新的機制來實現。這就是TLS。

  線程局部存儲在不一樣的平臺有不一樣的實現,可移植性不太好。幸虧要實現線程局部存儲並不難,最簡單的辦法就是創建一個全局表,經過當前線程ID去查詢相應的數據,由於各個線程的ID不一樣,查到的數據天然也不一樣了。大多數平臺都提供了線程局部存儲的方法,無須要咱們本身去實現:

功能:它主要是爲了不多個線程同時訪存同一全局變量或者靜態變量時所致使的衝突,尤爲是多個線程同時須要修改這一變量時。爲了解決這個問題,咱們能夠經過TLS機制,爲每個使用該全局變量的線程都提供一個變量值的副本,每個線程都可以獨立地改變本身的副本,而不會和其它線程的副本衝突。從線程的角度看,就好像每個線程都徹底擁有該變量。而從全局變量的角度上來看,就好像一個全局變量被克隆成了多份副本,而每一份副本均可以被一個線程獨立地改變。

 

分類:動態TLS和靜態TLS。

 

用途:動態TLS和靜態TLS這兩項技術在建立DLL的時候更加有用,這是由於DLL一般並不知道它們被連接到的應用程序的結構是什麼樣的。

1.              若是應用程序高度依賴全局變量或靜態變量,那麼TLS能夠成爲咱們的救生符。於是最好在開發中最大限度地減小對此類變量的使用,更多的依賴於自動變量(棧上的變量)和經過函數參數傳入的數據,由於棧上的變量始終都是與某個特定的線程相關聯的。若是不使用此類變量,那麼就能夠避免使用TLS。

2.              可是在編寫應用程序時,咱們通常都知道本身要建立多少線程,本身會如何使用這些線程,而後咱們就能夠設計一些替代方案來爲每一個線程關聯數據,或者設計得好一點的話,可使用基於棧的方法(局部變量)來爲每一個線程關聯數據。

 

因此:關於TLS,說法正確的是(ABD)

A 解決多線程中的對同一變量的訪問衝突的一種技術
B TLS會爲每個線程維護一個和該線程綁定的變量的副本
C 每個線程都擁有本身的變量副本,從而也就沒有必要對該變量進行同步了
D Java平臺的java.lang.ThreadLocal是TLS技術的一種實現
對於C : 若是是靜態變量是共享的話,那必須同步,不然儘管有副本,仍是會出錯,故C錯

 

7. 

jar         將許多文件組合成一個jar文件
javac    編譯
javadoc 它從程序源代碼中抽取類、方法、成員等註釋造成一個和源代碼配套的API幫助文檔。
javah 把java代碼聲明的JNI方法轉化成C\C++頭文件。 JNI可參考java核心技術卷二第12章
 
8. java中關於子類繼承父類的構造方法一說是錯誤的:
在java中,子類構造器會默認調用super()(不管構造器中是否寫有super()),用於初始化父類成員,同時當父類中存在有參構造器時,必須提供無參構造器,子類構造器中並不會自動繼承有參構造器,仍然默認調用super(),使用無參構造器。所以,一個類想要被繼承必須提供無參構造器。
PS:方法沒有繼承一說,只有重載和重寫
 
9. 訪問說明符

若是一個類聲明爲protected,它的子類是能夠訪問它的,若是它和子類不在一個包中,子類仍然能夠訪問該類

 
10.  自動拆箱裝
(自動拆裝箱JDK需在1.5上)
一、基本型和基本型封裝型進行「==」運算符的比較,基本型封裝型將會自動拆箱變爲基本型後再進行比較,所以Integer(0)會自動拆箱爲int類型再進行比較,顯然返回true;
二、兩個Integer類型進行「==」比較,若是其值在-128至127,那麼返回true,不然返回false, 這跟Integer.valueOf()的緩衝對象有關,這裏不進行贅述。
三、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,若是類型相同,則繼續比較值,若是值也相同,返回true
四、基本型封裝類型調用equals(),可是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換爲其封裝類型,再進行3中的比較。
 
11. 容器集合類

 集合中線程安全的類有:vector,stack,hashtable,enumeration,除此以外均是非線程安全的類與接口

 
12. java中異常類:
 
  • 1.Exception(異常) :是程序自己能夠處理的異常。 
  • 2.Error(錯誤): 是程序沒法處理的錯誤。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,通常不須要程序處理。
  • 3.檢查異常(編譯器要求必須處置的異常) :  除了Error,RuntimeException及其子類之外,其餘的Exception類及其子類都屬於可查異常。這種異常的特色是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,不然編譯不會經過。
  • 4.非檢查異常(編譯器不要求處置的異常): 包括運行時異常(RuntimeException與其子類)和錯誤(Error)。

 

 

13. Servlet的生命週期能夠分爲初始化階段,運行階段和銷燬階段三個階段:

Servlet的生命週期通常能夠用三個方法來表示:

  1. init():僅執行一次,負責在裝載Servlet時初始化Servlet對象
  2. service() :核心方法,通常HttpServlet中會有get,post兩種處理方式。在調用doGet和doPost方法時會構造servletRequest和servletResponse請求和響應對象做爲參數。
  3. destory():在中止而且卸載Servlet時執行,負責釋放資源

初始化階段:Servlet啓動,會讀取配置文件中的信息,構造指定的Servlet對象,建立ServletConfig對象,將ServletConfig做爲參數來調用init()方法。

 

Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,通常狀況下,人們將Servlet理解爲後者。 Servlet運行於支持Java的應用服務器中。從原理上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。 這個過程爲: 1) 客戶端發送請求至服務器端; 2) 服務器將請求信息發送至 Servlet; 3) Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,一般取決於客戶端的請求; 4) 服務器將響應返回給客戶端。

 

14. 關鍵字

  • synchronized 關鍵字 : 用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這個段代碼。
  • volatile:用來確保將變量的跟新操做通知到其餘線程,當把變量聲明爲volatile類型後,編譯器與運行時都會注意到這個變量是共享的,所以不會將該變量上的操做與其餘內存操做一塊兒重排序。然而,在訪問volatile變量時不會執行加鎖操做,所以也就不會使執行線程阻塞,所以volatile變量是一種比 synchronized關鍵字更輕量級的同步機制。
  • serialize:Java 對象序列化爲二進制文件。
  • static關鍵字: static關鍵字能夠修飾變量,方法,靜態代碼塊。
    •  靜態變量:
      • 由static修飾的變量稱爲靜態變量
      • 靜態變量屬於類,而不屬於某個對象
      • 靜態變量它的副本只有一個(靜態變量在類中只加載一)
    • 靜態方法:
      • 在靜態方法中只能調用靜態變量和靜態方法
      • 在非靜態方法中,能夠調用靜態方法或者變量。
      • 在靜態方法中不能使用this和super關鍵字。
    • 靜態代碼塊
      • 做用:用來給靜態成員變量初始化

 

15. 關於C++中的虛類和Java接口

答:

  • c++虛類至關與java裏面的抽象類
  • c++中沒有接口的概念,與之對應的是純虛類,對應的是java的接口
  • 純虛函數和虛函數的區別在於前者不包含定義,然後者能夠包含函數體。
  • 一、一個子類只能繼承一個抽象類(虛類),但能實現多個接口; 二、一個抽象類能夠有構造方法,接口沒有構造方法; 三、一個抽象類中的方法不必定是抽象方法,即其中的方法能夠有實現(有方法體),接口中的方法都是抽象方法,不能有方法體,只有聲明; 四、一個抽象類能夠是public、private、protected、default, 接口只有public; 五、一個抽象類中的方法能夠是public、private、protected、default, 接口中的方法只能是public和default
  • 六、接口中全部的方法均爲抽象方法,即它和純虛類意思相同。
  • 七、含有虛函數(抽象方法)的類即爲抽象類;

  

16. 虛類和接口的區別

  • 抽象類能夠有構造方法,接口中不能有構造方法
  • 抽象類中能夠有普通成員變量,接口中沒有普通成員變量
  • 抽象類中能夠包含靜態方法,接口中不能包含靜態方法
  • 一個類能夠實現多個接口,但只能繼承一個抽象類。
  • 抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。  
  • 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。 
  • 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
  • 含有abstract修飾符的class即爲抽象類,abstract類不能建立的實例對象。含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。  
    接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。  
  • 接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約。而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用,  
    例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的全部Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼

    

17. 在運行時,由java解釋器自動引入,而不用import語句引入的包是:java.lang

答:

java.lang包是java語言的核心包,lang是language的縮寫
java.lang包定義了一些基本的類型,包括Integer,String之類的,是java程序必備的包,有解釋器自動引入,無需手動導入
 
18. 關於HashMap和HashTable
  • 源碼:
    • //HashMap的源碼
      public class HashMap<K,V>
          extends AbstractMap<K,V>
          implements Map<K,V>, Cloneable, Serializable
      -----------------------------------
      //Hashtable的源碼
      public class Hashtable<K,V>
          extends Dictionary<K,V>
          implements Map<K,V>, Cloneable, java.io.Serializable
  • 都實現了Map接口
  • HashMap的put方法沒有同步。HashMap非線程安全,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap就必須爲之提供額外同步。
  • public V put(K key, V value) //HashMap的put方法,沒有同步
     
    public synchronized V put(K key, V value) //Hashtable的put方法
    //固然,Hashtable的其餘方法,如get,size,remove等方法,
    //都加了synchronized關鍵詞同步操做 
  • HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
  • //Hashtable的put方法有如下語句塊,大夥看了都知道
    // Make sure the value is not null
    if (value == null) {
        throw new NullPointerException();
    }
     
    //那麼,咱們再來看下HashMap的put方法中,有以下語句
    //調用某個方法直接把key爲null,值爲value的鍵值對插入進去。
    if (key == null)
        return putForNullKey(value);

     

  • 經過contains方法能夠判斷一個對象是否存在於HashMap或者Hashtable中(錯)。 HashMap無contains方法
  • //如下是Hashtable的方法
    public synchronized boolean contains(Object value)
    public synchronized boolean containsKey(Object key)
    public boolean containsValue(Object value)
     
    //如下是HashMap中的方法,注意,沒有contains方法,因此,D錯誤
    public boolean containsKey(Object key)
    public boolean containsValue(Object value)

     

  • 由全部HashMap類的「collection 視圖方法」所返回的迭代器都是快速失敗的:在迭代器建立以後,若是從結構上對映射進行修改,除非經過迭代器自己的 remove 方法,其餘任什麼時候間任何方式的修改,迭代器都將拋出ConcurrentModificationException。Hashtable和HashMap的區別主要是前者是同步的,後者是快速失敗機制保證 

19. 關於java實例變量,局部變量,類變量和final變量

  • 定義在類中的變量是類的成員變量,能夠不進行初始化,Java會自動進行初始化,若是是引用類型默認初始化爲null,若是是基本類型例如int則會默認初始化爲0
  • 局部變量是定義在方法中的變量,必需要進行初始化,不然不一樣經過編譯。局部變量運行時被分配在棧中,量大,生命週期短,若是虛擬機給每一個局部變量都初始化一下,是一筆很大的開銷,但變量不初始化爲默認值就使用是不安全的。出於速度和安全性兩個方面的綜合考慮,解決方案就是虛擬機不初始化,但要求編寫者必定要在使用前給變量賦值。
  • 被static關鍵字修飾的變量是靜態的,靜態變量隨着類的加載而加載,因此也被稱爲類變量
  • 被final修飾的變量是常量

20. 關於java threadlocal

  • ThreadLocal存放的值是線程封閉,線程間互斥的,主要用於線程內共享一些數據,避免經過參數來傳遞
  • 線程的角度看,每一個線程都保持一個對其線程局部變量副本的隱式引用,只要線程是活動的而且 ThreadLocal 實例是可訪問的;在線程消失以後,其線程局部實例的全部副本都會被垃圾回收
  • 在Thread類中有一個Map,用於存儲每個線程的變量的副本。
  • 對於多線程資源共享的問題,同步機制採用了「以時間換空間」的方式,而ThreadLocal採用了「以空間換時間」的方式
  • ThreadLocal類用於建立一個線程本地變量
    在Thread中有一個成員變量ThreadLocals,該變量的類型是ThreadLocalMap,也就是一個Map,它的鍵是threadLocal,值爲就是變量的副本。經過ThreadLocal的get()方法能夠獲取該線程變量的本地副本,在get方法以前要先set,不然就要重寫initialValue()方法。
    ThreadLocal的使用場景:
            數據庫鏈接:在多線程中,若是使用懶漢式的單例模式建立Connection對象,因爲該對象是共享的,那麼必需要使用同步方法保證線程安全,這樣當一個線程在鏈接數據庫時,那麼另一個線程只能等待。這樣就形成性能下降。若是改成哪裏要鏈接數據庫就來進行鏈接,那麼就會頻繁的對數據庫進行鏈接,性能仍是不高。這時使用ThreadLocal就能夠既能夠保證線程安全又可讓性能不會過低。可是ThreadLocal的缺點時佔用了較多的空間。

 

21. 有關JVM內存

  • 運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器
  • 虛擬機棧區 :也就是咱們常說的棧區,線程私有,存放基本類型,對象的引用和 returnAddress ,在編譯期間完成分配。
  • 堆區 , JAVA 堆,也稱 GC 堆,全部線程共享,存放對象的實例和數組, JAVA 堆是垃圾收集器管理的主要區域。
  • 方法區 :全部線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。
  • 程序計數器 :線程私有,每一個線程都有本身獨立的程序計數器,用來指示下一條指令的地址。

 

22. 建立線程對象兩種方式:

建立線程對象兩種方式:
  • 1.繼承Thread類,重載run方法;
  • 2.實現Runnable接口,實現run方法 

 

23. 方法的重寫(override)兩同兩小一大原則:

  • 方法名相同,參數類型相同
  • 子類返回類型小於等於父類方法返回類型,
  • 子類拋出異常小於等於父類方法拋出異常,
  • 子類訪問權限大於等於父類方法訪問權限。

 

24. J2EE中經常使用名詞解釋

1.web容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接和容器中的環境變量接接口互,沒必要關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEB服務器就叫作J2EE中的WEB容器。

2.Web container:實現J2EE體系結構中Web組件協議的容器。這個協議規定了一個Web組件運行時的環境,包括安全,一致性,生命週期管理,事務,配置和其它的服務。一個提供和JSP和J2EE平臺APIs界面相同服務的容器。一個Web container 由Web服務器或者J2EE服務器提供。

3.EJB容器:Enterprise java bean 容器。更具備行業領域特點。他提供給運行在其中的組件EJB各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。一個實現了J2EE體系結構中EJB組件規範的容器。 這個規範指定了一個Enterprise bean的運行時環境,包括安全,一致性,生命週期,事務, 配置,和其餘的服務。

4.JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下本身的索引,從而知足快速查找和定位分佈式應用程序的功能。

5.JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通信。包括點對點和廣播。

6.JTA:(Java Transaction API)JAVA事務服務。提供各類分佈式事務服務。應用程序只需調用其提供的接口便可。

7.JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者經過各類部署和自定義實現本身的個性安全控制策略。

8.RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於經過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,咱們能夠在本地計算機上實現對其直接調用。固然這是要經過必定的規範才能在異構的系統之間進行通訊。RMI是JAVA特有的。RMI-IIOP出現之前,只有RMI和CORBA兩種選擇來進行分佈式程序設計。RMI-IIOP綜合了RMI和CORBA的優勢,克服了他們的缺點,使得程序員能更方便的編寫分佈式程序設計,實現分佈式計算。首先,RMI-IIOP綜合了RMI的簡單性和CORBA的多語言性(兼容性),其次RMI-IIOP克服了RMI只能用於Java的缺點和CORBA的複雜性(能夠不用掌握IDL)。

 

25. final,finally和finalize:

final

  • 修飾符(關鍵字)
  • 若是一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承。所以一個類不能既被聲明爲 abstract的,又被聲明爲final的。
  • 將變量或方法聲明爲final,能夠保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改。
  • final修飾的方法不能被覆蓋
    final修飾的字段爲常量
    final修飾的類不能被繼承

finally

  • 異常處理時提供 finally 塊來執行任何清除操做。若是拋出一個異常,那麼相匹配的 catch 子句就會執行,而後控制就會進入 finally 塊(若是有的話)。通常異常處理塊須要。
finalize
  • 方法名。Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,所以全部的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其餘清理工做。finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。 
  • Java中全部類都從Object類中繼承finalize()方法。
  • 當垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法。

 

26. JSP內置對象和屬性列舉以下:

1.request對象
     客戶端的請求信息被封裝在request對象中,經過它才能瞭解到客戶的需求,而後作出響應。它是HttpServletRequest類的實例。
2.response對象
     response對象包含了響應客戶請求的有關信息,但在JSP中不多直接用到它。它是HttpServletResponse類的實例。
3.session對象
     session對象指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開鏈接爲止。它是HttpSession類的實例.
4.out對象
     out對象是JspWriter類的實例,是向客戶端輸出內容經常使用的對象
5.page對象
     page對象就是指向當前JSP頁面自己,有點象類中的this指針,它是java.lang.Object類的實例
6.application對象
     application對象實現了用戶間數據的共享,可存放全局變量。它開始於服務器的啓動,直到服務器的關閉,在此期間,此對象將一直存在;這樣在用戶的先後鏈接或不一樣用戶之間的鏈接中,能夠對此對象的同一屬性進行操做;在任何地方對此對象屬性的操做,都將影響到其餘用戶對此的訪問。服務器的啓動和關閉決定了application對象的生命。它是ServletContext類的實例。
7.exception對象
   exception對象是一個例外對象,當一個頁面在運行過程當中發生了例外,就產生這個對象。若是一個JSP頁面要應用此對象,就必須把isErrorPage設爲true,不然沒法編譯。他其實是java.lang.Throwable的對象
8.pageContext對象
pageContext對象提供了對JSP頁面內全部的對象及名字空間的訪問,也就是說他能夠訪問到本頁所在的SESSION,也能夠取本頁面所在的application的某一屬性值,他至關於頁面中全部功能的集大成者,它的本 類名也叫pageContext。
9.config對象
config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(經過屬性名和屬性值構成)以及服務器的有關信息(經過傳遞一個ServletContext對象)

 

27. 關於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關鍵字。

28. 內部類聲明

public class Enclosingone {
    //非靜態內部類
    public class InsideOne {}
    //靜態內部類
    public static class InsideTwo{}
}
 
class Mytest02{
    public static void main(String args []){
        Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非靜態內部類對象
        Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//靜態內部類對象
    }
}

 

 

29. 接口 默認修飾符

接口中的變量默認是public static final 的,方法默認是public abstract 的

 

 

30. 

相關文章
相關標籤/搜索