java基礎篇:html
1.一、Java基礎前端
(1)面向對象的特性:繼承、封裝和多態java
如下都是查閱大神的博客後,摘錄的內容:來源http://www.cnblogs.com/chenssy
1.繼承
繼承是使用已存在的類的定義做爲基礎創建新類的技術,新類的定義能夠增長新的數據或新的功能,也能夠用父類的功能,
但不能選擇性地繼承父類。經過使用繼承咱們可以很是方便地複用之前的代碼,可以大大的提升開發
繼承定義了類如何相互關聯,共享特性。對於若干個相同或者相識的類,咱們能夠抽象出他們共有的行爲或者屬相併將其定
義成一個父類或者超類,而後用這些類繼承該父類,他們不只能夠擁有父類的屬性、方法還能夠定義本身獨有的屬性或者方法。
同時在使用繼承時須要記住三句話:
一、子類擁有父類非private的屬性和方法。
二、子類能夠擁有本身屬性和方法,即子類能夠對父類進行擴展。
三、子類能夠用本身的方式實現父類的方法。程序員
此外 咱們須要明確,繼承存在以下缺陷:
一、父類變,子類就必須變。
二、繼承破壞了封裝,對於父類而言,它的實現細節對與子類來講都是透明的。
三、繼承是一種強耦合關係。web
2.封裝spring
封裝從字面上來理解就是包裝的意思,專業點就是信息隱藏,是指利用抽象數據類型將數據和基於數據的操做封裝在一塊兒,使
其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內部,儘量地隱藏內部的細節,只保留一些對外接口使之與外
部發生聯繫。系統的其餘對象只能經過包裹在數據外面的已經受權的操做來與這個封裝的對象進行交流和交互。也就是說用戶是
無需知道對象內部的細節(固然也無從知道),但能夠經過該對象對外的提供的接口來訪問該對象。
對於封裝而言,一個對象它所封裝的是本身的屬性和方法,因此它是不須要依賴其餘對象就能夠完成本身的操做。
使用封裝有三大好處:
一、良好的封裝可以減小耦合。
二、類內部的結構能夠自由修改。
三、能夠對成員進行更精確的控制。
四、隱藏信息,實現細節。編程
3.多態
多態就是指程序中定義的引用變量所指向的具體類型和經過該引用變量發出的方法調用在編程時並不肯定,而是在程序運
行期間才肯定,即一個引用變量倒底會指向哪一個類的實例對象,該引用變量發出的方法調用究竟是哪一個類中實現的方法,必須在
由程序運行期間才能決定。由於在程序運行時才肯定具體的類,這樣,不用修改源程序代碼,就可讓引用變量綁定到各類不一樣
的類實現上,從而致使該引用調用的具體方法隨之改變,即不修改程序代碼就能夠改變程序運行時所綁定的具體代碼,讓程序可
以選擇多個運行狀態,這就是多態性。設計模式
(2)final、finally、finalize 的區別數組
final:修飾符(關鍵字)若是一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承。
所以一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,能夠保
證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改。
被聲明爲final的方法也一樣只能使用,不能重載。
finally:再異常處理時提供 finally 塊來執行任何清除操做。若是拋出一個異常,那麼相匹配的 catch
子句就會執行,而後控制就會進入 finally 塊(若是有的話)。
finalize:方法名。Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要
的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object
類中定義的,所以全部的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其餘清理
工做。finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。
(3)Exception、Error、運行時異常與通常異常有何異同瀏覽器
資料來源:http://blog.sina.com.cn/s/blog_6aefe425010187xq.html
Throwable是全部Java程序中錯誤處理的父類,有兩種資類:Error和Exception。
Error:表示由JVM所偵測到的沒法預期的錯誤,因爲這是屬於JVM層次的嚴重錯誤,致使JVM沒法繼續執行,所以,這是不可捕捉到的,沒法採起任何恢復的操做,頂多只能顯示錯誤信息。Error類體系描述了Java運行系統中的內部錯誤以及資源耗盡的情形.應用程序不該該拋出這種類型的對象(通常是由虛擬機拋出).假如出現這種錯誤,除了盡力使程序安全退出外,在其餘方面是無能爲力的.
Exception:表示可恢復的例外,這是可捕捉到的。
Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是咱們常常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求咱們必需對出現的這些異常進行catch。因此,面對這種異常無論咱們是否願意,只能本身去寫一大堆catch塊去處理可能的異常。這類異常通常是外部錯誤,例如試圖從文件尾後讀取數據等,這並非程序自己的錯誤,而是在應用環境中出現的外部錯誤.
可是另一種異常:runtime exception,也稱運行時異常,咱們能夠不處理。當出現這樣的異常時,老是由虛擬機接管。好比:咱們歷來沒有人去處理過NullPointerException異常,它就是運行時異常,而且這種異常仍是最多見的異常之一。RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等.處理RuntimeException的原則是:假如出現RuntimeException,那麼必定是程序員的錯誤.例如,能夠經過檢查數組下標和數組邊界來避免數組越界訪問異常.
出現運行時異常後,系統會把異常一直往上層拋,一直遇處處理代碼。若是沒有處理塊,到最上層,若是是多線程就由Thread.run()拋出,若是是單線程就被main()拋出。拋出以後,若是是線程,這個線程也就退出了。若是是主程序拋出的異常,那麼這整個程序也就退出了。運行時異常是Exception的子類,也有通常異常的特色,是能夠被Catch塊處理的。只不過每每咱們不對他處理罷了。也就是說,你若是不對運行時異常進行處理,那麼出現運行時異常以後,要麼是線程停止,要麼是主程序終止。
若是不想終止,則必須撲捉全部的運行時異常,決不讓這個處理線程退出。隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,而後記錄日誌。不該該因爲異常數據而影響下面對正常數據的處理。在這個場景這樣處理多是一個比較好的應用,但並不表明在全部的場景你都應該如此。若是在其它場景,遇到了一些錯誤,若是退出程序比較好,這時你就能夠不太理會運行時異常,或者是經過對異常的處理顯式的控制程序退出。異常處理的目標之一就是爲了把程序從異常中恢復出來。
(4)請寫出5種經常使用的runtime exception
(5)int 和 Integer 有什麼區別、Integer的值緩存範圍
轉載連接:http://blog.csdn.net/chenliguan/article/details/53888018
(1)Integer是int的包裝類;int是基本數據類型;
(2)Integer變量必須實例化後才能使用;int變量不須要;
(3)Integer實際是對象的引用,指向此new的Integer對象;int是直接存儲數據值 ;
(4)Integer的默認值是null;int的默認值是0。
(1)因爲Integer變量其實是對一個Integer對象的引用,因此兩個經過new生成的Integer變量永遠是不相等的(由於new生成的是兩個對象,其內存地址不一樣)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
(2)Integer變量和int變量比較時,只要兩個變量的值是向等的,則結果爲true
(由於包裝類Integer和基本數據類型int比較時,java會自動拆包裝爲int,而後進行比較,實際上就變爲兩個int變量的比較)
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
(3)非new生成的Integer變量和new Integer()生成的變量比較時,結果爲false。
(由於非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中新建的對象,二者在內存中的地址不一樣)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
(4)對於兩個非new生成的Integer對象,進行比較時,若是兩個變量的值在區間-128到127之間,
則比較結果爲true,若是兩個變量的值不在此區間,則比較結果爲false
Integer i = 100;
Integer j = 100;
System.out.print(i == j);
//true Integer i = 128; Integer j = 128; System.out.print(i == j); //false
對於第4條的緣由: java在編譯Integer i = 100 ;時,會翻譯成爲Integer i = Integer.valueOf(100)。
而java API中對Integer類型的valueOf的定義以下,對於-128到127之間的數,會進行緩存,
Integer i = 127時,會將127進行緩存,下次再寫Integer j = 127時,
就會直接從緩存中取,就不會new了。
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}
(6)包裝類、裝箱、拆箱
包裝類:原始類型對應的類
原始數據類型,分爲boolean,byte,in,char,long,short,double,float
引用數據類型,分爲數組,類,接口
裝箱:是指基本類型變爲相應包裝類的過程,如Integer a=Integer.valueOf(100);
或者int a=100;Integer b=new Integer(a);
這裏的Integer.valueOf(100)和new Integer(a)就是裝箱,
由基本數據類型構造出一個包裝類的對象。
拆箱:就是裝箱的逆過程。如Integer a=new Integer(100);
int b=a.intValue();
這裏的a.intValue()就是拆箱的過程,
由一個包裝類對象轉換到相應的基本數據類型。
包裝類的自動裝箱和拆箱規則以下:
(7)String、StringBuilder、StringBuffer
String:字符串常量
StringBuffer :字符串變量(線程安全)
StringBuilder:字符串變量(非線程安全)
性能上:StringBuilder > StringBuffer > String
String是不可變對象,每次對String類型進行改變的時候都等同於生成一個新的String的對象,而後將指針指向新的String對象,
因此性能最差,對於常常改變內容的字符串不用String。
StringBuffer 是字符串變量,對它操做時,並不會生成新的對象,而是直接對該對象進行修改,因此性能好。
StringBuilder和StringBuffer 同樣,是字符串變量,可是他不能帶有synchronized 關鍵字,不保證線程安全,因此性能最好,
在單線程的狀況下,建議使用StringBuilder。
(8)重載和重寫的區別
override(重寫):
Java 中的覆蓋@Override註解 寫與不寫的一點點理解
通常來講,寫與不寫沒什麼區別,JVM能夠自識別
寫的狀況下:即說明子類要覆蓋基類的方法,基類必須存在方法
(控制類型public,protected,返回值,參數列表類型)與子類方法完成一致的方法,不然會報錯(找不到被Override的方法)。
在不寫@Override註解的狀況下,當基類存在與子類各類條件都符合的方法是即實現覆蓋;
若是條件不符合時,則是當成新定義的方法使用。
因此若是想覆蓋基類方法時,最好仍是寫上@Override註解,這樣有利於編譯器幫助檢查錯誤
(9)抽象類和接口的區別
1.抽象類和接口都不能直接實例化,若是實例化,抽象類變量必須指向實現全部抽象方法的子類對象,
接口變量必須指向實現全部接口方法的類對象
2.抽象類要被子類繼承使用,接口要被類實現
3.接口只能作方法聲明,抽象類中能夠作方法聲明,也能夠作方法實現
4.接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量能夠是普通變量
5.抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。
一樣,一個類實現接口時候,若是不能所有實現接口,那麼該類也只能是抽象類。
6.抽象方法只能申明,不能實現。例如: abstract void tes(); 而不是 abstract void tes(){ }
7.抽象類能夠沒有抽象方法
(10)說說反射的用途和實現
Java反射機制主要提供瞭如下功能:在運行時構造一個類的對象;判斷一個類所具備的成員變量和方法;調用一個對象的方法;生成動態代理。反射最大的應用就是框架
Java.lang.Class和Java.lang.reflect包下的API,用於表示或者處理當前JVM中的類,接口和對象。
Java反射的主要功能:
肯定一個對象的類
取出類的modifiers,數據成員,方法,構造器,和超類.
找出某個接口裏定義的常量和方法說明.
建立一個類實例,這個實例在運行時刻纔有名字(運行時間才生成的對象).
取得和設定對象數據成員的值,若是數據成員名是運行時刻肯定的也能作到.
在運行時刻調用動態對象的方法.
建立數組,數組大小和類型在運行時刻才肯定,也能更改數組成員的值.
Class類是Java反射的基礎,Class類表示正在運行的java應用程序中的類和接口。Class只有私有的構造函數。Class類在加載類時由Java虛擬機以及調用類加載器中的 defineClass方法自動建立的。只在內存中存在一份加載類的Class類。
反射的應用不少,不少框架都有用到
spring 的 ioc/di 也是反射
javaBean和jsp之間調用也是反射
struts的 FormBean 和頁面之間...也是經過反射調用
JDBC 的 classForName()也是反射
hibernate的 find(Class clazz) 也是反射
獲取一個對象對應的反射類,在Java中有三種方法能夠獲取一個對象的反射類,
(11)說說自定義註解的場景及實現
跟蹤代碼的依賴性,實現代替配置文件的功能。比較常見的是Spring等框架中的基於註解配置。
還能夠生成文檔常見的@See@param@return等。如@override放在方法簽名,若是這個方法 並非覆蓋了超類方法,則編譯時就能檢查出。
使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節,在定義註解時,不能繼承其餘註解或接口。
(12)HTTP請求的GET和POST方式的區別
在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。
GET方法
請注意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的:
/test/demo_form.asp?name1=value1&name2=value2
POST方法
請注意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:
POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2
比較 GET 與 POST
方法 | GET | POST | |
---|---|---|---|
緩存 | 能被緩存 | 不能緩存 | |
編碼類型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。 | |
對數據長度的限制 | 是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符) | 無限制。 | |
對數據類型的限制 | 只容許 ASCII 字符 | 沒有限制。也容許二進制數據。 | |
安全性 | 與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。在發送密碼或其餘敏感信息時毫不要使用 GET | POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。 | |
可見性 | 數據在 URL 中對全部人都是可見的。 | 數據不會顯示在 URL 中。 |
其餘 HTTP 請求方法
(13)Session與Cookice區別
(14)SpringMVC的工做流程
(1)用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;DispatcherServlet
對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain
對象的形式返回;
(2)DispatcherServlet
根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
(3)提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:
HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
(4)Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
(5)根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
(6)ViewResolver 結合Model和View,來渲染視圖
(7)將渲染結果返回給客戶端。
(15)MVC設計思想
MVC是Model-View-Controller,模型-視圖-控制器,是一種設計模式。
視圖:視圖是用戶看到並與之交互的界面,視圖向用戶顯示相關的數據,並接受用戶的輸入,視圖不進行任何的業務邏輯處理。
模型:模型表示業務數據和業務處理,至關於JavaBean。一個模型能爲多個視圖提供數據,提升應用程序的重用性。
控制器:當用戶單擊Web頁面中的提交按鈕時,控制器接收請求並調用相應的模型處理,並返回數據給控制器。控制器調用相應
的視圖來顯示處理的結果,並經過視圖呈現給用戶。
(16)equals與==的區別
「==」 :比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,便是否是指相同一個對象。比較的是真正意義上的指針操做。
equals :用來比較的是兩個對象的內容是否相等,因爲全部的類都是繼承自java.lang.Object類的,因此適用於全部對象,若是沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的倒是==的判斷。
(17)hashCode與equals方法的區別與聯繫
HashMap中,必須覆蓋equals和hashCode,否則是不能put的
一、equals方法用於比較對象的內容是否相等(覆蓋之後)
二、hashcode方法只有在集合中用到
三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。
(18)什麼是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable接口的做用
首先要明確序列化的目的:
1.不管何種類型的數據,都是以二進制的形式在網絡上傳送,爲了由一個進程把Java對象發送給另外一個進程,須要把其轉換爲字節序列才能在網絡上傳送,把JAVA對象轉換爲字節序列的過程就稱爲對象的序列化,將字節序列恢復成Java對象的過程稱爲對象的反序列化,(而後java.io.ObjectOutPutStream的writeObject(Object obj)的方法就能夠 將參數指定的對象進行序列化 而且把獲得的字節流寫到一個目標輸出流上去)
2.只有實現了 serializable和Externalizable接口的類的對象才能被序列化 後者是前者的子類 實現這個藉口的類徹底由自身來控制序列化的行爲,而僅僅實現前者的類能夠採用默認的序列化方式。實現這兩個接口 標誌着對象能夠被序列化了。。。
(19)Object類中經常使用的方法,爲何wait notify會放在 Object 裏面?
Java的每一個對象中都有一個鎖(monitor,也能夠成爲監視器)而且wait(),notify()等方法用於等待對象的鎖或者通知其餘線程對象的監視器可用。
在Java的線程中並無可供任何對象使用的鎖和同步器。這就是爲何這些方法是Object類的一部分,這樣Java的每個類都有用於線程間通訊的基本方法。
(20)Java的平臺無關性如何體現出來的?
Java提供了JDK,供開發人員進行java開發,開發出的Java文件自己並不具有平臺無關的特性。Java文件編譯後,生成的class二進制文件。SUN提供了各個平臺下的JRE:Windows下的,Linux下的,UNIX下的。編譯後的class文件,就在各個平臺下的jre上運行了。簡單的說,就是由於jre的存在。
(21)JDK和JRE的區別
JDK是Java的開發工具包,主要包含了各類類庫和工具,固然也包含了另一個JRE,那麼爲何要包含另一個JRE呢?並且<JDK安裝目錄>/JRE/bin目錄下,包含有server一個文件夾~包含一個jvm.dll,這說明JDK提供了一個虛擬機。另外,JDK的bin目錄下有各類Java程序須要用到的命令,與JRE的bin目錄最明顯的區別就是JDK文件下才有javac,這一點很好理解,由於JRE只是一個運行環境而已,與開發無關。正由於如此,具有開發功能的JDK所包含的JRE下才會同時有server的JVM,而僅僅做爲運行環境的JRE下,只須要server的jvm.dll就夠了。
JRE是Java Runtime Environment的縮寫,是Java程序的運行環境。既然是運行,固然要包含JVM,也就是所謂的Java虛擬機,還有因此的Java類庫的class文件,都在lib目錄下,而且都打包成了jar。
JDK是Java的開發工具,它不只提供了Java程序運行所需的JRE,還提供了一系列的編譯,運行等工具,如javac,java,javaw等。
JRE只是Java程序的運行環境,它最核心的內容就是JVM(Java虛擬機)及核心類庫。
(22)wait和sleep 的 區別
1.sleep()方法是屬於Thread類中的,而wait()方法 ,則是屬於Object類中的。 2.sleep()方法致使了程序暫停執行指定時間,讓出CPU給其餘線程,可是他的 監控狀態依然保持着,當指定的時間到了又會自動恢復運行狀態。因此在調用 sleep()方法的過程當中,線程不會釋放對象鎖。 3.調用wait()方法是,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有 針對此對象調用notify()方法後,本線程才進入對象鎖定池準備獲取對象鎖進行 運行狀態。