第一篇:java知識(shí)點(diǎn)總結(jié)(定稿)
目錄
目錄................................................................................................................................................1 基礎(chǔ)篇............................................................................................................................................4
一、JDK常用的包................................................................................................................4
二、Get和Post的區(qū)別.......................................................................................................4
三、Java多態(tài)的具體體現(xiàn)...................................................................................................4
四、StringBuffer StringBuilder String 區(qū)別.......................................................................5
五、Hashtable與HashMap的區(qū)別....................................................................................5六、九大隱式對(duì)象...............................................................................................................5
七、Forword(請(qǐng)求轉(zhuǎn)發(fā))與Redirect(重定向).....................................................................6
八、JQurey總結(jié)....................................................................................................................6
九、XML和Json的特點(diǎn)....................................................................................................6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)7
十一、Page和PageContext的區(qū)別....................................................................................7
十二、Ajax總結(jié)..................................................................................................................7
十三、JSP9大隱視對(duì)象中四個(gè)作用域的大小與作用范圍................................................7
十四、List,Set,Collection,Collections..................................................................................8
十五、java的基本數(shù)據(jù)類型...............................................................................................8
十六、冒泡排序...................................................................................................................8 十七、二分查找法.................................................................................................................9
十八、時(shí)間類型轉(zhuǎn)換.............................................................................................................9
十九、階乘.......................................................................................................................10
二十、UE和UI的區(qū)別....................................................................................................10 二
十一、osi七層模型.......................................................................................................10 二
十二、線程和進(jìn)程的區(qū)別.............................................................................................11 二
十三、jvm的內(nèi)存結(jié)構(gòu).................................................................................................11 二
十四、內(nèi)存泄露和內(nèi)存溢出.........................................................................................11 二
十五、單例.....................................................................................................................11 二
十六、解析xml文件的幾種技術(shù).................................................................................13 二
十七、項(xiàng)目的生命周期.................................................................................................14
1
二十八、OSCache的判斷.................................................................................................14 二
十九、經(jīng)常訪問的技術(shù)網(wǎng)站.........................................................................................15 三
十、項(xiàng)目團(tuán)隊(duì)中交流的工具.........................................................................................15 三
十一、平時(shí)瀏覽的書籍.................................................................................................15 三
十二、java Exception體系結(jié)構(gòu)....................................................................................15 三
十三、session和cookie的區(qū)別....................................................................................16 三
十四、字節(jié)流與字符流的區(qū)別.....................................................................................16 三
十五、final,finally,finalize 三者區(qū)別...........................................................................17 三
十六、Io流的層次結(jié)構(gòu)................................................................................................17 三
十七、JAVA:..................................................................................................................18 三
十八、JavaSE JavaEE JavaME區(qū)別........................................................................18 三
十九、JDK JRE JVM的區(qū)別:.............................................................................19 四
十、報(bào)錯(cuò)的狀態(tài)碼:.....................................................................................................20 四
十一、協(xié)議以及默認(rèn)的端口號(hào).....................................................................................20 四
十二、抽象類與接口的區(qū)別.........................................................................................20 四
十三、修飾符的作用.....................................................................................................20 框架篇........................................................................................................................................21
一、Struts1的運(yùn)行原理..................................................................................................23
二、Struts2的運(yùn)行原理..................................................................................................23
三、struts2的體系結(jié)構(gòu)...................................................................................................23
四、Spring MVC運(yùn)行原理.............................................................................................24
五、Struts1.x與Struts2.x的區(qū)別...................................................................................25
六、Spring MVC、struts1和struts2區(qū)別......................................................................25
七、Struts2中result中的type類型...............................................................................25
八、Struts2標(biāo)簽..............................................................................................................26
九、SSI整合....................................................................................................................26
十、SSH整合..................................................................................................................26
十、Spring MVC整合.....................................................................................................27
十一、Hibernate 中g(shù)et 和 load的區(qū)別.........................................................................28
十二、Hibernate、Ibatis、Jdbc三者的區(qū)別..................................................................28
十三、Hibernate的運(yùn)行原理..........................................................................................28
十四、Hibernate五大核心(類/接口)簡(jiǎn)述.................................................................28
十五、Hibernate與JDBC的區(qū)別..................................................................................29
十六、Hibernate中的兩大配置文件................................................................................29
十七、Hibernate事務(wù)處理..............................................................................................29
十八、Hibernate的三種狀態(tài)以及狀態(tài)的轉(zhuǎn)換..............................................................29
十九、分頁(yè)步驟...............................................................................................................30
二十、hibernate緩存概述.................................................................................................30 二
十一、Ssh的概述:.....................................................................................................30 二
十二、防止表單重復(fù)提交.............................................................................................31 二
十三、JSP標(biāo)簽:........................................................................................................31 二
十四、過濾器.................................................................................................................32 二
十五、攔截器的理解.....................................................................................................32 二
十六、Spring融入框架................................................................................................33
2
數(shù)據(jù)庫(kù)篇.....................................................................................................................................33
一、JDBC連接數(shù)據(jù)庫(kù)步驟(以MYSQL為例).............................................................33
二、數(shù)據(jù)庫(kù)連接池...........................................................................................................34
三、mysql的數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出........................................................................................35
四、jdbc分段批量提交的時(shí)候出現(xiàn)異常怎么處理?.....................................................35
五、jdbc批量處理數(shù)據(jù)...................................................................................................35
六、Oracle分頁(yè)...............................................................................................................36
七、Oracle的基本數(shù)據(jù)類型...........................................................................................36
八、id、rowid、rownum的區(qū)別....................................................................................37
九、主鍵和唯一索引的區(qū)別?.......................................................................................37
十、Preparedstatement和statement的區(qū)別...................................................................37
十一、數(shù)據(jù)庫(kù)三范式.......................................................................................................38
十二、視圖概述...............................................................................................................38
十三、存儲(chǔ)過程概述.......................................................................................................38
十四、索引概述...............................................................................................................39
十五、必背的sql語(yǔ)句....................................................................................................41 業(yè)務(wù)場(chǎng)景篇.................................................................................................................................44
一、Spring的概述...........................................................................................................44
二、事務(wù)概述...................................................................................................................45
三、權(quán)限概述...................................................................................................................46
四、OSCache業(yè)務(wù)場(chǎng)景...................................................................................................46
五、線程概述...................................................................................................................47
六、Ajax請(qǐng)求Session超時(shí)問題....................................................................................47 七:java線程池概述.........................................................................................................48
八、OSCache概述...........................................................................................................49
九、OSCache+autocomplete+單例業(yè)務(wù)場(chǎng)景..................................................................49
十、緩存概述...................................................................................................................50
十一、實(shí)現(xiàn)頁(yè)面靜態(tài)化業(yè)務(wù)場(chǎng)景...................................................................................50
十二、servlet線程安全描述...........................................................................................51
十三、(jbpm4)工作流引擎描述:.....................................................................................51
十四、JPBM業(yè)務(wù)場(chǎng)景....................................................................................................52
十五、Ant描述................................................................................................................52
十六、FreeMarker描述...................................................................................................53
十七、webService描述...................................................................................................53
十八、oracle索引概述....................................................................................................55
十九、oracle存儲(chǔ)過程....................................................................................................56
二十、Junit 業(yè)務(wù)場(chǎng)景.......................................................................................................56 二
十一、Apache+Tomcat 實(shí)現(xiàn)負(fù)載均衡及seesion復(fù)制...............................................56 二
十二、Ant業(yè)務(wù)場(chǎng)景......................................................................................................57 二
十三、maven業(yè)務(wù)場(chǎng)景.................................................................................................57 二
十四、Servlet的概述:................................................................................................58 優(yōu)化篇........................................................................................................................................64
一、代碼優(yōu)化...................................................................................................................64
二、業(yè)務(wù)優(yōu)化...................................................................................................................64
3
三、sql優(yōu)化.....................................................................................................................65
四、防sql注入................................................................................................................68
基礎(chǔ)篇
一、JDK常用的包
java.lang: 這個(gè)是系統(tǒng)的基礎(chǔ)類,比如String、Math、Integer、System和Thread,提供常用功能。
java.io: 這里面是所有輸入輸出有關(guān)的類,比如文件操作等
java.net: 這里面是與網(wǎng)絡(luò)有關(guān)的類,比如URL,URLConnection等。java.util : 這個(gè)是系統(tǒng)輔助類,特別是集合類Collection,List,Map等。java.sql: 這個(gè)是數(shù)據(jù)庫(kù)操作的類,Connection, Statememt,ResultSet等
二、Get和Post的區(qū)別
1.get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù),2.get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。
3.get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。
4.在進(jìn)行文件上傳時(shí)只能使用post而不能是get。
三、Java多態(tài)的具體體現(xiàn)
面向?qū)ο缶幊逃兴膫€(gè)特征:抽象,封裝,繼承,多態(tài)。
多態(tài)有四種體現(xiàn)形式:
1.接口和接口的繼承。2.類和類的繼承。3.重載。4.重寫。
其中重載和重寫為核心。
重載:重載發(fā)生在同一個(gè)類中,在該類中如果存在多個(gè)同名方 法,但是方法的參數(shù)類型和個(gè)數(shù)不一樣,那么說(shuō)明該方法被重 載了。
重寫:重寫發(fā)生在子類繼承父類的關(guān)系中,父類中的方法被子 類繼承,方法名,返回值類型,參數(shù)完全一樣,但是方法體不 一樣,那么說(shuō)明父類中的該方法被子類重寫了。
4
四、StringBuffer StringBuilder String 區(qū)別
String
字符串常量
不可變
使用字符串拼接時(shí)是不同的2個(gè)空間
StringBuffer 字符串變量
可變
線程安全
字符串拼接直接在字符串后追加 StringBuilder 字符串變量
可變
非線程安全
字符串拼接直接在字符串后追加
1.StringBuilder執(zhí)行效率高于StringBuffer高于String.2.String是一個(gè)常量,是不可變的,所以對(duì)于每一次+=賦值都會(huì)創(chuàng)建一個(gè)新的對(duì)象,StringBuffer和StringBuilder都是可變的,當(dāng)進(jìn)行字符串拼接時(shí)采用append方
法,在原來(lái)的基礎(chǔ)上進(jìn)行追加,所以性能比String要高,又因?yàn)镾tringBuffer 是
線程安全的而StringBuilder是線程非安全的,所以StringBuilder的效率高于
StringBuffer.3.對(duì)于大數(shù)據(jù)量的字符串的拼接,采用StringBuffer,StringBuilder.五、Hashtable與HashMap的區(qū)別
HashMap不是線程安全的,HashTable是線程安全。
HashMap允許空(null)的鍵和值(key),HashTable則不允許。
HashMap性能優(yōu)于Hashtable。
Map 1.Map是一個(gè)以鍵值對(duì)存儲(chǔ)的接口。Map下有兩個(gè)具體的實(shí)現(xiàn),分別是HashMap和HashTable.2.HashMap是線程非安全的,HashTable是線程安全的,所以HashMap的效率高于HashTable.3.HashMap允許鍵或值為空,而HashTable不允許鍵或值為空.六、九大隱式對(duì)象
輸入/輸出對(duì)象:
request
response
out 作用域通信對(duì)象: session application pageContext Servlet 對(duì)象:
page
config 錯(cuò)誤對(duì)象:
exception
5
七、Forword(請(qǐng)求轉(zhuǎn)發(fā))與Redirect(重定向)
1、從數(shù)據(jù)共享上
Forword是一個(gè)請(qǐng)求的延續(xù),可以共享request的數(shù)據(jù)
Redirect開啟一個(gè)新的請(qǐng)求,不可以共享request的數(shù)據(jù)
2、從地址欄
Forword轉(zhuǎn)發(fā)地址欄不發(fā)生變化
Redirect轉(zhuǎn)發(fā)地址欄發(fā)生變化
八、JQurey總結(jié)
jquery是一個(gè)輕量級(jí)的js框架,具有跨瀏覽器的特性,兼容性好,并且封裝了很多工具,方便使用。
常用的有: 選擇器,dom操作,ajax(ajax不能跨域),特效,工具類
九、XML和Json的特點(diǎn)
Xml特點(diǎn):
1、有且只有一個(gè)根節(jié)點(diǎn);
2、數(shù)據(jù)傳輸?shù)妮d體
3、所有的標(biāo)簽都需要自定義
4、是純文本文件
Json(JavaScript Object Notation)特點(diǎn):
json分為兩種格式:
json對(duì)象(就是在{}中存儲(chǔ)鍵值對(duì),鍵和值之間用冒號(hào)分隔,鍵 值 對(duì)之間用逗號(hào)分隔);
json數(shù)組(就是[]中存儲(chǔ)多個(gè)json對(duì)象,json對(duì)象之間用逗號(hào)分隔)(兩者間可以進(jìn)行相互嵌套)數(shù)據(jù)傳輸?shù)妮d體之一
區(qū)別:
傳輸同樣格式的數(shù)據(jù),xml需要使用更多的字符進(jìn)行描述,流行的是基于json的數(shù)據(jù)傳輸。
xml的層次結(jié)構(gòu)比json更清晰。
共同點(diǎn):
xml和json都是數(shù)據(jù)傳輸?shù)妮d體,并且具有跨平臺(tái)跨語(yǔ)言的特性。
6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)
getSession()/getSession(true):當(dāng)session存在時(shí)返回該session,否則新建一個(gè)
session并返回該對(duì)象
getSession(false):當(dāng)session存在時(shí)返回該session,否則返回null
十一、Page和PageContext的區(qū)別
Page是servlet對(duì)象;使用this關(guān)鍵字,它的作用范圍是在同一頁(yè)面。PageContext是作用域通信對(duì)象;通常使用setAttribute()和getAttribute()來(lái)設(shè)置和獲取存放對(duì)象的值。
十二、Ajax總結(jié)
AJAX 全稱: 異步JavaScript及 XML(Asynchronous JavaScript And XML)Ajax的核心是JavaScript對(duì)象XmlHttpRequest(XHR)。
Ajax的優(yōu)點(diǎn):
提高用戶體驗(yàn)度(UE)
提高應(yīng)用程序的性能
進(jìn)行局部刷新
AJAX不是一種新的編程語(yǔ)言,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的 Web 應(yīng)用程序的技術(shù)。
2.通過 AJAX,我們的 JavaScript 可使用JavaScript的XMLHttpRequest對(duì)象來(lái)直接與服務(wù)器進(jìn)行通信。通過這個(gè)對(duì)象,我們的 JavaScript 可在不重載頁(yè)面的情況與Web服務(wù)器交換數(shù)據(jù),即可局部刷新。
3.AJAX 在瀏覽器與 Web 服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP 請(qǐng)求),這樣就可使網(wǎng)頁(yè)從服務(wù)器請(qǐng)求少量的信息,而不是整個(gè)頁(yè)面,減輕服務(wù)器的負(fù)擔(dān),提升站點(diǎn)的性能。
AJAX 可使因特網(wǎng)應(yīng)用程序更小、更快,更友好,用戶體驗(yàn)(UE)好。5.Ajax是基于標(biāo)準(zhǔn)化并被廣泛支持的技術(shù),并且不需要插件和下載小程序
十三、JSP9大隱視對(duì)象中四個(gè)作用域的大小與作用范圍
四個(gè)作用域從大到?。篴ppliaction>session>request>page application:全局作用范圍,整個(gè)應(yīng)用程序共享.生命周期為:應(yīng)用程序啟動(dòng)到停止。
7
session:會(huì)話作用域,當(dāng)用戶首次訪問時(shí),產(chǎn)生一個(gè)新的會(huì)話,以后服務(wù)器就可以記
住這個(gè)會(huì)話狀態(tài)。
request:請(qǐng)求作用域,就是客戶端的一次請(qǐng)求。
page:一個(gè)JSP頁(yè)面。
以上作用范圍使越來(lái)越小,request和page的生命周期都是短暫的,他們之間的區(qū)別就是:一個(gè)request可以包含多個(gè)page頁(yè)(include,forward)。
十四、List,Set,Collection,Collections
1.List和Set都是接口,他們都繼承于接口Collection,List是一個(gè)有序的可重復(fù)的集合,而Set的無(wú)序的不可重復(fù)的集合。Collection是集合的頂層接口,Collections是一個(gè)封裝了眾多關(guān)于集合操作的靜態(tài)方法的工具類,因?yàn)闃?gòu)造方法是私有的,所以不能實(shí)例化。
2.List接口實(shí)現(xiàn)類有ArrayList,LinkedList,Vector。ArrayList和Vector是基于數(shù)組實(shí)現(xiàn)的,所以查詢的時(shí)候速度快,而在進(jìn)行增加和刪除的時(shí)候速度較慢LinkedList是基于鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),所以在進(jìn)行查詢的時(shí)候速度較慢但在進(jìn)行增加和刪除的時(shí)候速度較快。又因?yàn)閂ector是線程安全的,所以他和ArrayList相比而言,查詢效率要低。
十五、java的基本數(shù)據(jù)類型
數(shù)據(jù)類型 大小 byte(字節(jié))1(8位)shot(短整型)2(16位)int(整型)4(32位)long(長(zhǎng)整型)8(32位)float(浮點(diǎn)型)4(32位)double(雙精度)8(64位)char(字符型)2(16位)boolean(布爾型)1位 附加:
String是基本數(shù)據(jù)類型嗎?(String不是基本數(shù)據(jù)類型)String的長(zhǎng)度是多少,有限制?(長(zhǎng)度受內(nèi)存大小的影響)
十六、冒泡排序
public class Sort { public static void sort(){
8
} Scanner input = new Scanner(System.in);int sort[] = new int[10];int temp;System.out.println(“請(qǐng)輸入10個(gè)排序的數(shù)據(jù):”);for(int i = 0;i < sort.length;i++){
sort[i] = input.nextInt();} for(int i = 0;i < sort.lengthi1)* num;
} } public static void main(String[] args){
System.out.println(multiply(10));} }
二十、UE和UI的區(qū)別
UE 是用戶體驗(yàn)度
UI 界面原型(用戶界面)(相當(dāng)于買房時(shí)用的模型)
設(shè)計(jì)UI的作用:
1、幫助程序員工作(界面已由美工設(shè)計(jì)完成)
2、提前讓用戶對(duì)項(xiàng)目有個(gè)宏觀的了解,知道效果是什么樣子。
二十一、osi七層模型
第一層:物理層
第二層:數(shù)據(jù)鏈路層
第三層:網(wǎng)絡(luò)層
第四層:傳輸層
第五層:會(huì)話層 第六層:表示層 第七層:應(yīng)用層
10
二十二、線程和進(jìn)程的區(qū)別
1.線程(Thread)與進(jìn)程(Process)
進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊界,通常來(lái)說(shuō)一個(gè)進(jìn)程就代表一個(gè)與之對(duì)應(yīng)的應(yīng)用程序。不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而同一進(jìn)程的不同線程可以共享代碼和數(shù)據(jù)空間。
2.一個(gè)進(jìn)程可以包括若干個(gè)線程,同時(shí)創(chuàng)建多個(gè)線程來(lái)完成某項(xiàng)任務(wù),便是多線程。3.實(shí)現(xiàn)線程的兩種方式:繼承Thread類,實(shí)現(xiàn)Runable接口
二十三、jvm的內(nèi)存結(jié)構(gòu)
java虛擬機(jī)的內(nèi)存結(jié)構(gòu)分為堆(heap)和棧(stack),堆里面存放是對(duì)象實(shí)例也就是new出來(lái)的對(duì)象。棧里面存放的是基本數(shù)據(jù)類型以及引用數(shù)據(jù)類型的地址。
對(duì)于所謂的常量是存儲(chǔ)在方法區(qū)的常量池里面。
二十四、內(nèi)存泄露和內(nèi)存溢出
內(nèi)存泄露(memory leak),是指應(yīng)用程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已經(jīng)申請(qǐng)的內(nèi)存空間.一次內(nèi)存泄露危害可以忽略,但如果任其發(fā)展最終會(huì)導(dǎo)致內(nèi)存溢出(out of memory).如讀取文件后流要進(jìn)行及時(shí)的關(guān)閉以及對(duì)數(shù)據(jù)庫(kù)連接的釋放。
內(nèi)存溢出(out of memory)是指應(yīng)用程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用。
如我們?cè)陧?xiàng)目中對(duì)于大批量數(shù)據(jù)的導(dǎo)入,采用分段批量提交的方式。
二十五、單例
單例就是該類只能返回一個(gè)實(shí)例。單例所具備的特點(diǎn): 1.私有化的構(gòu)造函數(shù) 2.私有的靜態(tài)的全局變量 3.公有的靜態(tài)的方法
單例分為懶漢式、餓漢式和雙層鎖式
11
餓漢式: public class Singleton1 {
private Singleton1(){};
private static Singleton1 single = new Singleton1();
public static Singleton1 getInstance(){
return single;
} }
懶漢式:
public class Singleton2 {
private Singleton2(){}
private static Singleton2 single=null;
public tatic Singleton2 getInstance(){
if(single == null){
single = new Singleton2();
}
return single;
} } 線程安全:
public class Singleton3 {
private Singleton3(){}
private static Singleton3 single;
public static Singleton3 getInstance(){
if(null == single){
synchronized(single){
if(null == single){
single = new Singleton3();
}
}
}
return single;
} }
參考:
通過雙重判斷來(lái)保證單列設(shè)計(jì)模式在多線程中的安全性,并且它在性能方面提高了很多。
12
synchronized在方法上加鎖(同步鎖)
synchronized在代碼塊內(nèi)部加鎖(同步代碼塊)
synchronized(同步鎖)
使用synchronized如何解決線程安全的問題? 1.synchronized在方法上加鎖 2.synchronized在代碼塊內(nèi)部加鎖
1.懶漢
2.餓漢
3.雙重判斷
二十六、解析xml文件的幾種技術(shù)
1、解析xml的幾種技術(shù)
1.dom4j
2.sax
3.jaxb
4.jdom
5.dom 1.dom4j
dom4j是一個(gè)Java的XML API,類似于jdom,用來(lái)讀寫XML文件的。dom4j是一個(gè)非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。
2.sax
SAX(simple API for XML)是一種XML解析的替代方法。相比于DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比于DOM,SAX可以在解析文檔的任意時(shí)刻停止解析,但任何事物都有其相反的一面,對(duì)于SAX來(lái)說(shuō)就是操作復(fù)雜。
13
3.jaxb
JAXB(Java Architecture for XML Binding)是一個(gè)業(yè)界的標(biāo)準(zhǔn),是一項(xiàng)可以根據(jù)XML Schema產(chǎn)生Java類的技術(shù)。該過程中,JAXB也提供了將XML實(shí)例文檔反向生成Java對(duì)象樹的方法,并能將Java對(duì)象樹的內(nèi)容重新寫到XML實(shí)例文檔。從另一方面來(lái)講,JAXB提供了快速而簡(jiǎn)便的方法將XML模式綁定到Java表示,從而使得Java開發(fā)者在Java應(yīng)用程序中能方便地結(jié)合XML數(shù)據(jù)和處理函數(shù)。
2、dom4j 與 sax 之間的對(duì)比:【注:必須掌握!】
dom4j不適合大文件的解析,因?yàn)樗且幌伦訉⑽募虞d到內(nèi)存中,所以有可能出現(xiàn)內(nèi)存溢出,sax是基于事件來(lái)對(duì)xml進(jìn)行解析的,所以他可以解析大文件的xml
也正是因?yàn)槿绱?,所以dom4j可以對(duì)xml進(jìn)行靈活的增刪改查和導(dǎo)航,而sax沒有這么強(qiáng)的靈活性
所以sax經(jīng)常是用來(lái)解析大型xml文件,而要對(duì)xml文件進(jìn)行一些靈活(crud)操作就用dom4j
二十七、項(xiàng)目的生命周期
1.需求分析
2.概要設(shè)計(jì)
3.詳細(xì)設(shè)計(jì)(用例圖,流程圖,類圖)4.數(shù)據(jù)庫(kù)設(shè)計(jì)(powerdesigner)5.代碼開發(fā)(編寫)
6.單元測(cè)試(junit 白盒測(cè)試)(開發(fā)人員)svn版本管理工具(提交,更新代碼,文檔)7.集成測(cè)試(黑盒測(cè)試,loadrunner(編寫測(cè)試腳本)(高級(jí)測(cè)試))
8.上線試運(yùn)行(用戶自己體驗(yàn))
9.壓力測(cè)試(loadrunner)
10.正式上線
11.維護(hù)
二十八、OSCache的判斷
Object obj = CacheManager.getInstance().getObj(“oaBrandList”);//從緩存中取數(shù)據(jù) if(null == obj){
obj = brandDao.getBrandList();
//如果為空再?gòu)臄?shù)據(jù)庫(kù)獲取數(shù)據(jù)
//獲取之后放入緩存中
14
CacheManager.getInstance().putObj(“oaBrandList”, obj);}
return(List
二十九、經(jīng)常訪問的技術(shù)網(wǎng)站
1.csdn(詳細(xì)步驟的描述)2.iteye(詳細(xì)步驟的描述)3.oschina(開源中國(guó)獲取java開源方面的信息技術(shù))
4.java開源大全 下載完畢,并且已經(jīng)解析為DOM 樹了,但很有可能圖片還沒有加載完畢,所以例如圖片的高度和寬度這樣的屬性此時(shí)不一定有效。要解決這個(gè)問題,可以使用Jquery 中另一個(gè)關(guān)于頁(yè)面加載的方法---load()方法。Load()方法會(huì)在元素的onload 事件中綁定一個(gè)處理函數(shù)。如果處理函數(shù)綁定給window 對(duì)象,則會(huì)在所有內(nèi)容(包括窗口、框架、對(duì)象和圖像等)加載完畢后觸發(fā),如果處理函數(shù)綁定在元素上,則會(huì)在元素的內(nèi)容加載完畢后觸發(fā)。Jquery 代碼如下: $(window).load(function(){ // 編寫代碼 });等價(jià)于JavaScript 中的以下代碼 Window.onload = function(){ // 編寫代碼 } 四
十五、switch默認(rèn)接受的幾種數(shù)據(jù)類型
Short, int, byte, char
21
四
十六、request 跟session的區(qū)別
1.他們的生命周期不同,request對(duì)應(yīng)的是一次請(qǐng)求,session對(duì)應(yīng)的是一次會(huì)話
2.request占用資源比較少,相對(duì)來(lái)說(shuō)缺乏持續(xù)性, 而session資源消耗比較大,所以通常使用request來(lái)保存信息
四
十七、找到解決svn沖突方法
對(duì)于svn沖突,可以采用手工處理將沖突的部分進(jìn)行整合,之后備份最新整合后的文件,采用覆蓋更新的方式處理完 沖突之后,再把最新整合后的文件進(jìn)行提交。
四
十八、反射的描述
通過字符串可以動(dòng)態(tài)創(chuàng)建java對(duì)象,并且可以動(dòng)態(tài)訪問方法,屬性等。
我們?cè)陧?xiàng)目中的時(shí)候封裝過數(shù)據(jù)庫(kù)jdbc的持久層,其中就利用反射這項(xiàng)
技術(shù)來(lái)達(dá)到通用
和靈活的目的。
22
框架篇
一、Struts1的運(yùn)行原理
在啟動(dòng)時(shí)通過前端總控制器ActionServlet加載struts-config.xml并進(jìn)行解析,當(dāng)用戶在jsp頁(yè)面發(fā)送請(qǐng)求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請(qǐng)求時(shí)將請(qǐng)求參數(shù)放到對(duì)應(yīng)的ActionForm對(duì)象中的成員變量中,然后ActionServlet則會(huì)根據(jù)struts-config.xml中的映射關(guān)系找到相應(yīng)的Action中的方法,將對(duì)應(yīng)的ActionForm一并傳給這個(gè)Action中的方法里,然后執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作,最后就根據(jù)ActionMapping的findforward方法返回一個(gè)ActionForward,之后在struts-config.xml中找到與之對(duì)應(yīng)的forward標(biāo)簽,根據(jù)它的配置路徑找到對(duì)應(yīng)的jsp頁(yè)面。
二、Struts2的運(yùn)行原理
1、tomcat 啟動(dòng)的時(shí)候會(huì)加載 web.xml、核心控制器 FilterDispatcher 會(huì)加載并解析 struts.xml
2、客戶端會(huì)發(fā)送一個(gè)請(qǐng)求到 action、FilterDispatcher 會(huì)根據(jù)后綴名進(jìn)行攔截
3、FilterDispatcher根據(jù) struts.xml 的配置文件信息 找到 某個(gè)action 對(duì)應(yīng)的某個(gè)類里的指定方法
4、執(zhí)行相關(guān)的業(yè)務(wù)邏輯最后返回 一個(gè)String
5、
三、struts2的體系結(jié)構(gòu)
1、客戶端向Servlet容器(例如Tomcat)發(fā)送一個(gè)請(qǐng)求;
2、這個(gè)請(qǐng)求經(jīng)過一系列的過濾器(Filter);
3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy;
5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類;
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是jsp或者FreeMarker的模版。(體系結(jié)構(gòu)圖見下一頁(yè))
23
四、Spring MVC運(yùn)行原理
整個(gè)處理過程從一個(gè)HTTP請(qǐng)求開始:
1.Tomcat在啟動(dòng)時(shí)加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,并且通過DispatcherServlet來(lái)加載相關(guān)的配置文件信息。
2.DispatcherServlet接收到客戶端請(qǐng)求,找到對(duì)應(yīng)HandlerMapping,根據(jù)映射規(guī)則,找到對(duì)應(yīng)的處理器(Handler)。
3.調(diào)用相應(yīng)處理器中的處理方法,處理該請(qǐng)求后,會(huì)返回一個(gè)ModelAndView。
4.DispatcherServlet根據(jù)得到的ModelAndView中的視圖對(duì)象,找到一個(gè)合適的ViewResolver(視圖解析器),根據(jù)視圖解析器的配置,DispatcherServlet將要顯示的數(shù)據(jù)傳給對(duì)應(yīng)的視圖,最后顯示給用戶。
24
五、Struts1.x與Struts2.x的區(qū)別
Struts 2以WebWork為核心,采用攔截器的機(jī)制來(lái)處理用戶的請(qǐng)求,struts1嚴(yán)重依賴于servletAPI, 屬于侵入性框架,struts2不嚴(yán)重依賴于servletAPI,屬于非侵入型框架。線程模型方面:
Struts1的Action是單實(shí)例的, 一個(gè)Action的實(shí)例處理所有的請(qǐng)求。
Struts2的Action是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)實(shí)例(每次請(qǐng)求時(shí)都新new出一個(gè)對(duì)象), 沒有線程安全方面的問題 封裝請(qǐng)求參數(shù):
Struts1中強(qiáng)制使用ActionForm對(duì)象封裝請(qǐng)求的參數(shù)。
Struts2可以選擇使用POJO類來(lái)封裝請(qǐng)求的參數(shù),或者直接使用Action的屬性。struts1的前端總控制器(核心總控制器)為ActionServlet, struts2的前端總控制器(核心總控制器)為FilterDispather
六、Spring MVC、struts1和struts2區(qū)別
1.spring mvc 單例 非線程安全
struts1單例 非線程安全
struts2線程安全對(duì)每個(gè)請(qǐng)求都產(chǎn)生一個(gè)實(shí)例 2.spring mvc的入口是servlet,而struts2是filter
spring 的前端總控制器為 DispatcherServlet
struts2 的前端總控制器為 FilterDispatcher
struts1 的前端總控制器為 actionServlet 3.參數(shù)傳遞:struts是在接受參數(shù)的時(shí)候,可以用屬性來(lái)接受參數(shù),這就說(shuō)明參數(shù)是讓多個(gè)方法共享的。springmvc 用方法來(lái)接受參數(shù)
4.spring mvc是基于方法的設(shè)計(jì),而sturts是基于類
七、Struts2中result中的type類型
1.dispatcher:它是默認(rèn)的,用來(lái)轉(zhuǎn)向頁(yè)面,通常處理JSP 2.redirect:將用戶重定向到一個(gè)已配置好的URL 3.redirectAction:將用戶重定向到一個(gè)已定義好的action 4.chain:將action和另外一個(gè)action鏈接起來(lái) 5.freemarker:呈現(xiàn)Freemarker模板
6.httpheader:返回一個(gè)已配置好的HTTP頭信息響應(yīng)
7.stream:向?yàn)g覽器發(fā)送InputSream對(duì)象對(duì)下載的內(nèi)容和圖片非常有用 8.velocity:呈現(xiàn)Velocity模板
25
9.xslt :該XML可以通過XSL模板進(jìn)行轉(zhuǎn)換
10.plaintext:顯示原始文件內(nèi)容,例如文件源代碼
八、Struts2標(biāo)簽
首先需要引用 <%@taglib prefix=“s” uri=“/struts-tags”%> 1.
3.
個(gè)頁(yè)面中
4.
5.
6.
7.
8.
9.
最常用的是:
判斷
循環(huán)
輸出
九、SSI整合
1、Action繼承于Actionsupport
2、引入struts-spring-plugin.jar包,從而完成struts和spring的整合
3、在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
4、Dao層繼承于SqlMapClientDaoSupport
5、在dao層的配置文件中注入sqlMapClient
十、SSH整合
1.首先在web.xml中通過ContextLoaderListener來(lái)融入spring,并加載spring的相關(guān)配置文件
2.同樣配置sturts2的前端總控制器filterDispatcher來(lái)過濾相關(guān)的 請(qǐng)求并且加載struts.xml
26
3.action繼承ActionSupport,然后通過引入struts-spring-plugin.jar 包并且根據(jù)配置文件中service的id生成get,set方法來(lái)注入service層。
4.dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.5.通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate.在ssh框架中是怎么整合spring? 首先在web.xml中通過ContextLoaderListener來(lái)融入spring,并加載spring的相關(guān)配置文件
在ssh框架中是怎么整合hibernate? 通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory
在ssh框架中是怎么整合struts2? 配置sturts2的前端總控制器filterDispatcher來(lái)過濾相關(guān)的 請(qǐng)求并且加載struts.xml
十、Spring MVC整合
1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,對(duì)指定的后綴請(qǐng)求進(jìn)行攔截。
2.Controller層要加 @Controller注解,表明該類是MVC的控制層。
3.創(chuàng)建Service接口,給接口加上注解 @Component或者 @Service 表明這是Service業(yè)務(wù)處理層
4.在Controller層聲明Service變量(屬性),給變量(屬性)加上 @Autowired注解,通過自動(dòng)綁定機(jī)制將Service注入到Controller。(注:@Autowired默認(rèn)是ByType,如果想根據(jù)屬性名注入,那么就再加上注解 @Resource(name=“屬性名”))5.在Controller層的方法上加上注解 @RequestMapping(“requestAddress”)表明該方法的請(qǐng)求地址
6.Dao層要加上注解 @Repository 表明這是數(shù)據(jù)庫(kù)持久層 7.同樣將dao實(shí)例注入到service層中。
8.配置視圖解析器 “InternalResourceViewResolver”,對(duì)處理后的跳轉(zhuǎn)進(jìn)行統(tǒng)一配置。
27
十一、Hibernate 中g(shù)et 和 load的區(qū)別
加載方式:
load為延遲加載(返回的是一個(gè)只有id屬性的代理,只有使用該對(duì)象屬性時(shí),才
發(fā)出sql語(yǔ)句);
get為立即加載(執(zhí)行時(shí),會(huì)立即向數(shù)據(jù)庫(kù)發(fā)出sql語(yǔ)句)返回結(jié)果:
load檢索不到記錄時(shí),會(huì)拋ObjectNotFoundException異常
get檢索不到記錄時(shí),會(huì)返回null
十二、Hibernate、Ibatis、Jdbc三者的區(qū)別
Hibernate屬于全自動(dòng),Ibatis屬于半自動(dòng),Jdbc屬于手動(dòng),從開發(fā)效率上講hibernate較高,ibatis居中,jdbc較低,從執(zhí)行效率上講hibernate較低,ibatis居中,jdbc較高,因?yàn)閖dbc是手工寫sql語(yǔ)句,程序員對(duì)sql的控制能力更大,可以根據(jù)業(yè)務(wù)需要進(jìn)行優(yōu)化,而ibatis雖然也可以對(duì)sql進(jìn)行優(yōu)化,但是他里面將resultset封裝為實(shí)體的過程中采用了反射機(jī)制所以一定程度上影響了性能,而hibernate因?yàn)楦叨确庋b所以開發(fā)效率相對(duì)較高,但正因?yàn)檫@個(gè)原因,所以程序員在對(duì)sql語(yǔ)句的控制和優(yōu)化方面相對(duì)比較弱,而且在將resultset封裝成實(shí)體的過程中也采用了反射機(jī)制,所以在性能方面較低
十三、Hibernate的運(yùn)行原理
首先通過configuration去加載hibernate.cfg.xml這個(gè)配置文件,根據(jù) 配置文件的信息去創(chuàng)建sessionFactory,sessionFactory是線程安全的,是一個(gè)session工廠,用來(lái)創(chuàng)建session,session是線程不安全的,相當(dāng)于
jdbc的connection,最后通過session去進(jìn)行數(shù)據(jù)庫(kù)的各種操作,在進(jìn)行操作 的時(shí)候通過transaction進(jìn)行事務(wù)的控制。
十四、Hibernate五大核心(類/接口)簡(jiǎn)述
1.Configuration接口的作用是對(duì)Hibernate進(jìn)行配置,以及對(duì)它進(jìn)行啟動(dòng)。(加載 hibernate.cfg.xml)并創(chuàng)建一個(gè)SessionFactory對(duì)象。2.SessionFactory接口
SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建 Session對(duì)象。SessionFactory是線程安全的。3.Session接口
Session(會(huì)話)接口是Hibernate應(yīng)用使用的主要接口。Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作(增刪改查)。Session對(duì)象是非線程安全的。Session 相當(dāng)于jdbc的connection 4.Query與Criteria接口
總之Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢。5.Transaction接口
28
Transaction(事務(wù))負(fù)責(zé)操作相關(guān)的事務(wù)。
十五、Hibernate與JDBC的區(qū)別
1、hibernate和jdbc主要區(qū)別就是,hibernate先檢索緩存中的映射對(duì)象(即hibernate操作的是對(duì)象),而jdbc則是直接操作數(shù)據(jù)庫(kù).2、Hibernate是JDBC的輕量級(jí)的對(duì)象封裝,它是一個(gè)獨(dú)立的對(duì)象持久層框架。Hibernate可以用在任何JDBC可以使用的場(chǎng)合
3、Hibernate是一個(gè)和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動(dòng),和數(shù)據(jù)庫(kù)都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。
4、如果正確的使用JDBC技術(shù),它的執(zhí)行效率一定比hibernate要好,因?yàn)閔ibernate是基于jdbc的技術(shù).5、JDBC使用的是SQL語(yǔ)句,Hibernate使用的是HQL語(yǔ)句,但是HQL語(yǔ)句最終還會(huì)隱式轉(zhuǎn)換成SQL語(yǔ)句執(zhí)行。
十六、Hibernate中的兩大配置文件
*.hbm.xml:主鍵生成策略,映射關(guān)系,一對(duì)多,一對(duì)一的關(guān)系。
Hibernate.cfg.xml:方言(用哪個(gè)數(shù)據(jù)庫(kù)),數(shù)據(jù)庫(kù)連接信息,包含*.hbm.xml內(nèi)容,映射 文件,也可以配事務(wù)。
十七、Hibernate事務(wù)處理
開啟事務(wù) session.beginTransaction();執(zhí)行相關(guān)的操作,如果成功則session.getTransaction().commit();執(zhí)行操作失敗則 session.getTransaction.rollback();
十八、Hibernate的三種狀態(tài)以及狀態(tài)的轉(zhuǎn)換
Transient(臨時(shí))
new 一個(gè)初始化對(duì)象后,并沒有在數(shù)據(jù)庫(kù)里保存數(shù)據(jù),處于臨時(shí)狀態(tài); Persistent(持久化)
當(dāng)執(zhí)行save()方法,調(diào)用session.close()方法之前,內(nèi)存中的對(duì)象與數(shù)據(jù)庫(kù)有
對(duì)應(yīng)關(guān)系處于持久化狀態(tài);
Detached(托管/游離)
當(dāng)執(zhí)行session.close()之后,處于托管狀態(tài); 狀態(tài)的轉(zhuǎn)換
處于托管狀態(tài)下,調(diào)用update()方法后,轉(zhuǎn)換為持久化狀態(tài);
在持久化狀態(tài)下,執(zhí)行delete()方法后,轉(zhuǎn)換為臨時(shí)狀態(tài);
在未初始化對(duì)象之前,調(diào)用get(),load(),find(),iterate()之后,直接進(jìn)入持久化
狀態(tài)。
29
十九、分頁(yè)步驟
①前臺(tái)封裝一個(gè)顯示分頁(yè)的組件 ②查詢總條數(shù)
③后臺(tái)封裝分頁(yè)工具類,計(jì)算開始位置、結(jié)束位置、總頁(yè)數(shù) ④后臺(tái)寫支持分頁(yè)的sql語(yǔ)句
⑤前臺(tái)包含分頁(yè)組件,實(shí)現(xiàn)分頁(yè)效果
注意: 查詢總條數(shù)的where和查詢列表信息的where條件要保證一致。
二十、hibernate緩存概述
hibernate分為一級(jí)緩存即session緩存也叫事務(wù)級(jí)別的緩存以及
二級(jí)緩存sessionFactory即應(yīng)用級(jí)別的緩存,還有查詢緩存即三級(jí)緩存.一級(jí)緩存的生命周期和session的生命周期保持一致,hibernate默認(rèn)就啟用了一級(jí)緩存,不能將其關(guān)閉,可以通過session.clear()和session.evict(object)來(lái)管理一級(jí)緩存。其中g(shù)et,load,iterate都會(huì)使用一級(jí)緩存,一級(jí)緩存緩存的是對(duì)象。
二級(jí)緩存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多個(gè)session共享,hibernate3默認(rèn)開啟二級(jí)緩存,也可以手動(dòng)開啟并指定緩存插件如ehcache,oscache 等。二級(jí)緩存也只能緩存對(duì)象。
三級(jí)緩存也叫查詢緩存,查詢緩存是針對(duì)普通屬性結(jié)果集的緩存, 對(duì)實(shí)體對(duì)象的結(jié)果集只緩存id。對(duì)query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查詢緩存
二十一、Ssh的概述:
ssh是web開發(fā)中常見的一種框架 s-struts s-spring h-hibernate 其中struts在框架中充當(dāng)控制器,實(shí)現(xiàn)MVC,主要用來(lái)處理用戶的請(qǐng)求,和跳轉(zhuǎn)頁(yè)面。使項(xiàng)目結(jié)構(gòu)清晰,開發(fā)者只需要關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn)即可。
spring在ssh充當(dāng)粘合劑,粘合struts-sping-hibernate,主要用來(lái)進(jìn)行事物的控制,hibernate-充當(dāng)數(shù)據(jù)庫(kù)持久層,主要用它來(lái)與數(shù)據(jù)庫(kù)交互,提高開發(fā)效率,減輕程序員sql控制要求,而且hibernate通過反射機(jī)制,有靈活的映射性,還支持各種關(guān)系,一對(duì)一,一對(duì)多,多對(duì)多。
在進(jìn)行ssh整合的時(shí)候,我們應(yīng)該注意: 1.Action繼承于ActionSupport 引入struts-spring-plugin.jar包,從而完成struts和spring的整合
在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
30
Dao層繼承于hibernateDaoSupport 在dao層的配置文件中注入sessionFactory
二十二、防止表單重復(fù)提交
針對(duì)于重復(fù)提交的整體解決方案: 1.用redirect來(lái)解決重復(fù)提交的問題 2.點(diǎn)擊一次之后,按鈕失效 3.通過loading 4.自定義重復(fù)提交過濾器 5.解決struts2重復(fù)提交
可以結(jié)合s:token標(biāo)簽來(lái)解決重復(fù)提交問題
利用token的原理:
1.在前端的jsp頁(yè)面中加入s:token標(biāo)簽,在訪問該頁(yè)面時(shí)就會(huì)生成 隱藏域,該隱藏域中包含一個(gè)隨機(jī)生成的字符串,并把該字符串
存入session中
2.在struts2的配置文件中加入token攔截器后,當(dāng)正常訪問action 的時(shí)候,會(huì)從session中取出該字符串,然后和頁(yè)面隱藏域中提交 字符串做對(duì)比,如果一致則正常執(zhí)行并刪除session中存儲(chǔ)的字符串。
二十三、JSP標(biāo)簽:
1.JSP include動(dòng)作
jsp:include 動(dòng)作
以“
2.JSP指令:<%@ include%><%@
%>
以“<%@ ” 開始,以“%> ” 結(jié)束。比如:
<%@ include file = “ Filename” %> 3.JSP輸出表達(dá)式:<%= %><%=Java表達(dá)式 %>
輸出變量的值,后邊不能加<%=;%> 4.JSP Scriptlet【腳本】:<%;%> <% Java 代碼 %>
例子:
<% Calendar now = Calendar.getInstance();%> 5.JSP聲明:<%!%> <%!函數(shù)或者方法 %>
例子:
<%!String getHello(String name){ return “Hi,” + name + “!”;}
%> 6.迭代標(biāo)簽:
Jstl中的核心標(biāo)簽(core)7.JSP注釋:
<%--這也是注釋,但客戶端不能查看到--%> 8.el表達(dá)式:${} 9.jsp:include動(dòng)作是在運(yùn)行時(shí)動(dòng)態(tài)包含。
@include指令是在編譯時(shí)包含。
它們兩個(gè)都只能包含本項(xiàng)目的相關(guān)文件,不能包含其他項(xiàng)目的。
如果要包含其他項(xiàng)目的文件可以使用c:import 二
十四、過濾器
filter的概述: filter是一個(gè)過濾器,用來(lái)在請(qǐng)求前和響應(yīng)后進(jìn)行數(shù)據(jù)的處理。
filter的生命周期是: 實(shí)例化--->初始化(init)-->進(jìn)行過濾(doFilter)--->銷毀(destroy)-->釋放資源
一個(gè)Filter必須實(shí)現(xiàn)javax.servlet.Filter接口
在項(xiàng)目中我們通常通過filter進(jìn)行編碼轉(zhuǎn)換,進(jìn)行安全驗(yàn)證,進(jìn)行重復(fù)提交的判斷。
了解(不需要主動(dòng)說(shuō))filter 相當(dāng)于 攔截器 相當(dāng)于Spring AOP servlet+jsp+javabean+jdbc+filter encode utf-8
二十五、攔截器的理解
什么是攔截器:
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點(diǎn)”,來(lái)指定攔截器的代碼在“織入點(diǎn)”的前后執(zhí)行,從而起到攔截的作用
正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對(duì)象是Action代碼,可以定義在Action代碼之前或者之后執(zhí)行攔截器的代碼。在項(xiàng)目中,我們經(jīng)常用來(lái)攔截通過非正常程序而進(jìn)行的訪問
32
Struts2的攔截器和Servlet過濾器類似。在執(zhí)行Action的execute方法之前,Struts2會(huì)首先執(zhí)行在struts.xml中引用的攔截器,在執(zhí)行完所有引用的攔截器的intercept方法后,會(huì)執(zhí)行Action的execute方法。
其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會(huì)調(diào)用之個(gè)方法。在Struts2中已經(jīng)在struts-default.xml中預(yù)定義了一些自帶的攔截器,如timer、params等。如果在
標(biāo)簽中繼承struts-default,則當(dāng)前package就會(huì)自動(dòng)擁有struts-default.xml中的所有配置。代碼如下:
...
攔截器是Struts2框架的核心,它主要完成解析請(qǐng)求參數(shù)、將請(qǐng)求參數(shù)賦值給Action屬性、執(zhí)行數(shù)據(jù)校驗(yàn)、文件上傳等工作
在struts-default.xml中有一個(gè)默認(rèn)的引用,在默認(rèn)情況下(也就是
同時(shí)可以減輕代碼冗余,提高重用率。
如果要求用戶密碼、權(quán)限等的驗(yàn)證,就可以用自定義的攔截器進(jìn)行密碼驗(yàn)證和權(quán)限限制。對(duì)符合的登入者才跳轉(zhuǎn)到正確頁(yè)面。
二十六、Spring融入框架
我們通過在web.xml中配置ContextLoaderListener這個(gè)監(jiān)聽器也加載 spring的配置文件,從而融入到項(xiàng)目框架中。
二十七、項(xiàng)目的部署方式
1、如果項(xiàng)目單獨(dú)部署到tomcat中的時(shí)候,應(yīng)該看tomcat中的server.xml;
2、如果和eclipse結(jié)合使用進(jìn)行項(xiàng)目部署的時(shí)候,應(yīng)該看eclipse里面的server.xml.數(shù)據(jù)庫(kù)篇
一、JDBC連接數(shù)據(jù)庫(kù)步驟(以MYSQL為例)
1、加載JDBC驅(qū)動(dòng)程序:
通過Class類的forName方法實(shí)現(xiàn),并將驅(qū)動(dòng)地址放進(jìn)去
成功加載后,會(huì)將Driver類的實(shí)例注冊(cè)到DriverManager類中。
33
2、提供JDBC連接的URL、創(chuàng)建數(shù)據(jù)庫(kù)的連接
?要連接數(shù)據(jù)庫(kù),需要向java.sql.DriverManager請(qǐng)求并獲得Connection對(duì)象,該對(duì)象就代表一個(gè)數(shù)據(jù)庫(kù)的連接。
?使用DriverManager的getConnectin()方法傳入指定的欲連接的數(shù)據(jù)庫(kù)的路徑、數(shù) 據(jù)庫(kù)的用戶名和密碼。
Connection con=DriverManager.getConnection(url , username , password);&&&:“jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8”;
3、創(chuàng)建一個(gè)Statement
?要執(zhí)行SQL語(yǔ)句,必須獲得java.sql.Statement實(shí)例
?執(zhí)行靜態(tài)SQL語(yǔ)句。通常通過Statement實(shí)例實(shí)現(xiàn)。
?執(zhí)行動(dòng)態(tài)SQL語(yǔ)句。通常通過PreparedStatement實(shí)例實(shí)現(xiàn)。
String sql = “”;
Statement st = con.createStatement();
PreparedStatement pst = con.prepareStatement(sql);
4、執(zhí)行SQL語(yǔ)句
Statement接口提供了executeQuery、executeUpdate、execute三種方法
executeQuery:執(zhí)行select語(yǔ)句,返回ResultSet結(jié)果集
ResultSet rst = pst.executeQuery();
? executeUpdate:執(zhí)行insert、update、delete語(yǔ)句
pst.executeUpdate();
5、關(guān)閉JDBC對(duì)象
操作完成以后要把所有使用的JDBC對(duì)象全都關(guān)閉,以釋放JDBC資源。
二、數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接池的優(yōu)點(diǎn)運(yùn)行原理: 在我們不使用數(shù)據(jù)庫(kù)連接池的時(shí)候,每次訪問數(shù)據(jù)庫(kù)都需要?jiǎng)?chuàng)建連接,使用完成之后需要釋放關(guān)閉連接,而這樣是很耗費(fèi)資源的。當(dāng)我們使用 數(shù)據(jù)庫(kù)連接池的時(shí)候,在tomcat啟動(dòng)的時(shí)候就創(chuàng)建了指定數(shù)量的連接,之后當(dāng)我們程序使用的時(shí)候就直接從連接池里面取,而不需要?jiǎng)?chuàng)建,同理,當(dāng)我們使用完的時(shí)候也不需要關(guān)閉連接,而是將連接返回到連接池中,供 其他請(qǐng)求繼續(xù)使用。
DBCP:比較穩(wěn)定。C3P0: 性能比較高。
34
三、mysql的數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出
配置:
首先找到mysql的安裝目錄,進(jìn)入bin目錄下復(fù)制路徑 將mysql的bin目錄粘貼在計(jì)算機(jī)環(huán)境變量的path中 授權(quán):
登錄mysql 將某張表的某個(gè)權(quán)限賦給某個(gè)用戶
grant [select,insert,update,delete,create,drop] on [databaseName].[tableName]
to [userName]@[userIP] identified by [?連接口令?]
grant select,insert,update,delete,create,drop on oa_ssh.user to root@[IP] identified by 'root';將所有庫(kù)的所有權(quán)限賦給某個(gè)用戶
grant all privileges on *.* to [userName]@[userIp] identified by [?連接口令?] grant all privileges on *.* to root@[IP] identified by ?root';將所有庫(kù)的所有權(quán)限賦給所有用戶
grant all privileges on *.* to root@'%' identified by ?root?;
導(dǎo)出本地?cái)?shù)據(jù)庫(kù):
mysqldump-u 用戶名-p 數(shù)據(jù)庫(kù)名 > 磁盤:導(dǎo)出的文件名(加后綴)
遠(yuǎn)程導(dǎo)出數(shù)據(jù)庫(kù):
mysqldump-h IP-u 用戶名-p 數(shù)據(jù)庫(kù)名稱 >導(dǎo)出的文件名(加后綴)
遠(yuǎn)程導(dǎo)出數(shù)據(jù)表:
mysqldump-u root-p-d--add-drop-table 數(shù)據(jù)庫(kù)名稱 > 導(dǎo)出文件
名(加后綴)
導(dǎo)入數(shù)據(jù):
mysql-u root-p登錄成功后 ==》 source 磁盤:導(dǎo)入的文件名(加后綴)
四、jdbc分段批量提交的時(shí)候出現(xiàn)異常怎么處理?
通過Map來(lái)解決性能問題。首先在分段批量提交的時(shí)候,我們不采用事務(wù),這樣就保證了合法的數(shù)據(jù)就自動(dòng)提交,不合法的數(shù)據(jù)就自己自動(dòng)進(jìn)行回滾,為了避免不合法數(shù)據(jù)影響后續(xù)合法數(shù)據(jù)的提交,采用定義業(yè)務(wù)規(guī)則字典表,實(shí)現(xiàn)對(duì)數(shù)據(jù)的驗(yàn)證,將不合法的數(shù)據(jù)記錄下來(lái),供用戶進(jìn)行后續(xù)處理,而合法的數(shù)據(jù)就全部提交。
五、jdbc批量處理數(shù)據(jù)
批量處理數(shù)據(jù):(代碼優(yōu)化:提高程序執(zhí)行性能)
35
降低了java程序代碼(客戶端)和數(shù)據(jù)庫(kù)之間的 網(wǎng)絡(luò)通信的次數(shù)。
在jdbc中進(jìn)行批量插入的核心API為 addBatch,executeBatch
大數(shù)據(jù)量的插入問題:(jdbc,hibernate,ibatis)
1.每次只插入一條和數(shù)據(jù)庫(kù)交互多次(很耗時(shí)間)
2.批量插入和數(shù)據(jù)庫(kù)只交互一次(內(nèi)存溢出)
3.分段批量插入(推薦)
jdbc批量處理數(shù)據(jù)是通過PreparedStatement對(duì)象的 addbatch(), executebatch()clearbatch()進(jìn)行和數(shù)據(jù)庫(kù)的交互。通常我們使用分段批量處理的方式 這樣可以提高程序的性能,防止內(nèi)存溢出。
1.每個(gè)sql語(yǔ)句都和數(shù)據(jù)庫(kù)交互一次(非批量操作)2.只和數(shù)據(jù)庫(kù)交互一次(批量操作)(內(nèi)存溢出)當(dāng)數(shù)據(jù)達(dá)到一定額度的時(shí)候就和數(shù)據(jù)庫(kù)進(jìn)行交互,分多次進(jìn)行(分段批量操作)
(500或者1000)pst.addBatch();if(i > 0 && i%1000 == 0){
pst.executeBatch();
pst.clearBatch();}
六、Oracle分頁(yè)
select * from(select * from(select s.*,rownum rn from student s)where rn<=5)where rn>0
七、Oracle的基本數(shù)據(jù)類型
Oracle的基本數(shù)據(jù)類型(常用):
1、字符型
Char 固定長(zhǎng)度字符串
占2000個(gè)字節(jié) Varchar2 可變長(zhǎng)度字符串 占4000個(gè)字節(jié)
Nvarchar2 占2000個(gè)字符(最多能存2000個(gè)字母/中文)
2、大對(duì)象型(lob)
Blob :二進(jìn)制數(shù)據(jù) 最大長(zhǎng)度4G Blob 用于存一些圖片,視頻,文件。
36
比如:當(dāng)我們?cè)谶M(jìn)行文件上傳時(shí),我們一般把上傳的文件存在硬盤上,可以不占用 數(shù)據(jù)庫(kù),下載時(shí),如果項(xiàng)目遷移時(shí),文件也要跟著遷移。因此我們可以把用blob把它存在數(shù)據(jù)庫(kù)中。但這樣也增加了數(shù)據(jù)庫(kù)的負(fù)擔(dān)。
Clob :字符數(shù)據(jù) 最大長(zhǎng)度4G,可以存大字符串
varchar2和nvarchar2都具有一定的局限性,它們長(zhǎng)度有限,但數(shù)據(jù)庫(kù)中無(wú)論用varchar2或nvarchar2類型,還是用clob,在java端都使用String接收。
3、數(shù)值型
Integer 整數(shù)類型,小的整數(shù)。Float 浮點(diǎn)數(shù)類型。Real 實(shí)數(shù)類型。
Number(p,s)包含小數(shù)位的數(shù)值類型。P表示精度,s表示小數(shù)后的位數(shù)。
Eg: number(10,2)表示小數(shù)點(diǎn)之前可有8位數(shù)字,小數(shù)點(diǎn)后有2位。
4、日期類型
Date 日期(日-月-年)DD-MM-YY(HH-MI-SS)Timestamp 跟date比 它可以精確到微秒。精確范圍0~9 默認(rèn)為6.八、id、rowid、rownum的區(qū)別
rowid物理位置的唯一標(biāo)識(shí)。
而id是邏輯上的唯一標(biāo)識(shí),所以rowid查找速度要快于id,是目前最快的定位一條記錄的方式
rowid和rownum都是”偽數(shù)列“ 所謂“偽數(shù)列”也就是默認(rèn)隱藏的一個(gè)數(shù)列。rownum用于標(biāo)記結(jié)果集中結(jié)果順序的一個(gè)字段,它的特點(diǎn)是按順序標(biāo)記,而且是連續(xù)的,換句話說(shuō)就是只有有rownum=1的記錄,才可能有rownum=2的記錄。rownum關(guān)鍵字只能和<或者<=直接關(guān)聯(lián) 如果是>或者=則需要給他起個(gè)別名
九、主鍵和唯一索引的區(qū)別?
在創(chuàng)建主鍵的同時(shí)會(huì)生成對(duì)應(yīng)的唯一索引,主鍵在保證數(shù)據(jù)唯一性的同時(shí)不允許為
空,而唯一可以有一個(gè)為空數(shù)據(jù)項(xiàng),一個(gè)表中只能有一個(gè)主鍵,但是一個(gè)主鍵可以
有多個(gè)字段,一個(gè)表中可以有多個(gè)唯一索引。
十、Preparedstatement和statement的區(qū)別
用Prepared statement進(jìn)行開發(fā)。Prepared statement是預(yù)編譯的,而statement不是,在每次執(zhí)行sql語(yǔ)句的增刪改時(shí),如果是一條數(shù)據(jù)兩者沒差距,但如果數(shù)據(jù)量大于1,那么每次執(zhí)行sql語(yǔ)句statement都要重新編譯一次,而Prepared statement不用,Prepared statement的運(yùn)行效率大于statement;從代碼的可維護(hù)性和可讀性來(lái)說(shuō),雖然
37
用Prepared statement來(lái)代替statement會(huì)使代碼多出幾行,但這樣的代碼無(wú)論從可讀性還是可維護(hù)性來(lái)說(shuō),都比直接使用statement的代碼高很多檔次;最重要的一點(diǎn),從安全角度來(lái)說(shuō),使用Prepared statement可以大大提高程序的安全性,因?yàn)镻repared statement是用???傳參,可以防止sql注入,具有安全性,而statement用的是?+?字符串拼接,安全性較低。
十一、數(shù)據(jù)庫(kù)三范式
第一范式:數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值。
第二范式:需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部
分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)
第三范式:需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)
十二、視圖概述
視圖可以視為“虛擬表”或“存儲(chǔ)的查詢”
創(chuàng)建視圖所依據(jù)的表稱為“基表”
視圖的優(yōu)點(diǎn):
提供了另外一種級(jí)別的表安全性:隱藏了一些關(guān)鍵的字段
簡(jiǎn)化的用戶的SQL命令
隔離基表結(jié)構(gòu)的改變
十三、存儲(chǔ)過程概述
存儲(chǔ)過程(Stored Procedure)
可以包含邏輯判斷的sql語(yǔ)句集合。
是經(jīng)過預(yù)編譯,存在于數(shù)據(jù)庫(kù)中。
通過調(diào)用指定存儲(chǔ)過程的名字(可有參,可無(wú)參)來(lái)執(zhí)行。優(yōu)點(diǎn):
簡(jiǎn)化了復(fù)雜的業(yè)務(wù)邏輯,根據(jù)需要可重復(fù)使用
屏蔽了底層細(xì)節(jié),不暴露表信息即可完成操作
降低網(wǎng)絡(luò)的通信量,多條語(yǔ)句可以封裝成一個(gè)存儲(chǔ)過程來(lái)執(zhí)行
設(shè)置訪問權(quán)限來(lái)提高安全性
提高執(zhí)行效率,因?yàn)樗穷A(yù)編譯以及存儲(chǔ)在數(shù)據(jù)庫(kù)中 缺點(diǎn):
可移植性差,相同的存儲(chǔ)過程并不能跨多個(gè)數(shù)據(jù)庫(kù)進(jìn)行操作
大量使用存儲(chǔ)過程后,首先會(huì)使服務(wù)器壓力增大,而且維護(hù)難度逐漸增加
存儲(chǔ)過程的語(yǔ)法:
--下面是在oracle數(shù)據(jù)庫(kù)下最基本的語(yǔ)法
38
--僅創(chuàng)建一個(gè)名為testProcedure 的無(wú)參的存儲(chǔ)過程--IS也可以是AS--如果已經(jīng)存在名為 testProcedure 的存儲(chǔ)過程,下面的語(yǔ)法會(huì)出現(xiàn) 名稱已被使用的錯(cuò)誤
--解決辦法:
--第一句可以寫成 create or replace procedure testProcedure--這樣會(huì)替換原有的存儲(chǔ)過程
--NULL表示任何可以正確執(zhí)行的sql 語(yǔ)句,但至少一句
create procedure testProcedure IS BEGIN
NULL
END;
存儲(chǔ)過程的參數(shù)的分類: IN OUT INOUT
注意:
存儲(chǔ)過程之間可相互調(diào)用
存儲(chǔ)過程一般修改后,立即生效。
十四、索引概述
1、索引的概念
索引就是為了提高數(shù)據(jù)的檢索速度。
數(shù)據(jù)庫(kù)的索引類似于書籍的索引。
在書籍中,索引允許用戶不必翻閱完整個(gè)書就能迅速地找到所需要的信息。
在數(shù)據(jù)庫(kù)中,索引也允許數(shù)據(jù)庫(kù)程序迅速地找到表中的數(shù)據(jù),2、索引的優(yōu)點(diǎn)
39 而不必掃描整個(gè)數(shù)據(jù)庫(kù).1.創(chuàng)建唯一性索引,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性
2.大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因
3.減少磁盤IO(向字典一樣可以直接定位)
3、索引的缺點(diǎn)
1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加
2.索引需要占用額外的物理空間
3.當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度
4、索引的分類
1.普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable(myclumn)
唯一性索引:保證在索引列中的全部數(shù)據(jù)是唯一的
CREATE unique INDEX mycolumn_index ON mytable(myclumn)
2.單個(gè)索引和復(fù)合索引
單個(gè)索引:對(duì)單個(gè)字段建立索引
復(fù)合索引:又叫組合索引,在索引建立語(yǔ)句中同時(shí)包含多個(gè)字段名,最多16個(gè)字段
CREATE INDEX name_index ON userInfo(firstname,lastname)
3.順序索引,散列索引,位圖索引
40
十五、必背的sql語(yǔ)句
1:oracle 分頁(yè)
select * from(select t.*, rownum rn from(select * from menu order by id desc)t where
rownum < 10)where rn >=5
2: mysql 分頁(yè)
select * from music where id limit 5,5
3:oracle中如何快速將一張表的數(shù)據(jù)復(fù)制到另外一張表中(另外一張表不存在,另外一張
表存在,但數(shù)據(jù)為空)
1、.不存在另一張表時(shí):
create table 新表
as select * from 將要復(fù)制的表
2、存在另一張表時(shí):
insert into 新表名
select 字段
from 將要復(fù)制的表名
4:音樂專輯
查詢出special
Select s.id , min(s.sname),count(m.mid)from special s inner
join ms m on s.id=m.id group by s.id
5:快速刪除一張表(不可事物回滾,也就是沒有日志記錄)
TRUNCATE from 表名
6:inner join
select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名
7:left join
左外連接
select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名
8:right join
右外連接
select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名
41
9:oracle中查詢遍歷樹形結(jié)構(gòu)(start with)
select * from extmenu
start with pid=1 connect by prior id = pid
快速刪除父節(jié)點(diǎn)以及父節(jié)點(diǎn)下的所有節(jié)點(diǎn): Delete from extmenu where id in(elect * from extmenu
start with pid=1 connect by prior id = pid)
10:查詢出來(lái)60-70,80-90,95-100學(xué)生的信息
select * from stu where chengji between 60 and 70 or between 80 and 90 or between 95 and 100 select * from stu where chengji > 60 and chengji < 70 or chengji > 80 and chengji < 90 or chengji > 95 and chengji < 100
11:用exists替換in------進(jìn)行聯(lián)表查詢
select * from dept where exists(select * from emp where emp.deptno=dept.deptno);或
select * from dept d inner join emp e on d.deptno = e.deptno(只查詢出兩表共同擁有的字段數(shù)據(jù))
12:刪除表中的重復(fù)數(shù)據(jù):
delete from xin a where a.rowid!=(select max(b.rowid)from xin b
where a.name = b.name);13:row_number(),rank()over,dense_rank()over 按工資排序
select sal,row_number()over(order by sal desc)rank1,rank()over(order by sal desc)rank,dense_rank()over(order by sal desc)drank
from emp
14:select * from(select emp.* from(dense_rank()over(partition by departNo order by sal desc)rk from emp)Where rk=4
42
十六、ibatis批量
this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){ public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
executor.startBatch();
for(int i = 0, n = list.size();i < n;i++){
executor.insert(”productAttach.insertProductAttach“,list.get(i));
}
executor.executeBatch();
return null;} });
ibatis,jdbc,hibernate的分段的實(shí)現(xiàn): 都應(yīng)該在組裝list的時(shí)候進(jìn)行拆分(如:action層加入)if(list.size()% 1000 == 0){ productAttachService.addBatch(list);list.clear();}
if(list.size()> 0)productAttachService.addBatch(list);
43
業(yè)務(wù)場(chǎng)景篇
一、Spring的概述
Spring 是完全面向接口的設(shè)計(jì),降低程序耦合性,主要是事務(wù)控制并創(chuàng)建bean實(shí)例對(duì)象。在ssh整合時(shí),充當(dāng)黏合劑的作用。
IOC(Inversion of Control)控制反轉(zhuǎn)/依賴注入,又稱DI(Dependency Injection)(依賴注入)
IOC的作用:產(chǎn)生對(duì)象實(shí)例,所以它是基于工廠設(shè)計(jì)模式的
Spring IOC的注入
通過屬性進(jìn)行注入,通過構(gòu)造函數(shù)進(jìn)行注入,注入對(duì)象數(shù)組
注入List集合 注入Map集合注入Properties類型
Spring IOC 自動(dòng)綁定模式:
可以設(shè)置autowire按以下方式進(jìn)行綁定
按byType只要類型一致會(huì)自動(dòng)尋找,按byName自動(dòng)按屬性名稱進(jìn)行自動(dòng)查找匹配.AOP 面向方面(切面)編程
AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是面向方面(切面)編程。
注:OOP(Object-Oriented Programming)面向?qū)ο缶幊?/p>
AOP 主要應(yīng)用于日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理(項(xiàng)目中使用的)等方面。
Spring中實(shí)現(xiàn)AOP技術(shù):
在Spring中可以通過代理模式來(lái)實(shí)現(xiàn)AOP
代理模式分為
靜態(tài)代理:一個(gè)接口,分別有一個(gè)真實(shí)實(shí)現(xiàn)和一個(gè)代理實(shí)現(xiàn)。
動(dòng)態(tài)代理:通過代理類的代理,接口和實(shí)現(xiàn)類之間可以不直接發(fā)生聯(lián)系,而
可以在運(yùn)行期(Runtime)實(shí)現(xiàn)動(dòng)態(tài)關(guān)聯(lián)。
動(dòng)態(tài)代理有兩種實(shí)現(xiàn)方式,可以通過jdk的動(dòng)態(tài)代理實(shí)現(xiàn)也可以通過cglib
來(lái)實(shí)現(xiàn)而AOP默認(rèn)是通過jdk的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)的。jdk的動(dòng)態(tài)代理必須要有
接口的支持,而cglib不需要,它是基于類的。
Spring AOP事務(wù)的描述:
在spring-common.xml里通過
如:對(duì)add* ,delete*,update*等開頭的方法進(jìn)行事務(wù)攔截。我們需 44
要配置事務(wù)的傳播(propagation=”REQUIRED“)特性,通常把增,刪,改以外的操作需要配置成只讀事務(wù)(read-only=”true“).只讀事務(wù)可以提高性能。之后引入tx:advice,在tx:advice引用 transactionManager(事務(wù)管理),在事務(wù)管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通過
Spring實(shí)現(xiàn)ioc控制反轉(zhuǎn)描述:
原來(lái)需要我們自己進(jìn)行bean的創(chuàng)建以及注入,而現(xiàn)在交給 spring容器去完成bean的創(chuàng)建以及注入。
所謂的“控制反轉(zhuǎn)”就是 對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。
官方解釋: 控制反轉(zhuǎn)即IoC(Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器,通過容器來(lái)實(shí)現(xiàn)對(duì)象組件的裝配和管理。
所謂的“控制反轉(zhuǎn)”概念就是對(duì)組件對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。
二、事務(wù)概述
在數(shù)據(jù)庫(kù)中,所謂事務(wù)是指一組邏輯操作單元即一組sql語(yǔ)句。當(dāng)這個(gè)單元中的一部分操作失敗,整個(gè)事務(wù)回滾,只有全部正確才完成提交。
事務(wù)的ACID屬性
1.原子性(Atomicity)
原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
2.一致性(Consistency)
事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。(數(shù)據(jù)不被破壞)
3.隔離性(Isolation)
事務(wù)的隔離性是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾.4.持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的.在JDBC中,45
事務(wù)默認(rèn)是自動(dòng)提交的,每次執(zhí)行一個(gè) SQL 語(yǔ)句時(shí),如果執(zhí)行成功,就會(huì)向數(shù)據(jù)庫(kù)自動(dòng)提交,而不能回滾
為了讓多個(gè) SQL 語(yǔ)句作為一個(gè)事務(wù)執(zhí)行:
(1)執(zhí)行語(yǔ)句前調(diào)用 Connection 對(duì)象的 setAutoCommit(false);
以取消自動(dòng)提交事務(wù)
(2)在所有的 SQL 語(yǔ)句都成功執(zhí)行后,調(diào)用 commit();方法提交事務(wù)(3)在出現(xiàn)異常時(shí),調(diào)用 rollback();方法回滾事務(wù)。
三、權(quán)限概述
權(quán)限涉及到5張表:
用戶表,角色表,權(quán)限表(菜單表),用戶角色關(guān)聯(lián)表,角色權(quán)限關(guān)聯(lián)表
當(dāng)用戶登錄時(shí),根據(jù)用戶名和密碼到用戶表驗(yàn)證信息是否合法,如果合法 則獲取用戶信息,之后根據(jù)用戶id再到用戶角色關(guān)聯(lián)表中得到相關(guān)連的角色
id集合,之后根據(jù)角色id再到角色權(quán)限關(guān)聯(lián)表中獲取該角色所擁有的權(quán)限id集合,然后再根據(jù)權(quán)限id集合到權(quán)限表(菜單表)中獲取具體的菜單,展現(xiàn)給當(dāng)前 登錄用戶,從而達(dá)到不同用用戶看到不同的菜單權(quán)限。
我們通過ZTree來(lái)給角色賦權(quán)并且通過ZTree來(lái)展示菜單,以及通過ZTree來(lái)管 理菜單即增加和編輯菜單。
我們做的權(quán)限控制到url級(jí)別,為了防止用戶不登錄直接輸入url訪問的這個(gè)弊端,通過攔截器進(jìn)行攔截驗(yàn)證。
四、OSCache業(yè)務(wù)場(chǎng)景
在我以前的項(xiàng)目中,我們考慮了系統(tǒng)性能問題,這個(gè)時(shí)候我們采用了Oscache緩存,剛開始把這個(gè)功能交給了項(xiàng)目組中的另外一個(gè)同事來(lái)做的,但是他做完的時(shí)候他發(fā)現(xiàn)緩存中明明已經(jīng)緩存了數(shù)據(jù),但是在取得時(shí)候發(fā)現(xiàn)沒有數(shù)據(jù),我們項(xiàng)目經(jīng)理讓我去幫忙看看這個(gè)問題,我閱讀完他的代碼之后,我發(fā)現(xiàn)了他每次緩存的時(shí)候都是調(diào)用一個(gè)新的緩存對(duì)象的方法,結(jié)果出現(xiàn)了明明已經(jīng)走了緩存的方法而取不到數(shù)據(jù)的問題,通過我多年的工作經(jīng)驗(yàn),我就想到了應(yīng)該用單例模式去封裝一個(gè)單例工具類來(lái)調(diào)用oscache。但是,在后來(lái)的測(cè)試過程中,發(fā)現(xiàn)當(dāng)并發(fā)訪問的時(shí)候也會(huì)出現(xiàn)上述的問題,這個(gè)時(shí)候我直接采取的DCL(雙重判定鎖)單例模式封裝了工具類,既解決了線程安全問題,相對(duì)的性能問題也考慮到了,這個(gè)問題才得到了完善的解決。
46
五、線程概述
線程的狀態(tài)以及狀態(tài)之間的相互轉(zhuǎn)換:
1、新建狀態(tài)(New):新創(chuàng)建了一個(gè)線程對(duì)象。
2、就緒狀態(tài)(Runnable):線程對(duì)象創(chuàng)建后,其他線程調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。
3、運(yùn)行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
4、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因?yàn)槟撤N原因放棄CPU使用權(quán),暫時(shí)停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種:
(一)、等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,JVM會(huì)把該線程放入等待池中。
(二)、同步阻塞:運(yùn)行的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則JVM會(huì)把該線程放入鎖池中。
(三)、其他阻塞:運(yùn)行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、或者I/O處理完畢時(shí),線程重新轉(zhuǎn)入就緒狀態(tài)。
5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
實(shí)現(xiàn)線程的兩種方式:
是繼承Thread類或?qū)崿F(xiàn)Runnable接口,但不管怎樣,當(dāng)new了這個(gè)對(duì)象后,線程就已經(jīng)進(jìn)入了初始狀態(tài) wait和sleep的區(qū)別:
線程訪問:
鎖池狀態(tài),之后等待鎖釋放,然后訪問代碼
wait
等待隊(duì)列(釋放資源)--->調(diào)用notify或者notifyall之后鎖池狀態(tài)--->(等待鎖釋放)--->可運(yùn)行狀態(tài)--->運(yùn)行狀態(tài)---->訪問代碼
sleep,join
不釋放資源-->結(jié)束后直接進(jìn)入可運(yùn)行狀態(tài)--->運(yùn)行狀態(tài)---->訪問代碼
一個(gè)java控制臺(tái)程序,默認(rèn)運(yùn)行兩個(gè)線程,一個(gè)主線程,一個(gè)垃圾回收線程。線程與進(jìn)程的區(qū)別:
1.線程(Thread)與進(jìn)程(Process)進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊界,通常來(lái)說(shuō)一個(gè)進(jìn)程就代表一個(gè)與之對(duì)應(yīng)
的應(yīng)用程序。不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而同一進(jìn)程的不同線程可以共
享代碼和數(shù)據(jù)空間。
2.一個(gè)進(jìn)程可以包括若干個(gè)線程,同時(shí)創(chuàng)建多個(gè)線程來(lái)完成某項(xiàng)任務(wù),便是多線程。
六、Ajax請(qǐng)求Session超時(shí)問題
我在做項(xiàng)目時(shí)有時(shí)會(huì)遇到session超時(shí)問題,如果session超時(shí),平常請(qǐng)求沒有什么問題,通過攔截器可以正確跳到登陸頁(yè)面,可是你如果用ajax請(qǐng)求的話這就出現(xiàn)問題了,因?yàn)閍jax是異步的,局部刷新,所以登陸界面不會(huì)再全頁(yè)面中顯示,他只會(huì)顯示到頁(yè)面的一部分當(dāng)中。所以根據(jù)我這幾年的經(jīng)驗(yàn)找到了我認(rèn)為比較好的一種方法。因?yàn)槟俏矣玫目蚣苁呛蛃truts2集成的,所以就在攔截器中進(jìn)行設(shè)置:
47
首先判斷session是否為空就是判斷session是否超時(shí),如果超時(shí)就取出請(qǐng)求的head頭信息request.getHeader(”x-requested-with“),如果不為空就和XMLHttpRequest(Ajax標(biāo)識(shí))進(jìn)行比較(request.getHeader(”x-requested-with“).equalsIgnoreCase(”XMLHttpRequest“)))如果相等說(shuō)明此請(qǐng)求是ajax請(qǐng)求。
如果是ajax請(qǐng)求就可以用response.setHeader(”鍵“,”值“)來(lái)設(shè)置一個(gè)標(biāo)識(shí)來(lái)告訴用戶這是ajax請(qǐng)求并且session超時(shí)時(shí)發(fā)出的,這樣我就可以在回調(diào)函數(shù)中取出自己設(shè)置的那個(gè)唯一標(biāo)識(shí):XMLHttpRequest.getResponseHeader(”“);如果取出的值是和自己在后臺(tái)中設(shè)置的值一樣的話,就證明session已經(jīng)超時(shí),這樣就可以設(shè)置window.location.replace(”登陸界面"),來(lái)跳轉(zhuǎn)到登陸界面了。
這樣做雖然解決了問題,但是,會(huì)在每個(gè)回調(diào)函數(shù)中寫入那些代碼,這樣的話代碼就會(huì)顯得特別零散,所以就想能不能定義一個(gè)全局的設(shè)置所以就找到了jqery的ajaxSetUp方法,通過ajaxSetUp對(duì)jqery的ajax進(jìn)行全局的判斷(ajaxSetUp就相當(dāng)于ajax的攔截器),通過設(shè)置ajaxSetUp里的complete,它就相當(dāng)于回調(diào)函數(shù),這樣那就彌補(bǔ)了上一方法的不足。我做項(xiàng)目時(shí)還用到$(document).ajaxStart(),這是ajax請(qǐng)求時(shí)的事件;$(document).ajaxSuccess(),這是AJAX請(qǐng)求成功后的事件。我一般用他們來(lái)顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓用戶重復(fù)提交,更提高了用戶體驗(yàn)度,讓用戶知道已經(jīng)提交了。
七:java線程池概述
java線程池的工作原理和數(shù)據(jù)庫(kù)連接池的差不多,因?yàn)槊看沃匦聞?chuàng)建線程 都是很耗資源的操作,所以我們可以建立一個(gè)線程池,這樣當(dāng)需要用到線程 進(jìn)行某些操作時(shí),就可以直接去線程池里面找到空閑的線程,這樣就可以直接 使用,而不用等到用到的時(shí)候再去創(chuàng)建,用完之后可以把該線程重新放入線程池 供其他請(qǐng)求使用從而提高應(yīng)用程序的性能。
線程池的核心流程: 1.構(gòu)建一個(gè) ThreadPoolExecutor 并指定默認(rèn)要?jiǎng)?chuàng)建的線程的數(shù)量 2.通過 threadPool.execute()去添加一個(gè)個(gè)要執(zhí)行的線程即實(shí)現(xiàn)了Runable接口的java類
3.在實(shí)現(xiàn)了Runable接口的java類的run方法中寫入具體的業(yè)務(wù)代碼 線程池的業(yè)務(wù)場(chǎng)景:
我在工作的時(shí)候,當(dāng)時(shí)一個(gè)同事給我提了一個(gè)需求,目前有大量的圖片 需要處理生產(chǎn)縮略圖并進(jìn)行加水印,因?yàn)榘凑掌胀ǖ奶幚矸椒ㄒ粋€(gè)個(gè)的 進(jìn)行處理太慢了,問我有沒有好的解決方案,這個(gè)時(shí)候我就想到了java中 的線程池,我構(gòu)建了一個(gè)線程數(shù)為5個(gè)線程池,然后采用分段批量提取的
方式每500條為一組數(shù)據(jù)進(jìn)行圖片信息的提取,然后再把這些通過Threadpool的 execute方法交給線程池中的線程進(jìn)行處理,即充分使用了CPU硬件資源又加快 了大數(shù)據(jù)情況下程序的處理效率。
48
我當(dāng)時(shí)在工作的過程中,認(rèn)識(shí)一個(gè)做電商的朋友,他們當(dāng)時(shí)公司才起步,很多 技術(shù)都不成熟,所以就常常和我探討一些技術(shù)問題,有次他向我請(qǐng)教一個(gè)問題,問我如何才能提高網(wǎng)站的性能,我根據(jù)自己在項(xiàng)目中的經(jīng)驗(yàn)以及自己以前閱讀的
關(guān)于優(yōu)化方面的資料給他提出了很多建議,如用lucene進(jìn)行全文檢索,用memcached 進(jìn)行分布式緩存,以及通過spring定時(shí)器結(jié)合freeMarker模板引擎來(lái)生成靜態(tài) 頁(yè)面,由于要生成的頁(yè)面的數(shù)量比較多,考慮到程序的性能,我建議他結(jié)合 java的線程池進(jìn)行工作,這樣就可以充分使用了CPU硬件資源又加快 了大數(shù)據(jù)情況下程序的處理效率。
八、OSCache概述
oscache是一個(gè)高性能的j2ee框架,可以和任何java代碼進(jìn)行集成,并且還可以通過標(biāo)簽對(duì)頁(yè)面內(nèi)容進(jìn)行緩存,還以緩存請(qǐng)求。
我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進(jìn)行緩存。為了保證緩存數(shù)據(jù)的有效性,在數(shù)據(jù)發(fā)生改變的時(shí)候,我們要刷新緩存,避免臟數(shù)據(jù)的出現(xiàn)。刷新緩存的策略有兩種,一種是定時(shí)刷新,一種手動(dòng)刷新。
緩存數(shù)據(jù)的時(shí)機(jī)通常也分為兩種,即在tomcat(web容器)啟動(dòng)時(shí)候加載數(shù)據(jù)進(jìn)行緩存,另外也可以在用戶第一次訪問數(shù)據(jù)的時(shí)候進(jìn)行緩存,這個(gè)相當(dāng)于緩存的立即加載和按需加載。
緩存的層次如下:jsp-->action-->service-->dao,緩存越靠前對(duì)性能的提升越大
一個(gè)action里面可以有多個(gè)service,一個(gè)service中可以有多個(gè)dao或者多個(gè)service
任何類之間都可以進(jìn)行相互調(diào)用,可以通過構(gòu)造函數(shù)傳參,set,get傳參或者是方法傳
參將相關(guān)的類連接起來(lái)。
九、OSCache+autocomplete+單例業(yè)務(wù)場(chǎng)景
在我以前做某項(xiàng)目的過程中,其中我們?cè)谧霎a(chǎn)品列表的查詢的時(shí)候?yàn)榱颂岣哂脩舻捏w驗(yàn)度,我們使用了autocomplete插件來(lái)代替select進(jìn)行品牌的選擇,才開始的時(shí)候每次都要根據(jù)用戶輸入的信息去查詢數(shù)據(jù)庫(kù)進(jìn)行模糊匹配返回結(jié)果,后來(lái)我們考慮到系統(tǒng)的性能,因此我們采用了oscache緩存,才開始這個(gè)功能是交給我們項(xiàng)目組中的另外一個(gè)同事來(lái)做的,但是他做完后,我們?cè)谑褂眠@個(gè)工具類的時(shí)候,發(fā)現(xiàn)有時(shí)緩存中明明已經(jīng)有時(shí)我們需要的數(shù)據(jù),但是從緩存里面取的時(shí)候,發(fā)現(xiàn)沒有,之后項(xiàng)目經(jīng)理讓我去幫這個(gè)同事看看這個(gè)問題,我經(jīng)過閱讀他的代碼發(fā)現(xiàn),它里面在使用緩存的時(shí)候,針對(duì)于每次方法的調(diào)用都產(chǎn)生一個(gè)新的實(shí)例,結(jié)果導(dǎo)致了上面的問題,這個(gè)時(shí)候我想起了可以使用設(shè)計(jì)模式中的單例模式來(lái)解決這個(gè)問題,才開始我直接采用了普通的單列模式,但是后來(lái)在測(cè)試的過程中,發(fā)現(xiàn)當(dāng)用戶并發(fā)量大的時(shí)候還是會(huì)出現(xiàn)上面的問題,之后我再次考慮了代碼,最后發(fā)現(xiàn)是因?yàn)闆]有給單列模式加鎖的原因,從而導(dǎo)致了大用戶并發(fā)的時(shí)候,線程安全的問題,之后我便在方法上加上了synchronized關(guān)鍵字,解決上述的問題,但是后來(lái)測(cè)試人員反饋,覺的這段的性能有問題,我考慮之后便采用在方法體內(nèi)加鎖并結(jié)合雙重判定的方式解決了上面的問題。
49
我們是將數(shù)據(jù)在tomcat啟動(dòng)的時(shí)候加載到緩存中,之后用戶進(jìn)行查詢的時(shí)候直接從緩存中獲取數(shù)據(jù),根據(jù)前綴匹配進(jìn)行查詢,將結(jié)果返回給用戶。這樣在提高用戶體驗(yàn)度的同時(shí)也提高性能。
十、緩存概述
應(yīng)用程序?yàn)榱颂岣咝阅?,可以通過使用緩存來(lái)達(dá)到目的,緩存的存儲(chǔ)介質(zhì)可以 內(nèi)存或者硬盤,通常將數(shù)據(jù)存儲(chǔ)在內(nèi)存里,確切的說(shuō)是jvm的內(nèi)存中,緩存是 基于Map這種思想構(gòu)建的,以鍵值對(duì)的方式進(jìn)行存取,之所以還可以將
緩存的數(shù)據(jù)存儲(chǔ)在硬盤中,是因?yàn)閮?nèi)存資源相當(dāng)有限和寶貴,所以當(dāng)內(nèi)存資源 不足的時(shí)候,就可以將其存儲(chǔ)到硬盤中,雖然硬盤的存取速度比內(nèi)存要慢,但是 因?yàn)闇p少了網(wǎng)絡(luò)通信量,所以還是提高程序的性能。緩存可以分為客戶端緩存和 服務(wù)器端緩存,所謂的客戶端緩存通常指的是IE瀏覽器的緩存,服務(wù)器端緩存指 的web服務(wù)器的緩存,通??梢酝ㄟ^第三方組件實(shí)現(xiàn),如oscache,memcache
我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進(jìn)行緩存。為了保證緩存數(shù)據(jù)的 有效性,在數(shù)據(jù)發(fā)生改變的時(shí)候,我們要刷新緩存,避免臟數(shù)據(jù)的出現(xiàn)。刷新緩存的 策略有兩種,一種是定時(shí)刷新,一種手動(dòng)刷新。
緩存的層次如下:jsp-->action-->service(通常放置在service)-->dao, 緩存越靠前對(duì)性能的提升越大
緩存的策略:(緩存空間不足需要進(jìn)行清理的時(shí)候使用)LRU:最近最少使用原則.(理解:存儲(chǔ)書)FIFO:先進(jìn)先出的緩存策略.(理解:排隊(duì))
你來(lái)說(shuō)說(shuō)緩存?說(shuō)說(shuō)你對(duì)緩存的理解(如果遇到重復(fù)的,就可以省略)
我們?cè)陧?xiàng)目中使用緩存的目的是為了提高應(yīng)用程序的性能,減少訪問數(shù)據(jù)庫(kù) 的次數(shù),從而提高應(yīng)用程序的吞吐量。我們通常將權(quán)限,菜單,組織機(jī)構(gòu)
這些頻繁訪問但是不經(jīng)常改變的基礎(chǔ)數(shù)據(jù)進(jìn)行緩存,其中我在做()某某項(xiàng)目的時(shí)候 就通過oscache對(duì)ZTree的樹形菜單進(jìn)行了緩存,并且在做的時(shí)候和單列設(shè)計(jì) 模式進(jìn)行結(jié)合,考慮到多線程下的安全問題,還對(duì)單例模式加入了雙重判定鎖 的檢查方式。
十一、實(shí)現(xiàn)頁(yè)面靜態(tài)化業(yè)務(wù)場(chǎng)景
我們?cè)谧瞿稠?xiàng)目時(shí),涉及到程序訪問的性能問題,這時(shí)候我們想到可以通過靜態(tài)化來(lái)提高用戶訪問時(shí)候的性能,所以我們就采用了freemarker模板引擎,考慮到頁(yè)面也是要有動(dòng)態(tài)的變化的,所以我們采用spring定時(shí)器在每天晚上2點(diǎn)鐘的時(shí)候定時(shí)再次生成html靜態(tài)
50
第二篇:JAVA基礎(chǔ)知識(shí)點(diǎn)總結(jié)
1)開發(fā)Java語(yǔ)言的公司? Sun(Sun Microsystems)太陽(yáng)微電子公司開發(fā) 2)
Java的3個(gè)版本?
J2SE(Java2 Standard Edition)標(biāo)準(zhǔn)版
J2EE(Java 2 Platform,Enterprise Edition)企業(yè)版 J2ME(Java 2 Micro Edition)微小版
在5.0以后新版本中稱作:JavaSE JavaEE JavaME 3)
Java語(yǔ)言的幾個(gè)主要特點(diǎn)?平臺(tái)無(wú)關(guān)性:能運(yùn)行于不同的平臺(tái)上
安全性:去掉了指針操作,內(nèi)存由操作系統(tǒng)分配 面向?qū)ο螅豪妙愂钩绦蚋永诰S護(hù)
分布式:可以使用網(wǎng)絡(luò)文件和使用本機(jī)文件一樣容易 健壯性:檢查程序編譯和運(yùn)行的錯(cuò)誤 4)
Java的三大核心機(jī)制
虛擬機(jī)機(jī)制:利用虛擬機(jī)解釋字節(jié)碼執(zhí)行java程序?qū)崿F(xiàn)跨平臺(tái) 垃圾收集機(jī)制:自動(dòng)內(nèi)存回收
代碼安全性機(jī)制:加載代碼后校驗(yàn)代碼后再執(zhí)行代碼 第2章Java語(yǔ)言的開發(fā)環(huán)境 1)
JDK是什么?
JDK(Java Development Kit)Java開發(fā)工具包。包括了JRE,是開發(fā)Java的人員必備的開發(fā)運(yùn)行Java程序的工具。2)
JRE是什么?
JRE(Java Runtime Environment)Java運(yùn)行環(huán)境,運(yùn)行JAVA程序所必須的環(huán)境的集合,包含JVM標(biāo)準(zhǔn)實(shí)現(xiàn)及Java核心類庫(kù)。3)
JVM是什么?
JVM(Java Virtual Machine)Java虛擬機(jī),它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。4)
安裝JDK的操作系統(tǒng)問題?
必須針對(duì)于不同的操作系統(tǒng)下載安裝不同的JDK,例如windows下安裝針對(duì)于windows的JDK,linux下安裝針對(duì)于linux的JDK。
5)需要配置的相關(guān)環(huán)境變量? path:用于搜索外部命令,例如編譯程序的javac命令,執(zhí)行程序的java命令
classpath:用于搜索類,即class文件,例如可以在不同的位置執(zhí)行類文件 6)
配置環(huán)境變量的方式? 有兩種:臨時(shí)配置和持久配置
臨時(shí)配置:在命令行下用set 變量名=變量值,僅在當(dāng)前命令行窗口有效
持久配置:在我的電腦——屬性中配置,持久有效 7)可以編寫Java程序的常見開發(fā)工具? 記事本,EditPlus,ULTRAEDIT,Eclipse,Jbuilder,NetBeans 8)
Java文件的類型?
有兩種:
擴(kuò)展名為java的文件:是Java源文件,屬于編譯之前的純文本文件,存儲(chǔ)java源代碼。
擴(kuò)展名為class的文件:是Java類文件,屬于編譯之后的二進(jìn)制文件,存儲(chǔ)字節(jié)碼。9)
Java的編譯運(yùn)行原理?
首先編寫java源文件,然后編譯成class類文件,然后通過虛擬機(jī)解釋成機(jī)器碼到硬件執(zhí)行。
10)Java是編譯型語(yǔ)言還是解釋型的語(yǔ)言?
既不是完全編譯型,也不是完全解釋型,是半編譯半解釋的。第3章Java程序的基本結(jié)構(gòu) 1)
Java語(yǔ)言區(qū)分大小寫嗎?
區(qū)分,不管是數(shù)據(jù)還是標(biāo)識(shí)符或者關(guān)鍵字都區(qū)分大小寫,例如public不能寫成Public,“abc”不能寫成“ABC”,int i不能寫成INT I等等。2)main方法是作什么用處的? 這是程序的入口方法,是由虛擬機(jī)自動(dòng)調(diào)用的。
3)語(yǔ)句必須用分號(hào)結(jié)束嗎? 必須的,但是代碼塊{}可以用分號(hào)結(jié)束,也可以不用分號(hào)結(jié)束
4)
Java中有幾種注釋,各自的功能
有三種:
單行注釋//:加在行首只能注釋一行 多行注釋/* */:注釋多行,但不能嵌套使用
文檔注釋/***/:用于生成HTML形式的文檔,需要配合javadoc命令實(shí)現(xiàn) 5)Java語(yǔ)言的數(shù)據(jù)類型是強(qiáng)類型還是弱類型? 是強(qiáng)類型,意味著每一個(gè)變量都必須明確聲明數(shù)據(jù)類型。6)
Java語(yǔ)言中數(shù)據(jù)類型的劃分?有什么區(qū)別? 分成基本類型和引用類型兩大類。
基本類型:有8種,只能存儲(chǔ)單一的值,不以對(duì)象的形式存在引用類型:除了基本類型之外其他的都是引用類型,能夠存儲(chǔ)復(fù)雜數(shù)據(jù)類型,以對(duì)象的形式存在 7)
基本類型都有哪8種類型? 布爾類型:boolean 占1字節(jié) 字符類型:char 占2字節(jié)
整型:byte 占1字節(jié) short 占2字節(jié) int 占4字節(jié) long 占8字節(jié)
浮點(diǎn)型:float 占4字節(jié)double 占8字節(jié) 8)
布爾值可不可以用0或者非0數(shù)代替?
不可以,布爾值只能是true和false,不能使用數(shù)字,這和C語(yǔ)言是不一樣的。9)
直接寫個(gè)整數(shù)10默認(rèn)是什么類型的?
整型的直接量例如10,100等默認(rèn)的數(shù)據(jù)類型都是int型 10)如何讓一個(gè)整型的直接量變成long型的? 在直接量后面加大寫L后者小寫l,例如10L 11)整型數(shù)據(jù)在程序中直接使用可以使用什么進(jìn)制? 10進(jìn)制,8進(jìn)制,16進(jìn)制,但不能使用二進(jìn)制 12)浮點(diǎn)運(yùn)算在Java中有沒有誤差? 有誤差,所以精密運(yùn)算請(qǐng)使用BigDecimal類 13)直接寫一個(gè)3.14的直接量是什么數(shù)據(jù)類型的?
是double型,如果想表示是float的3.14必須寫成3.14F或者3.14f,double型的3.14也可以寫成3.14D 14)char型采取的是什么類型的字符集?
是Unicode全球統(tǒng)一編碼,支持任何世界上官方的語(yǔ)言中的字符
15)常見的轉(zhuǎn)義字符有哪些? 轉(zhuǎn)義序列 名稱 b 退格 t 制表 n 換行 r
回車
” 雙引號(hào) ’ 單引號(hào) 反斜杠
16)常見的Unicode字符對(duì)應(yīng)的編碼?
大寫的A到Z是對(duì)應(yīng)65到90,小寫的a到z是對(duì)應(yīng)97到122,字符0到9是對(duì)應(yīng)48到57
17)空字符是不是用’’(兩個(gè)并列的單引號(hào))來(lái)表示? 不是,空字符用’u0000’來(lái)表示,兩個(gè)并列的單引號(hào)什么也不是。
18)點(diǎn),分號(hào),花括號(hào)的各自的作用?
點(diǎn)的作用有兩個(gè):一個(gè)是使用類或?qū)ο笾械某蓡T,用對(duì)象.成員,再一個(gè)就是包名和子包名之間的分隔符,例如頂層包名.子包名 分號(hào)的作用是表示語(yǔ)句結(jié)束 花括號(hào)的作用是代表一個(gè)語(yǔ)句塊
19)語(yǔ)句和關(guān)鍵字之間可以有任意的空白嗎? 可以的,例如System.out.println(100);就是正確的語(yǔ)句,但是關(guān)鍵字本身不能加空白或換行
20)標(biāo)識(shí)符是什么?
標(biāo)識(shí)符就是指在程序中給包,類,接口,方法,變量起的名字 21)標(biāo)識(shí)符有什么起名規(guī)則? 1. 應(yīng)以字母、下劃線、美元符開頭 2. 后跟字母、下劃線、美元符或數(shù)字 3. 不能用關(guān)鍵字和保留字
4. 嚴(yán)格區(qū)分大小寫 5. 名稱長(zhǎng)度沒有限制 22)中文的變量名可以嗎?
是可以的,例如 int 數(shù)字 = 10;這個(gè)語(yǔ)句是正確的。因?yàn)閖ava中采取Unicode字符集,所以任何的Unicode中的字符都可以作為標(biāo)識(shí)符的名稱,但考慮字符集的支持問題推薦還是使用英文字母命名。
23)關(guān)鍵字和保留字有區(qū)別嗎?
在1.5后沒有區(qū)別,都被稱作關(guān)鍵字,但是1.5之前認(rèn)為關(guān)鍵字是在Java中有特殊用途的不允許編程人員擅自改作其他用途,而保留字是在Java中沒有特殊用途但不允許編程人員擅自改作其他用途,按此說(shuō)法goto和const應(yīng)該是此意義上的保留字。
24)true,false,null可以用作標(biāo)識(shí)符命名嗎?
不可以,這3個(gè)雖然不是關(guān)鍵字,但都是有特殊用途的值,也不能作為標(biāo)識(shí)符命名
25)一條聲明語(yǔ)句可以聲明多個(gè)變量嗎? 可以的,例如以下聲明都是正確的int i;int i,j;int i = 10,j;int i,j = 10;
int i = 10,j = 20;
26)變量在沒有賦值的情況下可以使用嗎?
不可以,變量沒有賦值使用會(huì)報(bào)出變量未初始化的編譯錯(cuò)誤。27)常量有什么特點(diǎn)?
在聲明變量的時(shí)候加上final修飾符即為常量,表示這個(gè)變量只能被賦一次值。
28)算數(shù)運(yùn)算符有哪些? 基本算數(shù)運(yùn)算符有+-* / % ++--
29)單目運(yùn)算符,雙目運(yùn)算符,三目運(yùn)算符都是什么意思? 其實(shí)也有叫一元運(yùn)算符,雙元操作符,三元操作符的,指的是
有幾個(gè)操作數(shù)形成一個(gè)完整表達(dá)式,例如++就是一個(gè)單目運(yùn)算符,只需要一個(gè)操作數(shù)就可以形成表達(dá)式,像i++,而+運(yùn)算符就是雙目運(yùn)算符,需要兩個(gè)操作數(shù)形成表達(dá)式,例如5 + 3,還有三目運(yùn)算符,例如5 > 3 ? 0 :-1
30)++和--放在前面和放在后面有什么區(qū)別?
如果是在一個(gè)表達(dá)式中,那++放后面表示先運(yùn)算表達(dá)式,然后再進(jìn)行自增運(yùn)算,如果在一個(gè)表達(dá)式中,++放前面,則表示先進(jìn)行自增運(yùn)算然后在運(yùn)算表達(dá)式。--同樣道理。例如: int i = 10;int j = i ++;//先進(jìn)行賦值運(yùn)算然后再進(jìn)行自增運(yùn)算j的結(jié)果是10
int i = 10;
int j = ++ i;//先進(jìn)行自增運(yùn)算然后再進(jìn)行賦值運(yùn)算
j的結(jié)果是11
31)-5 % 2等于幾,5 %-2等于幾?
-5 % 2等于-1,5%-2等于1,運(yùn)算得到是正數(shù)還是負(fù)數(shù)取決于第一個(gè)操作數(shù)的符號(hào) 32)5 / 2 結(jié)果是不是2.5?
不是,是2,因?yàn)?和2都是int類型,所以不可能得到double型的結(jié)果。
33)比較運(yùn)算符有哪些?
有><>=<===!= 六項(xiàng)基本比較運(yùn)算 34)任何數(shù)據(jù)類型都可以使用> < >= <=運(yùn)算符嗎?
不是所有數(shù)據(jù)類型,例如true>false這個(gè)表達(dá)式就是編譯錯(cuò)誤,布爾類型和引用類型的表達(dá)式只能用==和!=兩個(gè)比較運(yùn)算,例如”abc” <= ”xyz” 這個(gè)表達(dá)式也是編譯錯(cuò)誤的 35)’a’ > ’b’這個(gè)表達(dá)式編譯正確嗎?
編譯正確,’a’和’b’是字符類型,內(nèi)部用Unicode編碼表示的話a是97,b是98,所以實(shí)際上比較的是97>98,結(jié)果為false 36)邏輯運(yùn)算符有哪些?
有 &邏輯與,|邏輯或,!邏輯非,^ 異或,&& 短路與,||短路或
37)邏輯與,邏輯或和短路與,短路或有什么區(qū)別? 邏輯與和短路與的區(qū)別是: ?
如果是邏輯與&,不管第一個(gè)表達(dá)式是true還是false,都會(huì)執(zhí)行第二個(gè)表達(dá)式,例如a > b & x < y,即使a > b為false,也會(huì)執(zhí)行x > y ?
如果是短路與&&,如果第一個(gè)表達(dá)式為false,將不會(huì)執(zhí)行第二個(gè)表達(dá)式
例如a > b && x < y,如果a > b為false,就不會(huì)執(zhí)行x > y
以此類推,邏輯或和短路或的區(qū)別是:
? 如果是邏輯或|,不管第一個(gè)表達(dá)式是true還是false,都會(huì)執(zhí)行第二個(gè)表達(dá)式 ?
如果是短路或||,如果第一個(gè)表達(dá)式為true,將不會(huì)執(zhí)行
第二個(gè)表達(dá)式
38)與或非三個(gè)邏輯運(yùn)算符的優(yōu)先級(jí)是怎么排列的? “非”優(yōu)先級(jí)最高,“與”其次,“或”優(yōu)先級(jí)最低 39)原碼,反碼,補(bǔ)碼分別是什么意思? ?
原碼:將數(shù)字轉(zhuǎn)換為二進(jìn)制,第一位為符號(hào)位,正數(shù)為0,負(fù)數(shù)為1
例如:12的原碼是00001100-12的原碼是10001100 ?
反碼:正數(shù)的反碼和原碼相同,負(fù)數(shù)的反碼將原碼符號(hào)位之外的位逐位取反
例如:12的反碼是00001100-12的反碼是11110011 ?
補(bǔ)碼:正數(shù)的補(bǔ)碼和原碼相同,負(fù)數(shù)的補(bǔ)碼將反碼加1 例如:12的補(bǔ)碼是00001100-12的補(bǔ)碼是11110100 最后強(qiáng)調(diào)一點(diǎn),計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)用補(bǔ)碼形式來(lái)存儲(chǔ)。40)位運(yùn)算符都有哪些?
&與 |或 ^異或 ~非 >>右移 <<左移 >>>無(wú)符號(hào)右移 41)1<<35怎么理解?
1是int類型是32位,所以需要把35%32=3,所以事實(shí)上是和執(zhí)行1<<3等價(jià)的42)數(shù)據(jù)類型轉(zhuǎn)換需要遵循什么原則?
小類型向大類型轉(zhuǎn)換,是自動(dòng)轉(zhuǎn)換的,或者說(shuō)隱式轉(zhuǎn)換的 大類型向小類型轉(zhuǎn)換,是需要強(qiáng)制轉(zhuǎn)換的,或者說(shuō)顯式轉(zhuǎn)換例如:byte b = 1;
short s = b;//自動(dòng)轉(zhuǎn)換
b =(byte)s;//強(qiáng)制轉(zhuǎn)換
43)byte b = 10這個(gè)語(yǔ)句是正確的,為什么10是int型比byte大還不需要強(qiáng)制轉(zhuǎn)換呢?
因?yàn)樵趈ava中做了特殊處理,其中規(guī)定byte,short,char類型可以直接賦予int類型的直接量,例如: byte b = 10;short s = 10;char c = 10;
以上賦值語(yǔ)句都是正確的。
但是不能超出超出類型的范圍,例如以下賦值就是錯(cuò)誤的: byte b = 128;
如果超出范圍,必須得作強(qiáng)制轉(zhuǎn)換,例如以下語(yǔ)句是正確的: byte b =(byte)128;
需要強(qiáng)調(diào)的是,必須是int類型的直接量,以下語(yǔ)句就是錯(cuò)誤的: byte b = 10L;
10L不是int類型的直接量。
44)byte b =(byte)300;強(qiáng)制轉(zhuǎn)換后的結(jié)果是44,是按照什么規(guī)律得出來(lái)的?
是先把300轉(zhuǎn)換成二進(jìn)制,然后根據(jù)byte類型的大小截取了后8個(gè)位
300的補(bǔ)碼是00000000 00000000 00000001 00101100
b的結(jié)果是:00000000 00000000 00000001 00101100 結(jié)果為44 45)byte b =(byte)true;這個(gè)轉(zhuǎn)換成立嗎?
不成立,布爾值和數(shù)字是不兼容的,不能作任何轉(zhuǎn)換。
46)int i =(int)“100”;這個(gè)轉(zhuǎn)換成立嗎?
不成立,引用類型和基本類型是不能直接強(qiáng)制轉(zhuǎn)換的,需要用包裝類的方法來(lái)轉(zhuǎn)換。
47)char型和short型哪個(gè)比較大?
不能說(shuō)哪個(gè)大,哪個(gè)小,這兩個(gè)類型char的取值是從0~65535,而short類型的取值是-32768~32767,這個(gè)兩個(gè)類型之間的轉(zhuǎn)換都需要強(qiáng)制轉(zhuǎn)換。
48)字符串是不是基本類型?
不是,String是java.lang包中的一個(gè)類,是引用類型的,8種基本類型中沒有一個(gè)是String類型。49)空字符串用什么來(lái)表示?
用””(兩個(gè)并列的雙引號(hào))表示,代表0個(gè)長(zhǎng)度的字符串對(duì)象。50)String s = “”;和String s = null;有什么區(qū)別?
第一個(gè)表示s被賦值,指向了一個(gè)字符串對(duì)象,第二個(gè)表示s沒有指向任何對(duì)象實(shí)例,是真空
51)兩個(gè)字符串用什么運(yùn)算符可以連成一個(gè)字符串? 用+運(yùn)算符,例如”abc” + “xyz”最后的結(jié)果就是“abcxyz” 52)數(shù)學(xué)運(yùn)算符加法和字符串連接符都是+,怎么區(qū)分? 是通過運(yùn)算符兩邊的操作數(shù)來(lái)判斷的,如果兩邊的操作數(shù)都是數(shù)字型的基本類型,則進(jìn)行數(shù)學(xué)運(yùn)算,如果兩邊的操作數(shù)有一個(gè)是字符串,則把另一個(gè)操作數(shù)也轉(zhuǎn)換為則進(jìn)行字符串連接運(yùn)算。例如:+ 4 的結(jié)果是9 “5” + 4的結(jié)果是54
53)判斷字符串內(nèi)容相同用什么方法?
用equals方法判斷內(nèi)容相同,==只能判斷引用是否相同 54)提供用戶輸入使用哪個(gè)類 使用javav.util.Scanner類
55)if語(yǔ)句可以用if(-1)形式判斷嗎? 不可以,數(shù)字不能代替布爾值
56)if語(yǔ)句和循環(huán)語(yǔ)句的花括號(hào)什么時(shí)候可以省略?
當(dāng)執(zhí)行的語(yǔ)句只有一句的時(shí)候 57)switch語(yǔ)句有哪些規(guī)則?
表達(dá)式expr的返回值必須是下述幾種類型之一:int, byte, char, short或枚舉常量;
case子句中的值必須是常量,且所有case子句中的值應(yīng)是不同的,也必須是下述幾種類型之一:int, byte, char, short或枚舉常量
default子句是任選的;
break語(yǔ)句用來(lái)在執(zhí)行完一個(gè)case分支后使程序跳出switch語(yǔ)句塊;
58)對(duì)于退出循環(huán)break和continue有什么區(qū)別? break是退出整個(gè)循環(huán)
continue是退出當(dāng)前循環(huán)繼續(xù)下一次循環(huán) 59)聲明數(shù)組創(chuàng)建數(shù)組的方法? 以下聲明都是合法的: int [] a;int a[];String[] a;
以下創(chuàng)建數(shù)組對(duì)象都是合法的: int[] a = new int[3];int[] a = {1,2,3};int[] a = new int[] {1,2,3};
60)int[] x和String[] s這兩個(gè)數(shù)組對(duì)象,哪個(gè)是基本類型,哪個(gè)是引用類型?
兩個(gè)都是數(shù)組對(duì)象,都是引用類型的61)數(shù)組元素下標(biāo)最小是多少,最大是多少,超出范圍會(huì)怎么樣?
最小是0,最大是數(shù)組元素個(gè)數(shù)減一,超出范圍將會(huì)出現(xiàn)下標(biāo)越界異常
62)得到數(shù)組長(zhǎng)度用length屬性還是length()方法? 是length屬性,得到字符串長(zhǎng)度才有l(wèi)ength方法
63)聲明int[][] a = new int[3][],a是一個(gè)二維數(shù)組,a[0]本身
是什么類型的?
二維數(shù)組的元素都是一維數(shù)組,a[0]是int[]類型的 64)數(shù)組的大小一經(jīng)創(chuàng)建可不可以改變大小了? 不可以,數(shù)組是定長(zhǎng)的,一經(jīng)創(chuàng)建就不能再改變大小了 65)可以把2個(gè)int型,3個(gè)double型,4個(gè)String型的值放到一個(gè)數(shù)組中嗎?
不可以,數(shù)組的元素類型必須是相同類型的。66)java中的多維數(shù)組必須是要形成矩陣排列嗎? 不一定,也可以是不規(guī)則的。67)操作數(shù)組比較方便的實(shí)用類?
java.util.Arrays類提供了很多關(guān)于數(shù)組的實(shí)用方法。第4章對(duì)象和類 1)OOP是什么意思? Object Oriented Programming(面向?qū)ο缶幊?
2)
類和對(duì)象的區(qū)別?
類:對(duì)象的藍(lán)圖,生成對(duì)象的模板,是對(duì)一類事物的描述,是抽象的概念上的定義
對(duì)象:對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱為實(shí)例 3)
類之間的3種關(guān)系? 依賴關(guān)系(uses-a)聚集關(guān)系(has-a)繼承關(guān)系(is-a)4)
一個(gè)java源文件可以寫多個(gè)類嗎?
可以,但必須只能有一個(gè)公有類,并且文件名和公有類的類名相同。5)類中有哪些成員?
有屬性(數(shù)據(jù)域),方法,構(gòu)造器(構(gòu)造方法)
6)
構(gòu)造方法和普通方法的區(qū)別?
構(gòu)造方法沒有返回值,方法名必須和類名相同,需要用new語(yǔ)句調(diào)用構(gòu)造方法。7)
普通方法可不可以也類名作為方法名?
是可以的,因?yàn)檎{(diào)用普通方法的語(yǔ)法和調(diào)用構(gòu)造器的語(yǔ)法不一樣。8)
一個(gè)構(gòu)造器調(diào)用另外一個(gè)構(gòu)造器需要用什么語(yǔ)法? 用this()語(yǔ)法調(diào)用另外一個(gè)重載構(gòu)造器,需要注意的是調(diào)用語(yǔ)句必須是構(gòu)造器中的第一句 9)
什么時(shí)候虛擬機(jī)會(huì)自動(dòng)添加一個(gè)默認(rèn)構(gòu)造器?
當(dāng)類中沒有顯式定義任何構(gòu)造器的時(shí)候,虛擬機(jī)會(huì)自動(dòng)添加一個(gè)無(wú)參的構(gòu)造器
10)實(shí)例成員和靜態(tài)成員的區(qū)別?
實(shí)例成員:是屬于對(duì)象實(shí)例的,用對(duì)象.成員名稱語(yǔ)法調(diào)用 靜態(tài)成員:和對(duì)象實(shí)例無(wú)關(guān),是屬于類本身的,用類名.成員名稱語(yǔ)法調(diào)用
11)靜態(tài)初始化塊statci{}的執(zhí)行時(shí)機(jī)是什么時(shí)候? 在類被加載的時(shí)候,僅執(zhí)行一次。
12)靜態(tài)方法可不可以直接調(diào)用同一個(gè)類中的非靜態(tài)方法? 不可以,靜態(tài)方法不能直接調(diào)用一個(gè)非靜態(tài)成員,需要用對(duì)象調(diào)用。
13)包是什么?
包實(shí)際上就是物理上的文件夾,可以把類放到不同的包中。14)把一個(gè)類放到包中,需要在類中加上什么語(yǔ)句? 需要加上包聲明package語(yǔ)句,必須寫在源文件的第一句。15)什么時(shí)候需要導(dǎo)入類?用什么語(yǔ)句?
當(dāng)使用的類和當(dāng)前類并不在同一個(gè)包中的時(shí)候,用import語(yǔ)句導(dǎo)入。
16)默認(rèn)包中的類可以導(dǎo)入嗎?
不可以,不在默認(rèn)包中的類無(wú)法使用默認(rèn)包中的類。17)java中哪個(gè)包中的類是自動(dòng)導(dǎo)入的? java.lang包
18)什么叫做完整類名? 頂層包名.子包名.類名
19)靜態(tài)導(dǎo)入語(yǔ)句有什么作用?
在使用類中的靜態(tài)成員的時(shí)候前面不需要加類名前綴。
20)局部變量和全局變量的區(qū)別? 區(qū)別 局部變量 全局變量
聲明位置 方法或塊內(nèi)部 方法外類內(nèi)部 訪問權(quán)限修飾符 沒有訪問權(quán)限 有訪問權(quán)限
默認(rèn)值 沒有默認(rèn)值
有默認(rèn)值
使用形式 直接使用 對(duì)象調(diào)用
作用域
在方法或語(yǔ)句塊內(nèi)部 整個(gè)類
生命周期 進(jìn)入方法或語(yǔ)句塊創(chuàng)建退出方法或語(yǔ)句塊銷毀 隨著對(duì)象的創(chuàng)建而創(chuàng)建隨著對(duì)象的銷毀而銷毀
21)賦值語(yǔ)句賦給目標(biāo)的是值還是引用?
如果是基本類型則賦的是值本身,引用類型則賦的是引用地址 第5章繼承和多態(tài) 1)類的繼承是誰(shuí)繼承誰(shuí)?
是子類繼承了父類,子類也稱為派生類,父類也稱為超類或基
類 2)子類繼承了父類的什么東西?
子類可以繼承父類的數(shù)據(jù)域(屬性),方法,但構(gòu)造器不能繼
承 3)
私有成員能被子類繼承嗎?
能繼承,但是由于訪問權(quán)限的控制,在子類中不能直接使用父類的私有成員 4)
Object是什么類?
這個(gè)所有類的根類,任何類如果沒有寫顯式的繼承語(yǔ)句,默認(rèn)都是直接繼承Object類的 5)java中是單繼承還是多繼承?
是單繼承,一個(gè)子類只能有一個(gè)父類 6)
訪問權(quán)限修飾符有幾種,訪問的范圍又是多大? 有四種:
private:私用 只能在被類中被訪問 default:默認(rèn) 只能被同一個(gè)包中的類訪問
protected:受保護(hù)的 只能被同一個(gè)包中的類和不同包中的子類
訪問
public:公有 可以被任何類訪問 7)
覆蓋方法的規(guī)則有哪些?
子類覆蓋方法和父類被覆蓋方法的方法返回類型,方法名稱,參數(shù)列表必須相同
子類覆蓋方法的訪問權(quán)限必須大于等于父類的方法的訪問權(quán)限
方法覆蓋只能存在于子類和父類之間
子類覆蓋方法不能比父類被覆蓋方法拋出更多異常 8)
參數(shù)列表是否相同從哪幾方面看?
從三方面看:參數(shù)個(gè)數(shù),類型和順序,需要注意的是參數(shù)的名字不相同是無(wú)所謂的 9)
覆蓋方法的規(guī)則有哪些? 方法名相同
方法的參數(shù)類型,個(gè)數(shù),順序至少有一項(xiàng)不同 方法的返回類型和修飾符均不受限制
10)可變長(zhǎng)參數(shù)的聲明格式是什么?實(shí)際上是什么類型的? 類型 ? 變量,實(shí)際上是一個(gè)一維數(shù)組 11)this和super是作什么用處的?
this:本身代表當(dāng)前的對(duì)象引用,可以用this.成員名稱調(diào)用當(dāng)前對(duì)象的屬性和方法,如果屬性和局部變量重名,可以用this.屬性名和局部變量區(qū)分開。也可以用this()語(yǔ)法調(diào)用本類重載構(gòu)造器。
super:本事是一個(gè)特殊關(guān)鍵字,可以用super.成員名稱調(diào)用從父類繼承的屬性和方法,也可以用super()語(yǔ)法調(diào)用父類構(gòu)造器。
12)super代表子類中的父類對(duì)象引用嗎?
不,這個(gè)錯(cuò)誤的說(shuō)法,super不代表任何對(duì)象引用,僅僅是一個(gè)關(guān)鍵字
13)什么時(shí)候子類構(gòu)造器會(huì)自動(dòng)調(diào)用父類無(wú)參構(gòu)造器? 當(dāng)子類構(gòu)造器中沒有任何顯式構(gòu)造器調(diào)用的時(shí)候,即既沒有this()調(diào)用也沒有super()調(diào)用的時(shí)候
14)一個(gè)父類類型的引用變量可以引用一個(gè)子類的實(shí)例嗎? 可以,這個(gè)引用變量是一個(gè)多態(tài)對(duì)象 15)多態(tài)對(duì)象有什么特點(diǎn)?
多態(tài)對(duì)象只能使用父類的成員,但如果多態(tài)對(duì)象使用了被子類覆蓋的方法,則會(huì)動(dòng)態(tài)綁定使用子類的成員,稱為虛擬方法調(diào)用
16)引用類型之間的類型轉(zhuǎn)換需要遵循哪些規(guī)則? 自動(dòng)轉(zhuǎn)換:從子類到父類的類型可以自動(dòng)轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換:從父類到子類的類型要強(qiáng)制轉(zhuǎn)換 無(wú)繼承關(guān)系的類型轉(zhuǎn)換是非法的 17)instanceof操作符是作什么用處的?
可以判斷一個(gè)對(duì)象的類型是否是某一個(gè)類的類型或子類,也可以判斷這個(gè)對(duì)象的類型是否是一個(gè)接口的實(shí)現(xiàn)類 18)toString方法什么時(shí)候會(huì)自動(dòng)被調(diào)用?
在打印語(yǔ)句中傳入引用類型的對(duì)象或者對(duì)象和字符串作連接時(shí)
19)默認(rèn)的equals方法實(shí)現(xiàn)的是比較內(nèi)容還是比較引用地址?
在Object中是比較引用地址。
20)覆蓋equals方法和hashCode方法有什么規(guī)則? 必須保證當(dāng)兩個(gè)對(duì)象equals比較為true的時(shí)候,返回的hashCode相同,當(dāng)比較為false的時(shí)候,返回的hashCode不同21)java中有幾個(gè)包裝類?
有8個(gè)包裝類,正好對(duì)應(yīng)8種基本數(shù)據(jù)類型。
分別是:Boolean Byte Short Integer Long Character Float Double 22)裝箱和拆箱分別是什么意思?
裝箱指的是把基本類型包裝成包裝類的引用類型 拆箱指的是把包裝類形式的引用類型轉(zhuǎn)換為基本類型 例如:
Integer objInt = new Integer(10);//裝箱
int i = objInt.intValue();
//拆箱
23)JDK1.4和1.5的裝箱和拆箱有什么區(qū)別?
自動(dòng)拆裝箱,例如: Integer intObj = 10;//自動(dòng)裝箱 int i = intObj + 5;//自動(dòng)拆箱
24)final修飾符如何使用,使用了final修飾符有什么特點(diǎn)? final修飾符可以修飾類,方法,變量 final類為最終類,不能被子類繼承 final方法為最終方法,不能被子類覆蓋 final變量為常量,只能賦一次值
25)abstract修飾符如何使用,使用了abstract修飾符有什么特點(diǎn)?
abstract修飾符可以修飾類和方法 abstract類為抽象類,是不能創(chuàng)建對(duì)象的abstract方法為抽象方法,只有方法的聲明,沒有具體的實(shí)現(xiàn) 需要注意的是:
有抽象方法的類一定是抽象類 抽象類不一定有抽象方法
抽象類也有構(gòu)造器,但不能創(chuàng)建對(duì)象實(shí)例 26)abstract不能和哪些修飾符配合使用? 不能和private,static,final一起使用 27)可以在非抽象方法中調(diào)用抽象方法嗎? 可以,模板方法設(shè)計(jì)模式就是典型的這種調(diào)用 第6章 泛型程序設(shè)計(jì) 1)泛型的特點(diǎn)是什么? 主要特點(diǎn)是類型參數(shù)化,后期綁定數(shù)據(jù)類型 2)泛型支持基本類型嗎?
不支持,只支持引用類型 3)如果沒有傳入類型參數(shù),默認(rèn)是什么類型? 默認(rèn)是Object類型
4)泛型方法有什么特點(diǎn)?
將泛型參數(shù)聲明在方法中,調(diào)用方法的時(shí)候綁定泛型 5)
泛型類聲明泛型參數(shù)的時(shí)候,
么意思?
表示綁定的類型必須是A類型后者是A類型的子類或?qū)崿F(xiàn)類 第7章 接口和內(nèi)部類
1)聲明一個(gè)接口的關(guān)鍵字是什么? interface關(guān)鍵字
2)
接口中的成員有什么特點(diǎn)?
數(shù)據(jù)域必須是(public static final修飾)公有靜態(tài)常量 方法必須是(public abstract修飾)公有抽象 沒有構(gòu)造方法 3)接口能創(chuàng)建對(duì)象實(shí)例嗎? 不能,接口沒有構(gòu)造器,不能創(chuàng)建對(duì)象
4)
接口和類的關(guān)系?
接口和類之間是實(shí)現(xiàn)關(guān)系,一個(gè)類用implements語(yǔ)句實(shí)現(xiàn)了某接口,這個(gè)類被稱為接口的實(shí)現(xiàn)類,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,一個(gè)類實(shí)現(xiàn)了某接口,必須覆蓋這個(gè)接口中的所以方法,否則這個(gè)類必須是個(gè)抽象類 5)
接口和接口的關(guān)系?
接口和接口之間是繼承關(guān)系,一個(gè)接口用extends繼承另外一個(gè)接口,稱為這個(gè)接口的子接口。一個(gè)接口可以繼承多個(gè)父接口 6)
內(nèi)部類如何定義?
一個(gè)類聲明在另一個(gè)類的里面,這個(gè)類就被稱為內(nèi)部類,而外面的類被稱為外部類 7)
內(nèi)部類可以分成幾種?
實(shí)例內(nèi)部類:聲明在方法外邊沒有static修飾符 靜態(tài)內(nèi)部類:聲明在方法外邊有static修飾符 局部?jī)?nèi)部類:聲明在方法里邊 8)
如何創(chuàng)建實(shí)例內(nèi)部類的對(duì)象實(shí)例? 需要用外部類的對(duì)象來(lái)創(chuàng)建 例如: class A {class B {
}
}
如果像創(chuàng)建B類的實(shí)例,則必須用以下語(yǔ)句: A a = new A();A.B b = a.new B();9)
如何在實(shí)例內(nèi)部類中訪問外部類的成員?
在實(shí)例內(nèi)部類中可以直接使用外部類的成員,不需要?jiǎng)?chuàng)建外部類的對(duì)象實(shí)例,但是如果在內(nèi)部類中的成員名稱屏蔽隱藏了外部類的成員(即外部類和內(nèi)部類的成員名相同),則需要用“外部類名.this.成員名”訪問外部類成員 第8章異常處理
1)異常的對(duì)象的根類是哪個(gè)類? 是Throwable類
2)
Throwable類有哪兩個(gè)分支?
分成Error類和Excepion類兩個(gè)分支 Error類表示嚴(yán)重錯(cuò)誤
Exception類表示可以在程序中處理的錯(cuò)誤 3)
Exception類有哪兩個(gè)分支?
分成運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(已檢查異常)運(yùn)行時(shí)異常編譯不檢查,在運(yùn)行時(shí)才會(huì)發(fā)生異常
已檢查異常編譯時(shí)就會(huì)作檢查,不處理異常則通不過編譯 4)如果在try塊中發(fā)生異常,那么程序?qū)?huì)跳轉(zhuǎn)到哪? 會(huì)跳轉(zhuǎn)到catch語(yǔ)句塊 5)catch語(yǔ)句可以用父類類型捕獲子類異常嗎? 因?yàn)橛卸鄳B(tài)特點(diǎn),是可以的6)處理異常代碼finally語(yǔ)句會(huì)在什么時(shí)候執(zhí)行? finally代碼在任何時(shí)候都會(huì)執(zhí)行,不管有沒有發(fā)生異常。7)
如何聲明已檢查異常,由誰(shuí)來(lái)處理這個(gè)異常? 用throws語(yǔ)句來(lái)聲明一個(gè)已檢查異常,由方法的調(diào)用者來(lái)處理這個(gè)異常 8)
如何拋出一個(gè)異常? 用throw語(yǔ)句拋出
9)如何創(chuàng)建一個(gè)自定義的異常類? 創(chuàng)建一個(gè)類,只要讓它繼承任何一個(gè)現(xiàn)有的異常類就可以了 10)覆蓋方法對(duì)于異常有什么要求? 覆蓋方法不能比父類方法拋出更多異常 第9章反射,代理,標(biāo)注
1)
獲得一個(gè)類型的Class對(duì)象有哪幾種途徑?
方法1:對(duì)象.getClass()方法2:類型名.class 方法3:Class.forName()2)
反射相關(guān)的類型都有哪些? Class 代表一個(gè)運(yùn)行時(shí)類 Field 代表一個(gè)類的屬性 Method 代表一個(gè)類的方法 Constructor 代筆一個(gè)類的構(gòu)造器 3)
如何聲明一個(gè)自定義標(biāo)注? [<修飾符>] @interface <標(biāo)注名>{ 返回值方法名稱(); 返回值方法名稱(); ?? } 例如:
public @interface MyComment { int id();String info();} 4)
java有幾個(gè)內(nèi)置標(biāo)注? 有3個(gè)
@Override——用于修飾此方法覆蓋了父類的方法,而非重載。@Deprecated——用于修飾已經(jīng)過時(shí)的方法。
@SuppressWarnings——用于通知Java編譯器禁止特定的警告。第10章 java常用類 1)
字符串String是可變類還是不可變類?
是不可變類,一經(jīng)創(chuàng)建就不能修改其內(nèi)容了 2)
字符串的常用方法有哪些? charAt方法:可以返回指定位置的字符 substring方法:可以截取子字符串 length方法:返回字符串長(zhǎng)度 indexOf方法:查找子串的位置 lastIndexOf方法:反向搜索字串的位置 replaceAll方法:替換字符串 split方法:分解字符串
toLowerCase, toUpperCase方法:字符串大小寫轉(zhuǎn)換 3)StringBuffer類和String類有什么區(qū)別? StringBuffer是可變類,String是不可變類
4)StringBuffer類和StringBuilder類有什么區(qū)別? StringBuffer類是線程安全的,StringBuilder類是線程不安全的5)Math類主要提供了哪些方法?
Math類提供了大量的和數(shù)學(xué)運(yùn)算相關(guān)的靜態(tài)方法 6)Set集合和List集合共同的父接口是什么? 是Collection集合7)
Set集合和List集合有什么區(qū)別? Set: Collection的子接口,不記錄元素的保存順序,且不允許有重復(fù)元素
List: Collection的子接口,記錄元素的保存順序,且允許有重復(fù)元素 8)
ArrayList和LinkedList有什么不同?
ArrayList 的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object[],所以從概念上
講它更像數(shù)組
LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,所以它更象一個(gè)鏈表 結(jié)構(gòu),所以它們?cè)谛阅苌嫌泻艽蟮牟顒e。ArrayList 隨機(jī)訪問比較塊,但插入和刪除元素比較慢 LinkedList但插入和刪除元素比較快,但隨機(jī)訪問比較慢 9)
HashTable和HashMap有什么不同?
HashTable是線程安全的,HashMap是線程不安全的10)Vector和ArrayList有什么不同? Vector是線程安全的ArrayList是線程不安全的 第11章 IO流 1)
流分成哪兩類?
按照單位劃分分成字節(jié)流和字符流。按輸入輸出分成輸入流和輸出流 2)
和文件流相關(guān)的有那幾個(gè)類? FileInputStream文件輸入字節(jié)流 FileOutputStream文件輸出字節(jié)流 FileReader文件輸入字符流 FileWriter文件輸出字符流 3)
文件流操作應(yīng)該用字節(jié)流還是字符流? 如果是純文本文件應(yīng)該用字符流 如果是二進(jìn)制文件應(yīng)該用字節(jié)流 4)
文件操作用哪個(gè)類? 用java.io.File類 第12章 線程 1)
創(chuàng)建一個(gè)線程類的兩種方式? 繼承Thread類 實(shí)現(xiàn)Runnable接口 2)線程體應(yīng)該放在哪個(gè)方法里面? run方法 3)啟動(dòng)新的線程用什么方法?
用start方法
4)一個(gè)線程對(duì)象能夠用start多次啟動(dòng)嗎? 不可以,一個(gè)線程方法只能start一次
5)線程有哪幾種主要狀態(tài)? 有四種,分別是:新生狀態(tài),可運(yùn)行狀態(tài),阻塞狀態(tài),死亡狀
態(tài) 6)
線程的同步需要用什么方法? 舊的方法是用synchronized關(guān)鍵字
新的方法是用ReentrantLock類的lock和unlock方法
第三篇:java知識(shí)點(diǎn)總結(jié)目錄.
1:J2SE 面向?qū)ο螅庋b、繼承、多態(tài) 內(nèi)存的分析 遞歸 集合類、泛型、自動(dòng)打包與解包、Annotation IO 多線程、線程同步 TCP/UDP AWT、事件模型、匿名類 正則表達(dá)式 反射機(jī)制 2:數(shù)據(jù)庫(kù)(Oracle或者M(jìn)ySQL)SQL語(yǔ)句 多表連接,內(nèi)外連接,子查詢等 管理表、視圖、索引、序列、約束等 樹狀結(jié)構(gòu)存儲(chǔ) 存儲(chǔ)過程、觸發(fā)器 數(shù)據(jù)庫(kù)設(shè)計(jì)三范式、3:JDBC JDBC基礎(chǔ) 連接池 樹狀結(jié)構(gòu)存儲(chǔ)與展現(xiàn) DataSource & RowSet JDBC連接Oracle及MySQL 4:HTML_CSS_JAVASCRIPT html、css、javascript基礎(chǔ)語(yǔ)法 JavaScript Form判斷 Dom編程基礎(chǔ)(事件處理等)JS常用效果如TreeView、下拉聯(lián)動(dòng)等 JS學(xué)習(xí)方法 JS調(diào)試方法 DreamWeaver初步(建立HTML、Table、Form、CSS)等 5:Servlet & JSP tomcat基礎(chǔ) servlet基礎(chǔ) web.xml配置基礎(chǔ) web application的結(jié)構(gòu) servlet生命周期 request response等常用方法 ServletContext類 HTTP協(xié)議基礎(chǔ)(GET POST)Cookie Session Application JSP的幾種語(yǔ)法(包括JSTL等)注意在項(xiàng)目中練習(xí),不要拘泥于語(yǔ)法細(xì)節(jié)而裹步不前。6:Struts 多層架構(gòu)理論 Model 1 and Model 2 Struts基本概念 MVC Action與業(yè)務(wù)邏輯類的關(guān)系 在Struts與JSP之間傳遞數(shù)據(jù) Struts處理流程(控制流)Struts TagLib(了解常用的)JSTL ActionForm 字段收集 上傳文件 類型轉(zhuǎn)換 DTO 動(dòng)態(tài)Action Form 驗(yàn)證框架 ActionForward 轉(zhuǎn)發(fā)與重定向 動(dòng)態(tài)生成ActionForward 全局與局部的ActionForward Action Forward Scope UnknownActionMapping Action的線程安全 I18N 如何切換語(yǔ)言環(huán)境 Struts異常處理機(jī)制 程序處理 自動(dòng)處理 自定義異常處理器 Struts的多模塊配置 7:XML(XML/XSL、XSLT/DTD、SCHEMA等基礎(chǔ)的概念、關(guān)于Java的編程可以暫時(shí)扔在一邊)8:Hibernate OR Mapping原理 Hibernate基礎(chǔ)開發(fā)步驟 Hibernate基本接口(重點(diǎn)Session)普通屬性映射 關(guān)聯(lián)關(guān)系映射 Native SQL inverse lazy cascade 繼承關(guān)系映射 HQL 性能優(yōu)化 一級(jí)緩存 二級(jí)緩存 查詢緩存 事務(wù)與并發(fā) 悲觀鎖、樂觀鎖 OpenSessionInView CurrentSession(至于JTA、聯(lián)合主鍵、自然主鍵、動(dòng)態(tài)主鍵、Any類型 Creteria Queries Intercepter and Event 自定義類型等,可以暫時(shí)扔在一邊)9:Spring IOC/DI Spring配置 Spring架構(gòu) AOP及Spring AOP 聲明式事務(wù)(AOP)Spring + Hibernate Spring支持Web Scope(其他的Spring模塊對(duì)于自學(xué)來(lái)說(shuō)可以暫時(shí)扔在一邊)10:EJB3.0 J2EE架
構(gòu)基礎(chǔ)(JTA JMS等)EJB基礎(chǔ)(地位及基本理論、分類等)Annotation Ant編譯與部署EJB Session Bean EJB的依賴注入 Persistence API(可以
用JBoss學(xué)習(xí)EJB3.0)
第四篇:java期末考試知識(shí)點(diǎn)總結(jié)(范文模版)
java知識(shí)點(diǎn)總結(jié)
應(yīng)同學(xué)要求,特意寫了一個(gè)知識(shí)點(diǎn)總結(jié),因比較匆忙,可能歸納不是很準(zhǔn)確,重點(diǎn)是面向?qū)ο蟮牟糠帧?/p>
java有三個(gè)版本:JAVA SE 標(biāo)準(zhǔn)版JAVA ME移動(dòng)版JAVA EE企業(yè)版 java常用命令:java, javac, appletview java程序文件名:.java,.class java的兩類程序:applet, application;特點(diǎn),區(qū)別,這兩類程序如何運(yùn)行 java的主方法,主類,共有類;其特征
java的數(shù)據(jù)類型,注意與C++的不同,如字符型,引用型,初值 java與C++的不同之處,期中已總結(jié) java標(biāo)記符的命名規(guī)則
1)標(biāo)識(shí)符有大小寫字母、下劃線、數(shù)字和$符號(hào)組成。
2)開頭可以是大小寫字母,下劃線,和$符號(hào)(不能用數(shù)字開頭)3)標(biāo)識(shí)符長(zhǎng)度沒有限制
4)標(biāo)識(shí)符不能使關(guān)鍵字和保留字 面向?qū)ο蟮乃拇筇卣?抽象、封裝、繼承、多態(tài)
封裝,類、對(duì)象,類與對(duì)象的關(guān)系,創(chuàng)建對(duì)象,對(duì)象實(shí)例變量
構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù),派生類的構(gòu)造函數(shù),構(gòu)造函數(shù)的作用,初始化的順序,構(gòu)造方法的重載 構(gòu)造函數(shù):創(chuàng)建對(duì)象的同時(shí)將調(diào)用這個(gè)對(duì)象的構(gòu)造函數(shù)完成對(duì)象的初始化工作。把若干個(gè)賦初值語(yǔ)句組合成一個(gè)方法在創(chuàng)建對(duì)象時(shí)一次性同時(shí)執(zhí)行,這個(gè)方法就是構(gòu)造函數(shù)。是與類同名的方法,創(chuàng)建對(duì)象的語(yǔ)句用new算符開辟了新建對(duì)象的內(nèi)存空間之后,將調(diào)用構(gòu)造函數(shù)初始化這個(gè)新建對(duì)象。構(gòu)造函數(shù)是類的特殊方法: 構(gòu)造函數(shù)的方法名與類名相同。構(gòu)造函數(shù)沒有返回類型。
構(gòu)造函數(shù)的主要作用是完成對(duì)類對(duì)象的初始化工作。構(gòu)造函數(shù)一般不能由編程人員顯式地直接調(diào)用。
在創(chuàng)建一個(gè)類的新對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造函數(shù)為新對(duì)象初始化。類的修飾符:public類 VS 默認(rèn);abstract類;final類;1)類的訪問控制符只有一個(gè):public,即公共的。公共類表明它可以被所有其他類訪問和引用。
若一個(gè)類沒有訪問控制符,說(shuō)明它有默認(rèn)訪問控制特性,規(guī)定該類智能被同一個(gè)包中的類訪問引用(包訪問控制)。2)abstract類:用abstract修飾符修飾的類被稱為抽象類,抽象類是沒有具體對(duì)象的概念類,抽象類是它所有子類的公共屬性集合,用抽象類可以充分利用這些公共屬性來(lái)提高開發(fā)和維護(hù)效率。
3)final類:被final修飾符修飾限定的,說(shuō)明這個(gè)類不能再有子類。所以abstract與final不能同時(shí)修飾一個(gè)類。域和方法的定義
1)域:定義一個(gè)類時(shí),需要定義一組稱之為“域”或“屬性”的變量,保存類或?qū)ο蟮臄?shù)據(jù)??梢允莏ava任意的數(shù)據(jù)類型,其中包括簡(jiǎn)單類型、類、接口、數(shù)組等。一個(gè)類中域名應(yīng)該是唯一的。
2)方法是類的動(dòng)態(tài)屬性,標(biāo)志了類所具有的功能和操作。方法由方法頭和方法體組成: 修飾符1 修飾符2 ?返回值類型方法名(形式參數(shù)列表)throw(異常列表){ 方法體個(gè)語(yǔ)句; } static域和方法,特點(diǎn),本質(zhì),與普通域和方法區(qū)別,初始化問題
1)靜態(tài)域:用static修飾符修飾的域是僅屬于類的靜態(tài)域。特點(diǎn)是:它們是類的域,不屬于任何一個(gè)類的具體對(duì)象。保存在類的內(nèi)部區(qū)域的公共存儲(chǔ)單元,任何一個(gè)類的對(duì)象訪問它都是相同的數(shù)值,任何一個(gè)類的對(duì)象去修改它,都是在對(duì)同一個(gè)內(nèi)存單元操作。2)靜態(tài)方法:用static修飾的方法,是屬于整個(gè)類的方法;(1)調(diào)用靜態(tài)方法時(shí),應(yīng)該使用類名做前綴,而不是使用某個(gè)具體對(duì)象名。非靜態(tài)方法屬于某個(gè)對(duì)象的方法,在這個(gè)對(duì)象創(chuàng)建時(shí),對(duì)象的方法在內(nèi)存中擁有自己專用代碼段;而靜態(tài)方法屬于整個(gè)類,它在內(nèi)存中的代碼段將隨著類的定義而分配和裝載,不被任何一個(gè)對(duì)象專有。
由于static方法是屬于整個(gè)類的方法,所以它不能操縱和處理屬于某個(gè)對(duì)象的成員變量,而只能處理屬于整個(gè)類的成員變量,static方法只能處理static域。final關(guān)鍵字,final類,final域,final方法
1)final類:一個(gè)類如果被final修飾符修飾限定,說(shuō)明這個(gè)類不再能有子類
2)final域:final是用來(lái)修飾修飾常量的修飾符,一個(gè)類的域如果被聲明為final,那么它的值在程序的整個(gè)執(zhí)行過程中都不能改變。用final修飾符說(shuō)明常量是注意:1.需要說(shuō)明常量的數(shù)據(jù)類型;2.需要同時(shí)指出敞亮的具體取值;3.因?yàn)樗蓄悓?duì)象的常量成員,其數(shù)值固定一致,為了節(jié)省空間,常量通常聲明為static.3)final方法:不能被當(dāng)前類的子類重新定義的方法。被private限定為私有方法,以及final類中的方法,都是默認(rèn)為最終方法。訪問控制符
是一組想定類、屬性、方法是否可以被程序中的其他部分訪問和調(diào)用的修飾符,其他部分指這個(gè)程序中這個(gè)類之外的類。1)類的訪問控制:
類的訪問控制符只有一個(gè)Public,公共的。一個(gè)類被聲明為公共類,表明它可以被所有的其他類訪問和引用,程序其他部分可以創(chuàng)建這個(gè)類的對(duì)象,訪問這個(gè)類內(nèi)部可見的成員變量和調(diào)用它的可見方法。
如果類沒有訪問控制符public說(shuō)明它是默認(rèn)訪問控制,規(guī)定該類只能被同一個(gè)包中的類訪問和引用,不可被其他包中的類使用(包訪問)。2)類成員的訪問控制:
Public:公共。一個(gè)方法或者域被聲明為公共的,表明它可以被所有的類訪問。
默認(rèn)訪問控制符:類的定義中,域和方法沒有指定訪問控制符,則域和方法具有包訪問性,即可以被同一個(gè)包中的所有類(的方法)訪問。Protected:保護(hù)訪問控制符,類中限定為protected的成員可以被這個(gè)類本身、它的子類(包括同一個(gè)包和不同包中的子類)以及同一個(gè)包中的其他類來(lái)訪問。Private:私有訪問控制符,被private修飾的域和方法只能被同一個(gè)類中的成員方法所訪問,而不能被任何其他類(包括該類的子類)訪問。它們也被稱之為私有域和方法。類的繼承,繼承的特性可給面向?qū)ο缶幊處?lái)哪些好處?什么是單繼承,什么是多重繼承? 繼承:是存在于面向?qū)ο蟪绦蛑械膬蓚€(gè)類之間的一種關(guān)系,當(dāng)一個(gè)類獲取另一個(gè)類的所有非私有的數(shù)據(jù)和操作的定義作為自己的一部分或全部成分時(shí),就稱兩個(gè)類之間是繼承關(guān)系。繼承能夠使程序結(jié)構(gòu)清晰,降低編碼和維護(hù)工作量。可以提高程序抽象程度,使之更接近人的思維方式,同時(shí)也可以提高程序開發(fā)效率,降低維護(hù)工作量。單繼承:只任何一個(gè)類都只有一個(gè)單一的父類; 多重繼承:只一個(gè)類可以有一個(gè)以上的父類,它的靜態(tài)的數(shù)據(jù)屬性和操作從所有這些父類中繼承。Java處于安全性可靠性考慮,僅支持單繼承。域的繼承與隱藏
在子類中重新定義一個(gè)與從父類哪里繼承來(lái)的域變量完全相同的變量,導(dǎo)致子類中有兩個(gè)同名變量,一般情況,子類的方法所操作的是子類自己定義的變量,而從父類繼承的變量為不可見,即被子類同名變量隱藏,成為域的隱藏。方法的繼承與覆蓋,與方法重載有什么不同?
子類可以重新定義與父類同名的方法,實(shí)現(xiàn)對(duì)父類方法的覆蓋(overload),與域的隱藏不同在于:子類隱藏父類的域只是使之不可見,父類同名域在子類對(duì)象中仍然占有自己的獨(dú)立內(nèi)存空間;子類方法對(duì)父類同名方法的覆蓋將清除父類方法占用的內(nèi)存,從而使父類方法在子類對(duì)象中不復(fù)存在。注意:子類重新定義父類已有方法時(shí),應(yīng)保持與父類完全相同的方法頭聲明,即應(yīng)與父類具有完全相同的方法名,返回值和參數(shù)列表。
重載(override)是在一個(gè)類中定義同名方法的情況。由于重載發(fā)生在同一個(gè)類里,不能再用類名來(lái)區(qū)分不同的方法,所以一般采用不同形式參數(shù)列表,包括形式參數(shù)個(gè)數(shù)、類型和順序不同來(lái)區(qū)分重載方法。super
this super調(diào)用父類構(gòu)造函數(shù):嚴(yán)格來(lái)說(shuō)子類并不繼承父類構(gòu)造函數(shù)。但子類構(gòu)造函數(shù)與父類構(gòu)造函數(shù)存在一定關(guān)系并遵循以下原則:
如果子類自己沒有定義任何構(gòu)造函數(shù),那么創(chuàng)建子類對(duì)象時(shí)將調(diào)用父類無(wú)參數(shù)構(gòu)造函數(shù)。如果子類自己定義了構(gòu)造函數(shù),則在創(chuàng)建子類對(duì)象時(shí),系統(tǒng)將首先隱含執(zhí)行父類無(wú)參數(shù)的構(gòu)造函數(shù),然后再執(zhí)行子類自己的構(gòu)造函數(shù)。
如果在子類自己定義的構(gòu)造函數(shù)中,利用super關(guān)鍵字顯式地調(diào)用父類的構(gòu)造函數(shù),系統(tǒng)將不再隱含調(diào)用父類的無(wú)參數(shù)的構(gòu)造函數(shù)。super的顯式調(diào)用語(yǔ)句必須是子類構(gòu)造函數(shù)的第一個(gè)可執(zhí)行語(yǔ)句。(P126有例子)
this:一個(gè)類的不同構(gòu)造函數(shù)之間可以互相調(diào)用。一個(gè)構(gòu)造函數(shù)需要另一個(gè)構(gòu)造函數(shù)時(shí),應(yīng)使用關(guān)鍵字this,同時(shí)這個(gè)調(diào)用語(yǔ)句應(yīng)該是整個(gè)構(gòu)造函數(shù)的第一個(gè)可執(zhí)行語(yǔ)句。當(dāng)使用this并給他一個(gè)參數(shù)列表時(shí),this顯式調(diào)用參數(shù)匹配的另一個(gè)構(gòu)造方法。(P125例子)。多態(tài):重載,覆蓋,對(duì)象引用多態(tài)(兼容性原則)
多態(tài),指一個(gè)程序中同名的不同方法共存的情況。突出Java語(yǔ)言的繼承性。面向?qū)ο蟪绦蛑卸鄳B(tài)可以表現(xiàn)在:1)子類對(duì)父類方法的覆蓋;2)一個(gè)類中方法的重載;3)將子類對(duì)象作為父類的對(duì)象實(shí)現(xiàn)多態(tài)。父類與子類對(duì)象的轉(zhuǎn)換
子類繼承了父類所有的非私有的成員(屬性和方法),父類成員也就是子類成員。我們可以通過父類變量讓一個(gè)子類對(duì)象做父類對(duì)象可做的全部事情(P115).如果父類變量指向的實(shí)際是一個(gè)子類對(duì)象,即早先曾將子類對(duì)象的引用賦值給這個(gè)父類變量,那么可以用強(qiáng)制類型轉(zhuǎn)換將這個(gè)父類變量引用轉(zhuǎn)換為子類對(duì)象的引用,也就是將作為父類對(duì)象看待的子類對(duì)象轉(zhuǎn)變?yōu)樽髯宇悓?duì)象看待。Employee emp = new Manager(…)Manager mgr;mgr =(Manager)emp;最后結(jié)果相當(dāng)于:
Manager mgr = new Manager(…)
包,package
import, 簡(jiǎn)單知道作用和使用 接口,會(huì)定義,有何特點(diǎn)?作用,會(huì)實(shí)現(xiàn),會(huì)使用
接口是用來(lái)實(shí)現(xiàn)類間多重繼承功能的結(jié)構(gòu)。Java中接口在語(yǔ)法上有些相似與類,它定義了若干個(gè)抽象方法和常量,形成一個(gè)屬性集合,屬性集合通常對(duì)應(yīng)了某一組功能,主要是可以幫助實(shí)現(xiàn)類似于類的多重繼承功能。聲明接口:
[public] interface 接口名 [extends 父接口名列表] { //接口體
// 常量域聲明
[public] [static] [final] 域類型域名 = 常量值;
//抽象方法聲明
[public] [abstract][native] 返回值方法名(參數(shù)列表)[throw 異常列表]; } 實(shí)現(xiàn)接口:
在類的聲明部分,用implements關(guān)鍵字聲明該類將要實(shí)現(xiàn)那些接口。如果實(shí)現(xiàn)某接口的類不是abstract的抽象類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法,即為所有方法定義方法體,方法頭部分應(yīng)該與接口中的定義完全一致。如果實(shí)現(xiàn)接口類是abstract類,它可以不實(shí)現(xiàn)該接口的所有的方法。一個(gè)類在實(shí)現(xiàn)某接口的抽象方法時(shí),必須使用完全相同的方法頭。
接口的抽象方法的訪問限制符都已指定為public,所以類實(shí)現(xiàn)方法時(shí)候,必須顯式地使用pubic修飾符。
4-1什么是抽象?什么是過程抽象?什么是數(shù)據(jù)抽象?面向?qū)ο筌浖_發(fā)如何實(shí)現(xiàn)?
抽象:即去除掉被研究對(duì)象中與主旨無(wú)關(guān)的次要部分,或暫時(shí)不考慮的部分,而僅抽取與研究工作有關(guān)的性質(zhì)的內(nèi)容加以考察。
過程抽象:將整個(gè)系統(tǒng)的功能劃分為若干部分,強(qiáng)調(diào)功能完成的過程及步驟。數(shù)據(jù)抽象:把系統(tǒng)中需要處理的數(shù)據(jù)和數(shù)據(jù)上的操作結(jié)合在一起,根據(jù)功能性質(zhì)和作用等因素抽象成為不同的抽象數(shù)據(jù)類型。
面向?qū)ο筌浖_發(fā)采用數(shù)據(jù)抽象的方法構(gòu)建程序的類,對(duì)象及方法。4-2什么是封裝?面向?qū)ο蟪绦蛉绾螌?shí)現(xiàn)封裝? 封裝是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型內(nèi)部,系統(tǒng)的其他部分只有通過包裹在數(shù)據(jù)外面的被授權(quán)操作,才能夠與這個(gè)抽象數(shù)據(jù)類型交流和交互。
抽象數(shù)據(jù)類型用“類”這個(gè)面向?qū)ο蠊ぞ呖衫斫夂筒倏v的結(jié)構(gòu)來(lái)代表的,每個(gè)類封裝了相關(guān)數(shù)據(jù)和操作。
4-3使用抽象和封裝有哪些好處? 抽象可以幫助人們明確工作重點(diǎn),理清問題的脈絡(luò)。封裝特性使抽象數(shù)據(jù)類型的可重用性大為提高,利于構(gòu)建,開發(fā)大型標(biāo)準(zhǔn)化的應(yīng)用軟件系統(tǒng),大幅提高生產(chǎn)效率,縮短開發(fā)周期和降低各種費(fèi)用。
4-4Java程序中使用的類分為哪兩種?什么事系統(tǒng)定義的類?什么事用戶自定義類?
1)系統(tǒng)定義的類及用戶自定義類2)Java類庫(kù)是一組由開發(fā)人員或軟件供應(yīng)商編寫的Java程序模塊,每一個(gè)模塊通常對(duì)應(yīng)一種特定的基本功能和任務(wù)可以直接利用這些類庫(kù)無(wú)需從頭編寫。3)用戶自己根據(jù)需要定義的類。
4-6 使用已經(jīng)存在的類(包括類庫(kù)中系統(tǒng)類和用戶類)有哪三種主要方法?如何在程序中引入已經(jīng)存在的類?
第一、繼承系統(tǒng)類或繼承已經(jīng)定義好的類。第二、創(chuàng)建已經(jīng)定義好的類的對(duì)象。第三、直接使用類。2)利用import語(yǔ)句引入它所用的類所在的包。4-15 什么事靜態(tài)初始化器?它有什么特點(diǎn)?與構(gòu)造函數(shù)有什么不同?
靜態(tài)初始化器:由static引導(dǎo)的一對(duì)大括號(hào)括起的語(yǔ)句組,作用與類的構(gòu)造函數(shù)相似,都完成初始化工作。與構(gòu)造函數(shù)的不同:
構(gòu)造函數(shù)是對(duì)每個(gè)新創(chuàng)建的對(duì)象初始化,而靜態(tài)初始化器是對(duì)類自身進(jìn)行初始化。
構(gòu)造函數(shù)是在用new運(yùn)算符產(chǎn)生新對(duì)象時(shí)由系統(tǒng)自動(dòng)執(zhí)行,而靜態(tài)初始化器是在它所屬的類加載入內(nèi)存時(shí)由系統(tǒng)調(diào)用執(zhí)行。
不同于構(gòu)造函數(shù),靜態(tài)初始化器不是方法,沒有方法名、返回值、和參數(shù)列表。4-16 最終域和易失域各有有何特點(diǎn)?如何定義?
(1)最終域:一個(gè)類的域如果被聲明為final,那么它的值在程序的整個(gè)執(zhí)行過程中是不能變的。final修飾常量時(shí)注意:1)說(shuō)明常量的數(shù)據(jù)類型2)需要同時(shí)指出常量的具體值。3)所有類對(duì)象的常量成員,其數(shù)值固定一致,為了節(jié)省空間,常量通常聲明為static.例:static final String phoneNum =”123”。
(2)易失域:一個(gè)域被volatile修飾符修飾,說(shuō)明這個(gè)域可能同時(shí)被幾個(gè)線程控制修改,即這個(gè)域不僅被當(dāng)前程序掌握,運(yùn)行過程中可能存在其他未知程序,操作來(lái)影響和改變域的取值。
4-17 如何定義方法?在面向?qū)ο蟪绦蛟O(shè)計(jì)中方法由什么作用? 方法名后面的小括號(hào)()是方法的標(biāo)志。程序用方法名調(diào)用方法。定義方法的目的:是定義具有相對(duì)獨(dú)立和常用功能的模塊,使程序結(jié)構(gòu)清晰也利于模塊在不同場(chǎng)合重復(fù)利用。
4-18 什么事抽象方法?它有何特點(diǎn)?如何定義、如何使用?
由abstract 修飾符修飾的抽象方法是一種僅有方法頭,沒有具體方法體和操作實(shí)現(xiàn)的方法。例如:abstract void performDial();
注意:所有抽象方法,都必須存在抽象類中,一個(gè)非抽象類中出現(xiàn)抽象方法時(shí)非法的。一個(gè)抽象類的子類若不是抽象類,它必須為父類中所有的抽象方法寫方法體,不過抽象類不一定只能擁有抽象方法,它也可以包括非抽象方法。
4-22修飾符是否可以混用?混合使用應(yīng)該注意什么問題?
修飾符可以混合使用。例如:public abstract final 三者之間并非互斥。Public abstract class ? Abstract不能與final 并列修飾一個(gè)類。
Abstract 不能與private、static、final、native修飾同一個(gè)方法。Abstract 類不能有private域和方法。Abstract方法必須在abstract類中。Abstract方法不能處理非static屬性。
5-2 子類的域和方法數(shù)目一定大于等于父類的域和方法數(shù)目,說(shuō)法是否正確? 不正確,子類并不能繼承父類的私有域和私有方法。5-7構(gòu)造函數(shù)是否可以被重載?試舉例。
可以被重載。構(gòu)造函數(shù)的重載指同一個(gè)類中存在若干個(gè)具有不同參數(shù)列表的構(gòu)造函數(shù) 例:D200_Card(){} / /無(wú)形式參數(shù),無(wú)任何操作的構(gòu)造函數(shù)
D200_Card(long cn){ cardNumber = cn;} //一個(gè)參數(shù)的構(gòu)造函數(shù)
D200_Card(long cn,int pw;){ cardNumber = cn;password = pw;} //兩個(gè)參數(shù)的構(gòu)造函數(shù) 簡(jiǎn)答題new1 1 什么是靜態(tài)變量?什么是靜態(tài)方法?各自有何特點(diǎn)?
被static修飾的變量叫靜態(tài)變量,被static修飾的訪問靜態(tài)方法。靜態(tài)變量最主要特點(diǎn)是它們是類的域(變量),不屬于任何一個(gè)類的具體對(duì)象,它不保存在對(duì)象空間,而是保存在類的內(nèi)存區(qū)域的公共存儲(chǔ)單元,任何類的對(duì)象訪問它時(shí),取到的都是相同的數(shù)值,修改它時(shí),都是對(duì)同一個(gè)內(nèi)存單元進(jìn)行操作。靜態(tài)方法是屬于整個(gè)類的的類方法,不是屬于某個(gè)具體對(duì)象的方法。Java中對(duì)變量和成員方法的訪問控制主要有哪四種?有何區(qū)別?
a)Private:私有訪問屬性,被private修飾的變量或方法只能被同一個(gè)類的成員方法訪問,而不能被任何其他類訪問。Private訪問控制符提供最高的成員保護(hù)級(jí)別,使它們不為其他類所見,體現(xiàn)了類的封閉和信息隱藏。b)默認(rèn)訪問控制符:如果在類的定義中,域和方法前沒有指定訪問控制符,則具有包訪問性,即被同一包的所有類所訪問,稱之為“包友元”成員。c)Protected保護(hù)訪問控制符:被portected修飾的成員可以被類本身、它的子類、以及同一個(gè)包中所有類訪問。d)Public公共訪問控制符:成員可以被所有類訪問。填空:
1.創(chuàng)建類的對(duì)象時(shí),使用運(yùn)算符__new______給對(duì)象分配內(nèi)存空間。2.若有定義:float[] b={1.1f, 3.5f, 6.8f};,則b.length()的值是_3____ 3.在子類中使用關(guān)鍵字__super_____做前綴可調(diào)用被子類覆蓋的父類中的方法
4.Java語(yǔ)言中, 通常把可能發(fā)生異常的方法調(diào)用語(yǔ)句放到try塊中,并用緊跟其后的_catch____塊來(lái)捕獲和處理異常
5.程序中實(shí)現(xiàn)多線程的方法有兩種:繼承_Thead____類和實(shí)現(xiàn)Runnable接口 6.面向?qū)ο蟮娜筇卣魇牵ǎǎǎ┓庋b性、繼承性、多態(tài)性
第五篇:Java基礎(chǔ)知識(shí)點(diǎn)總結(jié)-Ch1
Java基礎(chǔ)知識(shí)點(diǎn)總結(jié)
第一章 Java語(yǔ)言概述
1.面性對(duì)象語(yǔ)言的基本特征。
Java語(yǔ)言的特點(diǎn)。最大優(yōu)勢(shì)。
Java語(yǔ)言是區(qū)分大小寫的。
2.Java虛擬機(jī)的核心。
環(huán)境變量classpath設(shè)置中的“.;”是指可以加載應(yīng)用程序當(dāng)前目錄及其子目錄中的類。環(huán)境變量的變量值的最后是以“rt.jar;.;”結(jié)束。
3.編寫源文件時(shí)不可以使用Word編輯器,因?yàn)樗胁豢梢娮址?/p>
要用記事本或Edit。源文件的擴(kuò)展名是java。
4.一個(gè)Java應(yīng)用程序的源文件必須有一個(gè)類含有public static void main(String args[ ])的方法,這樣類的應(yīng)用程序叫做主類。
5.源文件的名稱必須與有public修飾的類的名稱相同。
若源文件有多個(gè)類,那么只能有一個(gè)是public類;
若只有一個(gè)類是 public類,那么源文件的名字必須與這個(gè)類的名字完全相同,擴(kuò)展名是.java;
若源文件沒有public類,那么源文件的名字只要和某個(gè)類的名字相同即可,并且擴(kuò)展名為.java。
6.編譯時(shí),Java編譯器是什么。
進(jìn)入某個(gè)文件夾的命令是“cd 目錄名”;退出某個(gè)文件夾的命令是“cd..”。
7.編譯源文件后將生成多個(gè)擴(kuò)展名為.class的文件,每個(gè)擴(kuò)展名是.class的文件夾存放一個(gè)類的字節(jié)碼文件,文件名與該類的類名相同。這些字節(jié)碼文件被存放在與源文件相同的目錄中。
8.運(yùn)行時(shí),Java解釋器是什么。
Java應(yīng)用程序總是從主類的main方法開始執(zhí)行。
9.在運(yùn)行字節(jié)碼文件是不可以帶有擴(kuò)展名。
當(dāng)Java應(yīng)用程序有多個(gè)類時(shí),Java命令執(zhí)行的類名必須是主類的名字(不帶擴(kuò)展名)。
10.例子:有一個(gè)源文件名字叫Apple.java,其中包括3個(gè)類,名字分別是Apple, Banana, Orange,有1個(gè)是主類,則主類名是什么,生成多少個(gè)字節(jié)碼文件,字節(jié)碼文件名稱是什么,在編譯,運(yùn)行時(shí)語(yǔ)句分別是怎樣的。
11.Application程序又稱什么,Applet程序又稱什么,哪一個(gè)是源文件編譯時(shí)運(yùn)行的程序。
12.J開發(fā)一個(gè)Java程序要經(jīng)過的三個(gè)步驟。
13.單行注釋,多行注釋的標(biāo)記分別是什么
14.javac *.java的意思。
15.Allmans風(fēng)格又稱什么,Kernighan風(fēng)格又稱什么,兩者各自的意思是什么。