第一篇:Java EE實驗報告
學(xué) 生 實 驗 報 告
課程名稱:
學(xué)生學(xué)號:
所屬院部:
(理工類)
J2EE程序設(shè)計 專業(yè)班級:
學(xué)生姓名:
信息技術(shù)學(xué)院 指導(dǎo)教師: 13 ——20 14 學(xué)年 第 2 學(xué)期
金陵科技學(xué)院教務(wù)處制 實驗報告書寫要求
實驗報告原則上要求學(xué)生手寫,要求書寫工整。若因課程特點需打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用A4的紙張。
實驗報告書寫說明
實驗報告中一至四項內(nèi)容為必填項,包括實驗?zāi)康暮鸵?;實驗儀器和設(shè)備;實驗內(nèi)容與過程;實驗結(jié)果與分析。各院部可根據(jù)學(xué)科特點和實驗具體要求增加項目。
填寫注意事項
(1)細致觀察,及時、準確、如實記錄。(2)準確說明,層次清晰。
(3)盡量采用專用術(shù)語來說明事物。
(4)外文、符號、公式要準確,應(yīng)使用統(tǒng)一規(guī)定的名詞和符號。(5)應(yīng)獨立完成實驗報告的書寫,嚴禁抄襲、復(fù)印,一經(jīng)發(fā)現(xiàn),以零分論處。
實驗報告批改說明
實驗報告的批改要及時、認真、仔細,一律用紅色筆批改。實驗報告的批改成績采用百分制,具體評分標準由各院部自行制定。
實驗報告裝訂要求
實驗批改完畢后,任課老師將每門課程的每個實驗項目的實驗報告以自然班為單位、按學(xué)號升序排列,裝訂成冊,并附上一份該門課程的實驗大綱。
實驗項目名稱:Java編程基礎(chǔ) 實驗學(xué)時: 4 同組學(xué)生姓名: ———— 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間:
一、實驗?zāi)康暮鸵?/p>
(1)熟練掌握JDK1.7及Eclipse Kepler Service Release 1(下簡稱Eclipse)編寫調(diào)試Java應(yīng)用程序的方法;
(2)熟練掌握Java常用工具類的使用;(3)熟練掌握Java集合框架編程;
(4)調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;
(5)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;(6)做完實驗后給出本實驗的實驗報告。
二、實驗儀器和設(shè)備
奔4以上計算機,Windows 操作系統(tǒng),裝有JDK1.7和Eclipse軟件。
三、實驗內(nèi)容及過程
(1)設(shè)計一個類Student,類的屬性有:姓名,學(xué)號,出生日期,性別,所在系等。并生成學(xué)生類對象數(shù)組,按照學(xué)生的姓名將學(xué)生排序輸出。(注意:使用String類的compareTo方法)
(2)使用日歷類等相關(guān)方法,按截圖做出一個日歷。參照書本示例,研究其中代碼,回顧與復(fù)習(xí)利用Java Swing編程。
(3)將本學(xué)期開設(shè)的課程名稱加入到HashSet中,并使用迭代器遍歷輸出。
(4)完成以下實驗:(1)定義一個學(xué)生類:屬性有學(xué)號、姓名、專業(yè)、高數(shù)成績、外語成績、Java課程成績。(2)在測試類中生成多個學(xué)生類的對象,放入TreeSet中,要求按照三門課總成績從高到低排序,總成績相等按學(xué)號排序輸出排序結(jié)果。(注意:實現(xiàn)Comparator接口的compare(Object obj1,Object obj2)函數(shù))
(5)以List接口對象(ArrayList)為基礎(chǔ)建立一個通訊錄,要求通訊錄中必須含有編號、姓名,性別、電話、地址、Email等等。實現(xiàn)該類并包含添加、刪除、修改、按姓名查等幾個方法。編寫主程序測試。
要求:
(1)編譯調(diào)試程序之前應(yīng)配置好環(huán)境變量;
(2)要掌握用JDK命令行和Eclipse集成開發(fā)環(huán)境調(diào)試Java程序;(3)熟練掌握Java常用工具類和集合框架的使用;
程序清單:
(建議程序中適當(dāng)添加注釋信息,增強可讀性;較長程序可分欄書寫,保證報告排版整潔美觀。)
(實驗一程序清單續(xù)1)
(實驗一程序清單續(xù)2)
四、實驗結(jié)果與分析
實驗項目名稱: JSP編程基礎(chǔ) 實驗學(xué)時: 6 同組學(xué)生姓名: ———— 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間:
一、實驗?zāi)康暮鸵?/p>
(1)熟練掌握JDOM對XML編程的使用;(2)熟練掌握HTML編程基礎(chǔ);
(3)熟練掌握JSP環(huán)境配置以及編程基礎(chǔ);(4)熟練掌握JavaBean編程;
(5)調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;
(6)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;(7)做完實驗后給出本實驗的實驗報告。
二、實驗儀器和設(shè)備
奔4以上計算機,Windows 操作系統(tǒng),裝有JDK1.7,Tomcat6.0和Eclipse軟件。
三、實驗內(nèi)容及過程
(1)通過JDOM技術(shù)實現(xiàn)對以下XML文件的操作:
? 顯示整個XML文件內(nèi)容
? 顯示第二個客戶節(jié)點內(nèi)容
? 增加一個節(jié)點:如
<客戶 性別=“男”> <姓名>張三姓名>
<電子郵件>Zhangsan@magicactor.com電子郵件> 客戶>
? 刪除客戶名稱為張三的節(jié)點
? 修改客戶名稱為張三的節(jié)點的電子郵件為Zhangsan@126.com
(2)使用HTML與JavaScript完成一個簡單的四則運算,界面功能如下:
(3)使用JSP與JavaBean實現(xiàn)一個簡易計算器.注意:仿照(2)HTML代碼編寫網(wǎng)頁,使用request對象接收值,在JavaBean中計算,JSP頁面調(diào)用該JavaBean,實現(xiàn)數(shù)字計算。
(4)使用application內(nèi)置對象實現(xiàn)一個簡易的網(wǎng)站計數(shù)器,界面如教材P288圖15.7所示。
(5)使用session內(nèi)置對象實現(xiàn)一個簡易的購物車功能。利用session保存用戶選購的商品信息,本購物車程序至少包含兩個頁面:顯示商品頁面showbooks.jsp;顯示購物車頁面showcarts.jsp。
要求:
(1)學(xué)會配置JSP編程環(huán)境;
(2)學(xué)會使用Eclipse的各種調(diào)試方法;(3)熟練掌握JSP的編程基礎(chǔ)。
程序清單:
(建議程序中適當(dāng)添加注釋信息,增強可讀性;較長程序可分欄書寫,保證報告排版整潔美觀。)
(實驗二程序清單續(xù)1)
(實驗二程序清單續(xù)2)
四、實驗結(jié)果與分析
實驗項目名稱: Servlet與JSP綜合編程 實驗學(xué)時: 6 同組學(xué)生姓名: ———— 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間:
一、實驗?zāi)康暮鸵?/p>
(1)熟練掌握JDBC數(shù)據(jù)庫編程的使用;(2)熟練掌握Servlet編程基礎(chǔ);(3)熟練掌握JSP綜合編程;
(4)調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;
(5)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;(6)做完實驗后給出本實驗的實驗報告。
二、實驗儀器和設(shè)備
奔4以上計算機,Windows 操作系統(tǒng),裝有JDK1.7,MySQL,Tomcat6和Eclipse軟件。
三、實驗內(nèi)容及過程
(1)在數(shù)據(jù)庫中建立一個表,表名為學(xué)生,其結(jié)構(gòu)為:學(xué)號、姓名、性別、年齡、成績。編程實現(xiàn)以下功能:
? ? ? 編寫方法向?qū)W生表中增加記錄;
編寫方法將每條記錄按成績由大到小的順序顯示到界面; 編寫方法刪除成績不及格的學(xué)生記錄。
(2)使用JSP與JavaBean實現(xiàn)用戶登錄功能,要求實現(xiàn)以下功能:
? ? ? 創(chuàng)建數(shù)據(jù)庫MyDB,創(chuàng)建一個表Users(用戶名、密碼),用戶日志表userLog; 創(chuàng)建一個JavaBean;UserDao主要包含兩個函數(shù):驗證函數(shù)、日志函數(shù); 創(chuàng)建登錄頁面JSP頁面(login.jsp),構(gòu)建表單Form,使用Servlet實現(xiàn)驗證碼功能。當(dāng)用戶輸入提交后,調(diào)用JavaBean驗證其合法性,如果驗證不通過導(dǎo)向登錄頁面,驗證通過導(dǎo)向歡迎頁面。不管是否通過驗證都應(yīng)該向userLog表中添加成功登錄或失敗登錄信息。; ? 創(chuàng)建成功頁面JSP頁面(success.jsp)。
(3)使用JSP、Servlet以及JavaBean實現(xiàn)MVC架構(gòu)計算圓面積,要求實現(xiàn)以下功能:
? ? ? 編寫JSP頁面View; 編寫JavaBean實現(xiàn)業(yè)務(wù)邏輯;
編寫一個Servlet,從JSP界面接收用戶輸入的半徑,調(diào)用JavaBean實現(xiàn)圓面積計算; ? 在web.xml文件中配置Servlet的Mapping URL。
(4)參考書本上關(guān)于Filter的描述,編寫一個用于用戶認證的過濾器。如果管理員即后臺所有頁面都有“/admin”,如管理員登陸頁面http://localhost:8088/admin/login.jsp,要求攔截/admin的頁面進行認證(登陸界面除外),如果用戶沒有認證則跳轉(zhuǎn)到登陸頁面。要求:
(1)學(xué)會配置JDBC編程環(huán)境;(2)學(xué)會使用Eclipse的各種調(diào)試方法;
(3)熟練掌握JSP、JavaBean與Servlet綜合編程的使用。
程序清單:
(建議程序中適當(dāng)添加注釋信息,增強可讀性;較長程序可分欄書寫,保證報告排版整潔美觀。)
(實驗三程序清單續(xù)1)
(實驗三程序清單續(xù)2)
(實驗三程序清單續(xù)3)
四、實驗結(jié)果與分析
實驗項目名稱: SSH框架編程 實驗學(xué)時: 8 同組學(xué)生姓名: ———— 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間:
一、實驗?zāi)康暮鸵?/p>
(1)熟練掌握Hibernate框架編程技術(shù);(2)熟練掌握Struts2框架編程技術(shù);(3)熟練掌握Spring框架編程技術(shù);(4)熟練掌握以上三種框架綜合編程技術(shù);
(5)調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;
(6)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;(7)做完實驗后給出本實驗的實驗報告。
二、實驗儀器和設(shè)備
奔4以上計算機,Windows 操作系統(tǒng),裝有JDK1.7,MySQL,Tomcat6和Eclipse軟件。
三、實驗內(nèi)容及過程
(1)使用Hibernate將顧客表中的內(nèi)容輸出到JSP頁面中,要求實現(xiàn)以下功能:
? 將如下的數(shù)據(jù)庫腳本在MySQL中執(zhí)行,數(shù)據(jù)庫為MyDB; create table customers(customerid char(8)primary key, name char(40)default null, phone char(16)default null);? 在項目中加入Hibernate支持并生成映射文件,映射類以及HibernateSessionFactory類。再創(chuàng)建一個Dao類讀取顧客表中所有記錄返回集合List
(2)使用Hibernate對多表進行關(guān)聯(lián)操作。對數(shù)據(jù)庫腳本中的職工表與部門表進行級聯(lián)操作。要求實現(xiàn)以下功能: ? ? 可以根據(jù)部門編號查詢部門及其查詢該部門下的所有職工信息;
刪除部門時級聯(lián)刪除部門下的所有職工??紤]當(dāng)刪除部門時不想刪除該部門的職工而只將職工中的部門編號置為空,應(yīng)該怎么設(shè)置。
(3)使用Struts2實現(xiàn)以下用戶登陸功能:
? 完成一個用戶登錄,用戶名以及密碼為必填項。使用 Action中的validate函數(shù)進行驗證。體會Struts2基本流程; ? 當(dāng)用戶輸入的用戶名不是 admin或密碼不是 12345時要求用戶重新登錄,并給出錯誤提示。當(dāng)用戶填寫正確時,導(dǎo)向一個成功頁面顯示用戶登錄成功; ? 結(jié)合使用Hibernate將用戶信息保存到數(shù)據(jù)庫中; ? 利用Struts標簽 bean 以及l(fā)ogic標簽,將數(shù)據(jù)庫中的表Customer中的內(nèi)容輸出,在頁面中輸出成表格,使用Hibernate讀寫數(shù)據(jù)庫。
(4)Struts國際化試驗,改造上述實驗。當(dāng)用戶名或密碼未輸入,在中文環(huán)境下顯示中文,在英文環(huán)境下顯示英文錯誤信息。注意:編寫兩個資源文件。
(5)編寫圖形接口Shape,該接口中有抽象函數(shù)計算面積double area();編寫圓類Circle與矩形類Rectange實現(xiàn)該接口。再編寫一個ShapeDao類,將Shape接口作為其屬性。通過Spring配置JavaBean,實現(xiàn)Bean的動態(tài)注入。即只需改變注入的Bean就可以計算不同圖形的面積。
(6)完成網(wǎng)上成績錄入系統(tǒng)綜合實驗。實驗要求讀取數(shù)據(jù)庫中學(xué)生表、課程表和選課表中的內(nèi)容,動態(tài)形成表單;教師可以登陸系統(tǒng)錄入學(xué)生成績。其中總評成績=平時成績*30% +期末成績*70%,各項成績?yōu)榘俜种啤? 教師登陸界面;
圖14.16 教師登陸界面參考
? 登陸成功后選擇所要錄入的課程;
圖14.17 教師選擇課程界面參考
? 錄入成績界面;
圖14.18 教師錄入成績界面參考 ? 點擊“保存成績”,則向數(shù)據(jù)庫中寫入輸入的成績。要求:
(1)學(xué)會SSH框架編程環(huán)境;
(2)學(xué)會使用Eclipse的各種調(diào)試方法;
(3)熟練掌握Hibernate、Struts與Spring綜合編程的使用。
程序清單:
(建議程序中適當(dāng)添加注釋信息,增強可讀性;較長程序可分欄書寫,保證報告排版整潔美觀。)
(實驗四程序清單續(xù)1)
(實驗四程序清單續(xù)2)
四、實驗結(jié)果與分析
第二篇:JavaEE學(xué)習(xí)順序
JavaEE學(xué)習(xí)順序
第一階段:java基礎(chǔ)
技術(shù):
1.java語法 2.面向?qū)ο?3.常用的api 4.界面編程 5.多線程 6.文件io 7.java網(wǎng)絡(luò)編程 視頻:
張孝祥 或者馬士兵java視頻 書籍:
《java2核心技術(shù)一二卷》 《java編程思想》研讀,精讀 《java模式》
第二階段:數(shù)據(jù)庫
技術(shù):
1.oracle——主要的 2.mysql 3.sql server 視頻: 韓順平oracle視頻 書籍:Oracle使用教程
深入淺出Oracle 第三階段:web開發(fā)
技術(shù):
1.html 2.css 3.javascript 視頻:
張孝祥 JavaScript視頻 書籍:
張孝祥配套書籍《JavaScript網(wǎng)頁開發(fā)》 別具光芒
孫鑫《HTML語言速成》
第四階段:JavaEE中級
技術(shù):
1.servet 2.jsp 3.mvc 服務(wù)器:tomcat、jboss、weblogic、websphere 視頻:
韓順平servlet—jsp視頻 書籍: oreilly公司《jsp設(shè)計》《java servlet編程》
第五階段:JavaEE高級
技術(shù)
1.struts 2.hibernate 3.spring 視頻:
美河圖書《Servlet與JSP核心編程》
張小靜 Struts視頻
孫衛(wèi)琴《精通Struts基于MVC的Java.Web設(shè)計與開發(fā)》 李興華 Hibernate視頻
孫衛(wèi)琴《精通Java對象持久化技術(shù)詳解》
第六階段:其他流行技術(shù)
技術(shù):
Xml ajax(jquery,dw)Junit ant Ejb
Enterprise JavaBeans技術(shù)2.0
Java消息服務(wù)(JMS)1.0
Java命名目錄接口(JNDI)1.2
Java事務(wù)API(JTA)1.0
JavaMail API 1.2
JavaBeans激活架構(gòu)(JAF)1.0
J2EE連接器體系結(jié)構(gòu)(JCA)1.0
Java認證和授權(quán)服務(wù)(JAAS)1.0
書籍: 《精通ejb》
常見的j2eeAPI:
JavaServer Pages(JSP)技術(shù)1.2
Java Servlet技術(shù)2.3
JDBC API 2.0
Java XML處理API(JAXP)1.1
Enterprise JavaBeans技術(shù)2.0
Java消息服務(wù)(JMS)1.0
Java命名目錄接口(JNDI)1.2
Java事務(wù)API(JTA)1.0
JavaMail API 1.2
JavaBeans激活架構(gòu)(JAF)1.0
J2EE連接器體系結(jié)構(gòu)(JCA)1.0
Java認證和授權(quán)服務(wù)(JAAS)1.0
第三篇:JavaEE學(xué)習(xí)心得與總結(jié)
學(xué)習(xí)Java EE 心得體會
這學(xué)期通過對Java EE五部分的學(xué)習(xí),掌握了java 的基本開發(fā)方法,學(xué)習(xí)JavaEE 基礎(chǔ)部分分為6大部分,分別是基礎(chǔ)服務(wù),Java Web開發(fā),Web Service,JSF框架,EJB部分和JPA。
其中第一部分是基礎(chǔ)服務(wù)部分,此部分包括六章:第一章是概述,介紹了java EE 的發(fā)展歷史,架構(gòu),組件,服務(wù),容器等概念,并介紹了平臺角色以及開發(fā)環(huán)境和應(yīng)用服務(wù)的選擇與安裝。第二章講了使用JNDI 訪問明明和目錄服務(wù),介紹了什么是命名和服務(wù)目錄,以及如何通過JNDI 訪問Weblogic 提供的命名目錄服務(wù)。
第三章 講了使用JDBC 訪問數(shù)據(jù)庫,介紹了JDBC的基本用法以及連接池的配置和訪問。第四章講了使用JTA 進行事物處理,介紹了事物處理概念以及如何通過JTA進行事務(wù)處理。第五章 RMI :遠程方法調(diào)用,介紹了RMI 的結(jié)構(gòu)以及如何使用RMI進行編程。第六章,使用JMS接發(fā)消息,介紹了消息服務(wù)的概念,在Weblogic 中消息服務(wù)相關(guān)的配置以及如何通過JMS開發(fā)消息發(fā)送和接受程序。
J2EE是一種技術(shù),旨在簡化企業(yè)應(yīng)用程序的設(shè)計和實施。在本教程中,您將學(xué)習(xí)J2EE是什么,它的好處,J2EE的主要組成部分,企業(yè)應(yīng)用框架的演變,為什么要使用J2EE,J2EE平臺架構(gòu),J2EE API和技術(shù)和J2EE參考實現(xiàn)。在繼續(xù)之前,我們的J2EE討論讓定義企業(yè)應(yīng)用程序是什么。企業(yè)應(yīng)用程序是一個應(yīng)用程序,它可能要繼續(xù)使用他們,同時添加或遷移到一個新的利用互聯(lián)網(wǎng),電子商務(wù)等新技術(shù)的應(yīng)用,集傳統(tǒng)的現(xiàn)有應(yīng)用程序和數(shù)據(jù)庫。
Java EE 架構(gòu)分為四層,客戶端層,Web層,EJB層和數(shù)據(jù)庫層,其中,數(shù)據(jù)庫層為系統(tǒng)提供數(shù)據(jù)存儲和數(shù)據(jù)庫管理功能,在整個企業(yè)級應(yīng)用中可能村愛很多個數(shù)據(jù)庫,并且采用不同類型的數(shù)據(jù)庫管理系統(tǒng)進行管理。EJB層也稱為業(yè)務(wù)邏輯層,用于完成系統(tǒng)中復(fù)雜的或者共享的業(yè)務(wù),這些功能主要是提供客戶端層和Web層調(diào)用,用戶不會直接調(diào)用該層。Web層是基于HTTP 的訪問方式,客戶通過Web層訪問系統(tǒng)的業(yè)務(wù)邏輯和數(shù)據(jù)等。客戶端層包括Applet客戶端和Application客戶端,客戶通過客戶端的形式訪問系統(tǒng)的業(yè)務(wù)邏輯和數(shù)據(jù)等。邏輯中的四層可能不同時出現(xiàn)在系統(tǒng)中,例如某個系統(tǒng)可能只提供Web形式的客戶端,并且不使用EJB技術(shù),此時系統(tǒng)圖只留下Web層和數(shù)據(jù)庫層。
Java運行環(huán)境定義了五種類型的應(yīng)用組件,包括客戶端組件Application和Applet,Web層組件JSP和Servlet,EJB組件等,這些組件類型是Java EE 產(chǎn)品必須支持的。
其中的JPA是我學(xué)習(xí)的重點。JPA包括以下3方面的技術(shù):(1).ORM映射元數(shù)據(jù),JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對象和表之間的映射關(guān)系,框架據(jù)此將實體對象持久化到數(shù)據(jù)庫表中.(2).JPA 的API,用來操作實體對象,執(zhí)行CRUD操作,框架在后臺替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。(3).查詢語言,這是持久化操作中很重要的一個方面,通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù),避免程序的SQL語句緊密耦合。JPA的優(yōu)勢包括:1 標準化,JPA 是 JCP 組織發(fā)布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構(gòu),提供相同的訪問 API,這保證了基于JPA開發(fā)的企業(yè)應(yīng)用能夠經(jīng)過少量的修改就能夠在不同的JPA框架下運行。2 對容器級特性的支持,JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級事務(wù),這使得 JPA 超越了簡單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。3 簡單易用,集成方便,JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創(chuàng)建實體和創(chuàng)建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規(guī)則和設(shè)計模式的要求,開發(fā)者可以很容易的掌握。JPA基于非侵入式原則設(shè)計,因此可以很容易的和其它框架或者容器集成。4 可媲美JDBC的查詢能力,JPA的查詢語言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的,它以面向?qū)ο蟮淖匀徽Z法構(gòu)造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關(guān)系數(shù)據(jù)庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。5 支持面向?qū)ο蟮母呒壧匦?,JPA 中能夠支持面向?qū)ο蟮母呒壧匦裕珙愔g的繼承、多態(tài)和類之間的復(fù)雜關(guān)系,這樣的支持能夠讓開發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫的持久化。
第二部分是Java Web 開發(fā),其中第七章主要講了Java Web應(yīng)用概述,介紹Java Web的主要技術(shù),發(fā)展歷史,文檔結(jié)構(gòu),并通過一個簡單的例子介紹了Servlet和JSP的運行原理。第八章主要講了JSP的基本語法,對JSP的基本語法,指令,動作,內(nèi)部對象和如何在MyEclipse中開發(fā)進行了介紹。第九章主要講了JavaServlet技術(shù),介紹如何編寫Servlet,如何使用Servlet與客戶端進行交互以及Servlet過濾器和Servle監(jiān)聽器的使用。第十章主要講EL,介紹EL的基本用法。其中的JSP是我學(xué)習(xí)的重點。JSP技術(shù)使用Java編成語言編寫類XML的tags和scriptlets,來封裝產(chǎn)生動態(tài)網(wǎng)頁的處理邏輯。網(wǎng)頁還能通過tags和scriptlets訪問存在于服務(wù)端的資源的應(yīng)用邏輯。JSP將網(wǎng)頁邏輯與網(wǎng)頁設(shè)計和顯示分離,支持可重用的基于組件的設(shè)計,使基于Web的應(yīng)用程序的開發(fā)變得迅速和容易。Web服務(wù)器在遇到訪問JSP網(wǎng)頁的請求時,首先執(zhí)行其中的程序段,然后將執(zhí)行結(jié)果連同JSP文件中的HTML代碼一起返回給客戶。插入的Java程序段可以操作數(shù)據(jù)庫、重新定向網(wǎng)頁等,以實現(xiàn)建立動態(tài)網(wǎng)頁所需要的功能。JSP與JavaServlet一樣,是在服務(wù)器端執(zhí)行的,通常返回給客戶端的就是一個HTML文本,因此客戶端只要有瀏覽器就能瀏覽。JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。服務(wù)器在頁面被客戶端請求以后對這些Java代碼進行處理,然后將生成的HTML頁面返回給客戶端的瀏覽器。Java Servlet是JSP的技術(shù)基礎(chǔ),而且大型的Web應(yīng)用程序的開發(fā)需要Java Servlet和JSP配合才能完成。JSP具備了Java技術(shù)的簡單易用,完全的面向?qū)ο?,具有平臺無關(guān)性且安全可靠,主要面向因特網(wǎng)的所有特點。利用JSP技術(shù),動態(tài)信息由JSP頁面來表現(xiàn),JSP頁面由安裝在Web服務(wù)器或者使用JSP的應(yīng)用服務(wù)器上的JSP引擎執(zhí)行。JSP引擎接受客戶端對JSP頁面的請求,并且生成JSP頁面作為對客戶端的響應(yīng)。JSP頁面通常被編譯成為Java Servlets,這是一個標準的Java擴展。頁面開發(fā)人員能夠訪問全部的Java應(yīng)用環(huán)境,以利用Java技術(shù)的擴展性和可移植性。當(dāng)JSP頁面第一次被調(diào)用時,如果它還不存在,就會被編譯成為一個Java Servlets類,并且存儲在服務(wù)器的內(nèi)存中。這就使得在接下來的對該頁面的調(diào)用中,服務(wù)器會有非??斓捻憫?yīng)(這避免了CGI-BIN為每個HTTP請求生成一個新的進程的問題)。JSP頁面可以包含在多種不同的應(yīng)用體系結(jié)構(gòu)或者模型中,可以用于由不同協(xié)議、組件和格式所組成的聯(lián)合體中?;贘SP的動態(tài)信息發(fā)布技術(shù)是一個開放的、可擴展的建立動態(tài)Web頁面的標準。不論采用什么創(chuàng)建工具,開發(fā)人員都可以使用JSP頁面來創(chuàng)建可移植的Web應(yīng)用,在不同的Web應(yīng)用服務(wù)器上運行。
第三部分主要講Web Service,本部分內(nèi)容主要包括三章。第十三章主要講Web Service概述沒介紹了什么是Web Service以及相關(guān)概念,包括WSDL,SOAP和UDDI.第十四章主要講Java EE 對Web Service的支持,包括JAXR,JAXB和SAAJ.第十五章主要是使用JAX-WS開發(fā)Web Service,介紹如何使用JAX-WS 編寫WebService以及訪問WebService的客戶端,包括在MyEcilipse中的開發(fā)。Webservice 的概念是使用一個標準的輸出接口來定義代碼提供的功能,以便讓外界可以通過這個標準的輸出接口來調(diào)用,而所謂的標準輸出接口就是wsdl,wsdl是一個xml組成的文件,描述了實現(xiàn)程序?qū)ν馓峁┖瘮?shù)的原型,客戶端可以通過wsdl來調(diào)用實現(xiàn)程序提供的服務(wù)代碼。
第四部分主要講了JSF 框架,內(nèi)容包括五章。第十六章講了JSF概述,介紹了JSF 的體系結(jié)構(gòu),JSF的組成和生命周期等。第十七章將了一個簡單的JSF應(yīng)用,介紹了在MyEclipse中如何開發(fā)JSF應(yīng)用。第十八章主要講了UI組件,介紹了JSF提供的界面控件。第十九章主要講了在JSP中使用JSF,介紹了本地化,轉(zhuǎn)換器,時間監(jiān)聽器,驗證器和導(dǎo)航的使用。第二十章主要是Bean,介紹了輔助Bean的配置,訪問和編寫。
在這部分中我主要學(xué)習(xí)了怎樣使用JSF編程,其過程主要包括以下幾點:第一步,創(chuàng)建web工程J2ee下創(chuàng)建web project,這沒什么說的了,不過以前在eclipse中總是不知道怎么創(chuàng)建web應(yīng)用,夠傻的,原來需要插件,在myeclipse提供了全套的插件。不過Myeclipse需要破解。中國程序員似乎很少用正版的。言歸正傳,Myeclipse中需要在Open Perspective中選擇J2ee enterprse視圖。然后創(chuàng)建web project。這跟delphi的New一個project不太一樣,delphi把所有可以new的都放在一個窗口中,而eclipse有不同的視圖來提供管理,這算一種進步吧,插件化的進步。接下來需要 Add JSF Capability,因為這個類庫(不知道是否應(yīng)該稱為類庫)支撐了JSF開發(fā)需要的組件。第二步,創(chuàng)建bean.在New-àother中的Myeclipse-àweb-JSF下有managed bean,創(chuàng)建bean可以連Java類文件一起創(chuàng)建,且可以將需要的屬性一起完成,myeclipse可以自動完成屬性的get,set方法。是個比較酷的功能。第三步,創(chuàng)建,編輯jsp文件.在工程的webroot-->web-inf下面有一個facesconfig.xml文件,這個文件是Javabean的管理文件,同時它管理了頁面之間的切換關(guān)系,起到導(dǎo)航頁面的作用。有趣的是這個文件居然有個漂亮的design界面,可以在上面創(chuàng)建新的jsp文件,且可以用拖拽方式定義頁面之間的關(guān)系,讓所有頁面的關(guān)系看起來很直觀。感覺這里是個很酷的設(shè)計。頁面的導(dǎo)航是根據(jù)一個字符串來作為判斷依據(jù)的,所以在配置導(dǎo)航關(guān)系時,只要設(shè)定From outcome的值為調(diào)用bean方法的返回值即可。值得注意的是,JSF對于導(dǎo)航值只允許string類型。Jsp頁面的編寫其實很方便,即使不太懂,因為myeclipse提供了拖拽式的頁面設(shè)計,如果熟練直接寫代碼也很好玩吧。我以前一直很討厭html的代碼,因為覺得太機械了,且不好記憶,這會得硬著頭皮學(xué)了,不過在這種拖拽式的設(shè)計中可以省不少力氣。記得jsp中使用Java采用””的方式,這會是:”#{}” 直接以bean來調(diào)用。第四步,本地化.如果需要考慮國際化的問題,那么需要創(chuàng)建一個.properties的文件,否則可以跳過這里。.properties文件需要創(chuàng)建到源碼文件的目錄下,否則在指定位置時便會找不到它。.properties文件的配置非常簡單,如同一個ini文件。如:“username=user name”, 如果要顯示中文的話,這里需要轉(zhuǎn)化為unicode,jdk帶了一個native2ascii的小工具可以輕松轉(zhuǎn)換,不過這個玩意每次復(fù)制的時候都要先將編輯設(shè)為“標記”。不知道有沒有更方便的工具。另外如果要支持中文的.properties文件需要以_zh_CN結(jié)尾才行。在jsp文件中使用下面形式定義:然后就如同Java中的類一樣使用了.第五部分主要是EJB部分,內(nèi)容包括四章,地二十一章介紹了EJB 的目標,發(fā)展歷史,特點,角色,分類以及變成規(guī)約。第二十二章主要對會話Bean的開發(fā)以及運行原理進行了介紹。第二十三章介紹了消息驅(qū)動Bean以及客戶端程序的編寫。第二十四章講解了如何訪問數(shù)據(jù)源,定時服務(wù)和事務(wù)處理對象。其中EJB為學(xué)習(xí)的重點,EJB(Enterprise JavaBean)是J2EE的一部分,定義了一個用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的標準。其特點包括網(wǎng)絡(luò)服務(wù)支持和核心開發(fā)工具(SDK)。在J2EE里,Enterprise Java Beans(EJB)稱為Java 企業(yè)柄,是Java的核心代碼,分為整體柄和片段柄和消息柄三個部分,其中的消息柄將在以后再作討論。EJB是sun的服務(wù)器端組件模型,最大的用處是部署。
第四篇:javaEE個人心得體會范文
Java EE架構(gòu)與程序設(shè)計大作業(yè)心得體會
大作業(yè)題目:
基于web的教務(wù)管理系統(tǒng)
學(xué)號:
姓名:
組別:
本次javaEE課程設(shè)計我們這組做的課題是基于web的教務(wù)管理系統(tǒng),我們組將整個系統(tǒng)設(shè)計成基于SSH的教務(wù)管理系統(tǒng),系統(tǒng)總共分為三個角色:學(xué)生、教師、管理員。整個系統(tǒng)我們小組成員在組長的帶領(lǐng)下實現(xiàn)了:學(xué)生登陸該系統(tǒng)可以查看個人信息,查看可選課程,查詢成績,選課等操作。教師登陸該系統(tǒng)可以實現(xiàn)查看個人信息,查看選課情況,錄入學(xué)生成績等操作。管理員登陸該系統(tǒng),可以實現(xiàn)修改學(xué)生或老師信息,增加學(xué)生或教師信息等操作。
通過這次課程設(shè)計,使我靈活應(yīng)用所學(xué)javaEE知識,和小組成員一起完成問題分析,結(jié)合javaEE理論知識,編寫程序?qū)崿F(xiàn)系統(tǒng)所需功能。初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能;提高綜合運用所學(xué)的理論知識和方法分析和解決問題的能力;并用系統(tǒng)的的觀點進行系統(tǒng)設(shè)計,鞏固、深化學(xué)生的理論知識,提高編程水平,并在此過程中培養(yǎng)我們嚴謹?shù)目茖W(xué)態(tài)度和良好的編程風(fēng)格。進一步加深對SSH框架的知識的理解,并能夠利用SSH框架的知識實現(xiàn)教務(wù)管理系統(tǒng)。同時在這學(xué)期的實驗中,培養(yǎng)了以專業(yè)的眼光去對待我們系統(tǒng)中的每一段代碼,這算是一次不可多得的實踐機會。在這一次的實踐過程中,不論是個人動手能力,還是團隊合作能力,方方面面都得到了一定程度的提高。在這個過程中,我學(xué)會了很多學(xué)習(xí)的方法。而這是日后最實用
也是最寶貴的。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實踐,再學(xué)習(xí)、再實踐。這對于我們的將來也有很大的幫助。
這次實驗我們根據(jù)組長分配的任務(wù),在組長的帶領(lǐng)下,我們小組成功實現(xiàn)了教務(wù)管理系統(tǒng)。在系統(tǒng)設(shè)計過程中,與同學(xué)分工設(shè)計,和同學(xué)們相互探討,相互學(xué)習(xí),相互監(jiān)督。學(xué)會了合作,學(xué)會了寬容,學(xué)會了理解,也學(xué)會了做人與處世。課程設(shè)計是是一次模擬的社會實踐,是我們邁向社會,從事職業(yè)工作前一個必不少的過程。實驗過程中,也十分感謝張永定老師的指點與教導(dǎo)。這次課程設(shè)計不僅是對這學(xué)期所學(xué)知識的一種綜合檢驗,而且也是對自己動手能力的一種提高,增強了自己實踐能力。通過這次課程設(shè)計使我明白了自己知識還比較欠缺,只是學(xué)習(xí)書本知識還是遠遠不夠的,自己不會的東西還有太多,學(xué)習(xí)需要自己長期的積累,在以后的學(xué)習(xí)、工作中都應(yīng)該不斷的學(xué)習(xí),將課本的理論知識與生活中的實踐知識相結(jié)合,不斷提高自己文化知識和實踐能力。
第五篇:JAVAEE基礎(chǔ)總結(jié)(showdy)
Java基礎(chǔ)知識總結(jié)(超級經(jīng)典)
寫代碼:
1,明確需求。我要做什么? 2,分析思路。我要怎么做?1,2,3。
3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。4,代碼實現(xiàn)。用具體的java語言代碼把思路體現(xiàn)出來。
學(xué)習(xí)新技術(shù)的四點: 1,該技術(shù)是什么?
2,該技術(shù)有什么特點(使用注意): 3,該技術(shù)怎么使用。demo 4,該技術(shù)什么時候用?test。
--一:java概述:
1991 年Sun公司的James Gosling等人開始開發(fā)名稱為 Oak 的語言,希望用于控制嵌入在有線電視交換盒、PDA等的微處理器;
1994年將Oak語言更名為Java; DOS命令(掌握): DOS:磁盤操作系統(tǒng)。
DOS命令:是DOS操作系統(tǒng)的命令,是一種面向磁盤的操作命令,主要包括目錄操作類命令、磁盤操作類命令、文件操作類命令和其它命令。
DOS命令行:運行Dos命令的窗口。
A:盤符切換: d: 回車
/ 105
B:cd命令
cd 目錄 進入指定的單級目錄
cd d:目錄1目錄2...進入指定的多級目錄 cd..回退上一級目錄
cd 回到當(dāng)前所在盤符的根目錄
C:cls 清屏
Exit 退出
Java的三種技術(shù)架構(gòu): JAVAEE:Java Platform Enterprise Edition,開發(fā)企業(yè)環(huán)境下的應(yīng)用程序,主要針對web程序開發(fā); JAVASE:Java Platform Standard Edition,完成桌面應(yīng)用程序的開發(fā),是其它兩者的基礎(chǔ); JAVAME:Java Platform Micro Edition,開發(fā)電子消費產(chǎn)品和嵌入式設(shè)備,如手機中的程序;
1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工具和jre。
2,JRE:Java Runtime Environment,java程序的運行環(huán)境,java運行的所需的類庫+JVM(java虛擬機)。3,配置環(huán)境變量:讓java jdkbin目錄下的工具,可以在任意目錄下運行,原因是,將該工具所在目錄告訴了系統(tǒng),當(dāng)使用該工具時,由系統(tǒng)幫我們?nèi)フ抑付ǖ哪夸?。環(huán)境變量的配置:
1):永久配置方式:JAVA_HOME=%安裝路徑%Javajdk path=%JAVA_HOME%bin 2):臨時配置方式:set path=%path%;C:Program FilesJavajdkbin 特點:系統(tǒng)默認先去當(dāng)前路徑下找要執(zhí)行的程序,如果沒有,再去path中設(shè)置的路徑下找。
classpath的配置: 1):永久配置方式:classpath=.;c:;e:
2):臨時配置方式:set classpath=.;c:;e:
/ 105
注意:在定義classpath環(huán)境變量時,需要注意的情況
如果沒有定義環(huán)境變量classpath,java啟動jvm后,會在當(dāng)前目錄下查找要運行的類文件; 如果指定了classpath,那么會在指定的目錄下查找要運行的類文件。還會在當(dāng)前目錄找嗎?兩種情況:
4,javac命令和java命令做什么事情呢?
要知道java是分兩部分的:一個是編譯,一個是運行。
javac:負責(zé)的是編譯的部分,當(dāng)執(zhí)行javac時,會啟動java的編譯器程序。對指定擴展名的.java文件進1):如果classpath的值結(jié)尾處有分號,在具體路徑中沒有找到運行的類,會默認在當(dāng)前目錄再找一次。2):如果classpath的值結(jié)果出沒有分號,在具體的路徑中沒有找到運行的類,不會再當(dāng)前目錄找。一般不指定分號,如果沒有在指定目錄下找到要運行的類文件,就報錯,這樣可以調(diào)試程序。
行編譯。生成了jvm可以識別的字節(jié)碼文件。也就是class文件,也就是java的運行程序。
java:負責(zé)運行的部分.會啟動jvm.加載運行時所需的類庫,并對class文件進行執(zhí)行.一個文件要被執(zhí)行,必須要有一個執(zhí)行的起始點,這個起始點就是main函數(shù).運算符號:
1)、算術(shù)運算符。
+b;b = 3;a = a1;
if(max return-1; mid =(max+min)>>1;} / 105 return mid;}--------------------------java分了5片內(nèi)存。 1:寄存器。2:本地方法區(qū)。3:方法區(qū)。4:棧。5:堆。 棧:存儲的都是局部變量(函數(shù)中定義的變量,函數(shù)上的參數(shù),語句中的變量); 只要數(shù)據(jù)運算完成所在的區(qū)域結(jié)束,該數(shù)據(jù)就會被釋放。 堆:用于存儲數(shù)組和對象,也就是實體。啥是實體???就是用于封裝多個數(shù)據(jù)的。 1:每一個實體都有內(nèi)存首地址值。 2:堆內(nèi)存中的變量都有默認初始化值。因為數(shù)據(jù)類型不同,值也不一樣。3:垃圾回收機制。 -三:面向?qū)ο螅骸铩铩铩铩?/p> 特點:1:將復(fù)雜的事情簡單化。 2:面向?qū)ο髮⒁郧暗倪^程中的執(zhí)行者,變成了指揮者。3:面向?qū)ο筮@種思想是符合現(xiàn)在人們思考習(xí)慣的一種思想。 過程和對象在我們的程序中是如何體現(xiàn)的呢?過程其實就是函數(shù);對象是將函數(shù)等一些內(nèi)容進行了封裝。 匿名對象使用場景: 1:當(dāng)對方法只進行一次調(diào)用的時候,可以使用匿名對象。如:new Person().age = 17;//使用一次之后就被銷毀了。 2:當(dāng)對象對成員進行多次調(diào)用時,不能使用匿名對象。必須給對象起名字。 3.可作為實際參數(shù)進行傳遞;只在堆里面開辟存儲區(qū)域, 如:method(new Person()); 在類中定義其實都稱之為成員。成員有兩種: 1:成員變量:其實對應(yīng)的就是事物的屬性。 / 105 2:成員函數(shù):其實對應(yīng)的就是事物的行為。 所以,其實定義類,就是在定義成員變量和成員函數(shù)。但是在定義前,必須先要對事物進行屬性和行為的分析,才可以用代碼來體現(xiàn)。 private int age;//私有的訪問權(quán)限最低,只有在本類中的訪問有效。注意:私有僅僅是封裝的一種體現(xiàn)形式而已。 私有的成員:其他類不能直接創(chuàng)建對象訪問,所以只有通過本類對外提供具體的訪問方式來完成對私有的訪問,可以通過對外提供函數(shù)的形式對其進行訪問。 好處:可以在函數(shù)中加入邏輯判斷等操作,對數(shù)據(jù)進行判斷等操作。 總結(jié):開發(fā)時,記住,屬性是用于存儲數(shù)據(jù)的,直接被訪問,容易出現(xiàn)安全隱患,所以,類中的屬性通常被私有化,并對外提供公共的訪問方法。 這個方法一般有兩個,規(guī)范寫法:對于屬性 xxx,可以使用setXXX(),getXXX()對其進行操作。 類中怎么沒有定義主函數(shù)呢? 注意:主函數(shù)的存在,僅為該類是否需要獨立運行,如果不需要,主函數(shù)是不用定義的。主函數(shù)的解釋:保證所在類的獨立運行,是程序的入口,被jvm調(diào)用。 成員變量和局部變量的區(qū)別: 1:成員變量直接定義在類中。 局部變量定義在方法中,參數(shù)上,語句中。2:成員變量在這個類中有效。 局部變量只在自己所屬的大括號內(nèi)有效,大括號結(jié)束,局部變量失去作用域。3:成員變量存在于堆內(nèi)存中,隨著對象的產(chǎn)生而存在,消失而消失。局部變量存在于棧內(nèi)存中,隨著所屬區(qū)域的運行而存在,結(jié)束而釋放。 / 105 構(gòu)造函數(shù):用于給對象進行初始化,是給與之對應(yīng)的對象進行初始化,它具有針對性,函數(shù)中的一種。特點: 1:該函數(shù)的名稱和所在類的名稱相同。2:不需要定義返回值類型。3:該函數(shù)沒有具體的返回值。 記住:所有對象創(chuàng)建時,都需要初始化才可以使用。 注意事項:一個類在定義時,如果沒有定義過構(gòu)造函數(shù),那么該類中會自動生成一個空參數(shù)的構(gòu)造函數(shù),為了方便該類創(chuàng)建對象,完成初始化。如果在類中自定義了構(gòu)造函數(shù),那么默認的構(gòu)造函數(shù)就沒有了。 一個類中,可以有多個構(gòu)造函數(shù),因為它們的函數(shù)名稱都相同,所以只能通過參數(shù)列表來區(qū)分。所以,一個類中如果出現(xiàn)多個構(gòu)造函數(shù)。它們的存在是以重載體現(xiàn)的。 構(gòu)造函數(shù)和一般函數(shù)有什么區(qū)別呢? 1:兩個函數(shù)定義格式不同。 2:構(gòu)造函數(shù)是在對象創(chuàng)建時,就被調(diào)用,用于初始化,而且初始化動作只執(zhí)行一次。 一般函數(shù),是對象創(chuàng)建后,需要調(diào)用才執(zhí)行,可以被調(diào)用多次。 什么時候使用構(gòu)造函數(shù)呢? 分析事物時,發(fā)現(xiàn)具體事物一出現(xiàn),就具備了一些特征,那就將這些特征定義到構(gòu)造函數(shù)內(nèi)。 構(gòu)造代碼塊和構(gòu)造函數(shù)有什么區(qū)別? 構(gòu)造代碼塊:是給所有的對象進行初始化,也就是說,所有的對象都會調(diào)用一個代碼塊。只要對象一建立。就會調(diào)用這個代碼塊。 構(gòu)造函數(shù):是給與之對應(yīng)的對象進行初始化。它具有針對性。 / 105 Person p = new Person();創(chuàng)建一個對象都在內(nèi)存中做了什么事情? 1:先將硬盤上指定位置的Person.class文件加載進內(nèi)存。 2:執(zhí)行main方法時,在棧內(nèi)存中開辟了main方法的空間(壓棧-進棧),然后在main方法的棧區(qū)分配了一個變量p。 3:在堆內(nèi)存中開辟一個實體空間,分配了一個內(nèi)存首地址值。new 4:在該實體空間中進行屬性的空間分配,并進行了默認初始化。5:對空間中的屬性進行顯示初始化。6:進行實體的構(gòu)造代碼塊初始化。 7:調(diào)用該實體對應(yīng)的構(gòu)造函數(shù),進行構(gòu)造函數(shù)初始化。()8:將首地址賦值給p,p變量就引用了該實體。(指向了該對象)------------------------------封 裝(面向?qū)ο筇卣髦唬菏侵鸽[藏對象的屬性和實現(xiàn)細節(jié),僅對外提供公共訪問方式。 好處:將變化隔離;便于使用;提高重用性;安全性。 封裝原則:將不需要對外提供的內(nèi)容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。 this:代表對象。就是所在函數(shù)所屬對象的引用。 this到底代表什么呢?哪個對象調(diào)用了this所在的函數(shù),this就代表哪個對象,就是哪個對象的引用。開發(fā)時,什么時候使用this呢? 在定義功能時,如果該功能內(nèi)部使用到了調(diào)用該功能的對象,這時就用this來表示這個對象。 this 還可以用于構(gòu)造函數(shù)間的調(diào)用。調(diào)用格式:this(實際參數(shù)); this對象后面跟上.調(diào)用的是成員屬性和成員方法(一般方法); this對象后面跟上()調(diào)用的是本類中的對應(yīng)參數(shù)的構(gòu)造函數(shù)。 / 105 注意:用this調(diào)用構(gòu)造函數(shù),必須定義在構(gòu)造函數(shù)的第一行。因為構(gòu)造函數(shù)是用于初始化的,所以初始化動作一定要執(zhí)行。否則編譯失敗。 static:★★★ 關(guān)鍵字,是一個修飾符,用于修飾成員(成員變量和成員函數(shù))。 特點: 1,想要實現(xiàn)對象中的共性數(shù)據(jù)的對象共享??梢詫⑦@個數(shù)據(jù)進行靜態(tài)修飾。 2,被靜態(tài)修飾的成員,可以直接被類名所調(diào)用。也就是說,靜態(tài)的成員多了一種調(diào)用方式。類名.靜態(tài)方式。3,靜態(tài)隨著類的加載而加載。而且優(yōu)先于對象存在。 弊端: 1,有些數(shù)據(jù)是對象特有的數(shù)據(jù),是不可以被靜態(tài)修飾的。因為那樣的話,特有數(shù)據(jù)會變成對象的共享數(shù)據(jù)。這樣對事物的描述就出了問題。所以,在定義靜態(tài)時,必須要明確,這個數(shù)據(jù)是否是被對象所共享的。2,靜態(tài)方法只能訪問靜態(tài)成員,不可以訪問非靜態(tài)成員。 因為靜態(tài)方法加載時,優(yōu)先于對象存在,所以沒有辦法訪問對象中的成員。3,靜態(tài)方法中不能使用this,super關(guān)鍵字。 因為this代表對象,而靜態(tài)在時,有可能沒有對象,所以this無法使用。4,主函數(shù)是靜態(tài)的。 什么時候定義靜態(tài)成員呢?或者說:定義成員時,到底需不需要被靜態(tài)修飾呢? 成員分兩種: 1,成員變量。(數(shù)據(jù)共享時靜態(tài)化)該成員變量的數(shù)據(jù)是否是所有對象都一樣: 如果是,那么該變量需要被靜態(tài)修飾,因為是共享的數(shù)據(jù)。如果不是,那么就說這是對象的特有數(shù)據(jù),要存儲到對象中。2,成員函數(shù)。(方法中沒有調(diào)用特有數(shù)據(jù)時就定義成靜態(tài)) / 105 如果判斷成員函數(shù)是否需要被靜態(tài)修飾呢? 只要參考,該函數(shù)內(nèi)是否訪問了對象中的特有數(shù)據(jù): 如果有訪問特有數(shù)據(jù),那方法不能被靜態(tài)修飾。 如果沒有訪問過特有數(shù)據(jù),那么這個方法需要被靜態(tài)修飾。 成員變量和靜態(tài)變量的區(qū)別: 1,成員變量所屬于對象。所以也稱為實例變量。靜態(tài)變量所屬于類。所以也稱為類變量。2,成員變量存在于堆內(nèi)存中。靜態(tài)變量存在于方法區(qū)中。 3,成員變量隨著對象創(chuàng)建而存在。隨著對象被回收而消失。靜態(tài)變量隨著類的加載而存在。隨著類的消失而消失。4,成員變量只能被對象所調(diào)用。 靜態(tài)變量可以被對象調(diào)用,也可以被類名調(diào)用。 所以,成員變量可以稱為對象的特有數(shù)據(jù),靜態(tài)變量稱為對象的共享數(shù)據(jù)。 靜態(tài)的注意:靜態(tài)的生命周期很長。 靜態(tài)代碼塊:就是一個有靜態(tài)關(guān)鍵字標示的一個代碼塊區(qū)域。定義在類中。 作用:可以完成類的初始化。靜態(tài)代碼塊隨著類的加載而執(zhí)行,而且只執(zhí)行一次(new 多個對象就只執(zhí)行一次)。如果和主函數(shù)在同一類中,優(yōu)先于主函數(shù)執(zhí)行。 Public:訪問權(quán)限最大。 static:不需要對象,直接類名即可。void:主函數(shù)沒有返回值。Main:主函數(shù)特定的名稱。 / 105 (String[] args):主函數(shù)的參數(shù),是一個字符串?dāng)?shù)組類型的參數(shù),jvm調(diào)用main方法時,傳遞的實際參數(shù)是 new String[0]。 jvm默認傳遞的是長度為0的字符串?dāng)?shù)組,我們在運行該類時,也可以指定具體的參數(shù)進行傳遞。可以在控制臺,運行該類時,在后面加入?yún)?shù)。參數(shù)之間通過空格隔開。jvm會自動將這些字符串參數(shù)作為args數(shù)組中的元素,進行存儲。 靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)同時存在時的執(zhí)行順序:靜態(tài)代碼塊 ? 構(gòu)造代碼塊 ? 構(gòu)造函數(shù); 生成Java幫助文檔:命令格式:javadoc –d 文件夾名 –auther –version *.java /** //格式 *類描述 *@author 作者名 *@version 版本號 */ /** *方法描述 *@param 參數(shù)描述 *@return 返回值描述 */ 設(shè)計模式:解決問題最行之有效的思想。是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 java中有23種設(shè)計模式: 單例設(shè)計模式:★★★★★ 解決的問題:保證一個類在內(nèi)存中的對象唯一性。 比如:多程序讀取一個配置文件時,建議配置文件封裝成對象。會方便操作其中數(shù)據(jù),又要保證多個程序讀到的 17 / 105 是同一個配置文件對象,就需要該配置文件對象在內(nèi)存中是唯一的。 Runtime()方法就是單例設(shè)計模式進行設(shè)計的。 如何保證對象唯一性呢? 思想: 1,不讓其他程序創(chuàng)建該類對象。2,在本類中創(chuàng)建一個本類對象。 3,對外提供方法,讓其他程序獲取這個對象。 步驟: 1,因為創(chuàng)建對象都需要構(gòu)造函數(shù)初始化,只要將本類中的構(gòu)造函數(shù)私有化,其他程序就無法再創(chuàng)建該類對象; 2,就在類中創(chuàng)建一個本類的對象; 3,定義一個方法,返回該對象,讓其他程序可以通過方法就得到本類對象。(作用:可控) 代碼體現(xiàn): 1,私有化構(gòu)造函數(shù); 2,創(chuàng)建私有并靜態(tài)的本類對象; 3,定義公有并靜態(tài)的方法,返回該對象。--------------//餓漢式 class Single{ private Single(){} //私有化構(gòu)造函數(shù)。 private static Single s = new Single();//創(chuàng)建私有并靜態(tài)的本類對象。public static Single getInstance(){ //定義公有并靜態(tài)的方法,返回該對象。 return s;} } / 105 --------------//懶漢式:延遲加載方式。 class Single2{ private Single2(){} private static Single2 s = null;public static Single2 getInstance(){ if(s==null) s = new Single2(); return s;} }----繼 承(面向?qū)ο筇卣髦唬?/p> 好處: 1:提高了代碼的復(fù)用性。 2:讓類與類之間產(chǎn)生了關(guān)系,提供了另一個特征多態(tài)的前提。 父類的由來:其實是由多個類不斷向上抽取共性內(nèi)容而來的。 java中對于繼承,java只支持單繼承。java雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。 單繼承:一個類只能有一個父類。多繼承:一個類可以有多個父類。 為什么不支持多繼承呢? 因為當(dāng)一個類同時繼承兩個父類時,兩個父類中有相同的功能,那么子類對象調(diào)用該功能時,運行哪一個呢?因為父類中的方法中存在方法體。 但是java支持多重繼承。A繼承B B繼承C C繼承D。 多重繼承的出現(xiàn),就有了繼承體系。體系中的頂層父類是通過不斷向上抽取而來的。它里面定義的該體系最基本最共性內(nèi)容的功能。 所以,一個體系要想被使用,直接查閱該系統(tǒng)中的父類的功能即可知道該體系的基本用法。那么想要使用一個體系時,需要建立對象。建議建立最子類對象,因為最子類不僅可以使用父類中的功能。還可以使用子類特有 / 105 的一些功能。 簡單說:對于一個繼承體系的使用,查閱頂層父類中的內(nèi)容,創(chuàng)建最底層子類的對象。 子父類出現(xiàn)后,類中的成員都有了哪些特點: 1:成員變量。 當(dāng)子父類中出現(xiàn)一樣的屬性時,子類類型的對象,調(diào)用該屬性,值是子類的屬性值。 如果想要調(diào)用父類中的屬性值,需要使用一個關(guān)鍵字:super This:代表是本類類型的對象引用。 Super:代表是子類所屬的父類中的內(nèi)存空間引用。 注意:子父類中通常是不會出現(xiàn)同名成員變量的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。 2:成員函數(shù)。 當(dāng)子父類中出現(xiàn)了一模一樣的方法時,建立子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉一樣。所以這種情況,是函數(shù)的另一個特性:覆蓋(復(fù)寫,重寫)什么時候使用覆蓋呢?當(dāng)一個類的功能內(nèi)容需要修改時,可以通過覆蓋來實現(xiàn)。3:構(gòu)造函數(shù)。 發(fā)現(xiàn)子類構(gòu)造函數(shù)運行時,先運行了父類的構(gòu)造函數(shù)。為什么呢? 原因:子類的所有構(gòu)造函數(shù)中的第一行,其實都有一條隱身的語句super(); super(): 表示父類的構(gòu)造函數(shù),并會調(diào)用于參數(shù)相對應(yīng)的父類中的構(gòu)造函數(shù)。而super():是在調(diào)用父類中空參數(shù)的構(gòu)造函數(shù)。 為什么子類對象初始化時,都需要調(diào)用父類中的函數(shù)?(為什么要在子類構(gòu)造函數(shù)的第一行加入這個super()?)因為子類繼承父類,會繼承到父類中的數(shù)據(jù),所以必須要看父類是如何對自己的數(shù)據(jù)進行初始化的。所以子類在進行對象初始化時,先調(diào)用父類的構(gòu)造函數(shù),這就是子類的實例化過程。 / 105 注意:子類中所有的構(gòu)造函數(shù)都會默認訪問父類中的空參數(shù)的構(gòu)造函數(shù),因為每一個子類構(gòu)造內(nèi)第一行都有默認的語句super();如果父類中沒有空參數(shù)的構(gòu)造函數(shù),那么子類的構(gòu)造函數(shù)內(nèi),必須通過super語句指定要訪問的父類中的構(gòu)造函數(shù)。 如果子類構(gòu)造函數(shù)中用this來指定調(diào)用子類自己的構(gòu)造函數(shù),那么被調(diào)用的構(gòu)造函數(shù)也一樣會訪問父類中的構(gòu)造函數(shù)。 問題:super()和this()是否可以同時出現(xiàn)的構(gòu)造函數(shù)中。 兩個語句只能有一個定義在第一行,所以只能出現(xiàn)其中一個。 super()或者this():為什么一定要定義在第一行? 因為super()或者this()都是調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)用于初始化,所以初始化的動作要先完成。 繼承的細節(jié): 什么時候使用繼承呢? 當(dāng)類與類之間存在著所屬關(guān)系時,才具備了繼承的前提。a是b中的一種。a繼承b。狼是犬科中的一種。英文書中,所屬關(guān)系:“ is a ” 注意:不要僅僅為了獲取其他類中的已有成員進行繼承。 所以判斷所屬關(guān)系,可以簡單看,如果繼承后,被繼承的類中的功能,都可以被該子類所具備,那么繼承成立。如果不是,不可以繼承。 細節(jié)二: 在方法覆蓋時,注意兩點: 1:子類覆蓋父類時,必須要保證,子類方法的權(quán)限必須大于等于父類方法權(quán)限可以實現(xiàn)繼承。否則,編譯失敗。 / 105 2:覆蓋時,要么都靜態(tài),要么都不靜態(tài)。(靜態(tài)只能覆蓋靜態(tài),或者被靜態(tài)覆蓋) 繼承的一個弊端:打破了封裝性。對于一些類,或者類中功能,是需要被繼承,或者復(fù)寫的。這時如何解決問題呢?介紹一個關(guān)鍵字,final:最終。 final特點: 1:這個關(guān)鍵字是一個修飾符,可以修飾類,方法,變量。2:被final修飾的類是一個最終類,不可以被繼承。3:被final修飾的方法是一個最終方法,不可以被覆蓋。4:被final修飾的變量是一個常量,只能賦值一次。 其實這樣的原因的就是給一些固定的數(shù)據(jù)起個閱讀性較強的名稱。 不加final修飾不是也可以使用嗎?那么這個值是一個變量,是可以更改的。加了final,程序更為嚴謹。常量名稱定義時,有規(guī)范,所有字母都大寫,如果由多個單詞組成,中間用 _ 連接。 抽象類: abstract 抽象:不具體,看不明白。抽象類表象體現(xiàn)。 在不斷抽取過程中,將共性內(nèi)容中的方法聲明抽取,但是方法不一樣,沒有抽取,這時抽取到的方法,并不具體,需要被指定關(guān)鍵字abstract所標示,聲明為抽象方法。 抽象方法所在類一定要標示為抽象類,也就是說該類需要被abstract關(guān)鍵字所修飾。 抽象類的特點: 1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關(guān)鍵字修飾(可以描述類和方法,不可以描述變量)。 2:抽象方法只定義方法聲明,并不定義方法實現(xiàn)。3:抽象類不可以被創(chuàng)建對象(實例化)。 / 105 4:只有通過子類繼承抽象類并覆蓋了抽象類中的所有抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。 抽象類的細節(jié): 1:抽象類中是否有構(gòu)造函數(shù)?有,用于給子類對象進行初始化。2:抽象類中是否可以定義非抽象方法? 可以。其實,抽象類和一般類沒有太大的區(qū)別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數(shù)。而且比一般類少了一個創(chuàng)建對象的部分。 3:抽象關(guān)鍵字abstract和哪些不可以共存?final , private , static 4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創(chuàng)建對象。 --模板方法設(shè)計模式: 解決的問題:當(dāng)功能內(nèi)部一部分實現(xiàn)時確定,一部分實現(xiàn)是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現(xiàn)。 abstract class GetTime{ public final void getTime(){ //此功能如果不需要復(fù)寫,可加final限定 } public abstract void code();//抽象不確定的功能,讓子類復(fù)寫實現(xiàn) long start = System.currentTimeMillis();code();//不確定的功能部分,提取出來,通過抽象方法實現(xiàn) long end = System.currentTimeMillis();System.out.println(“毫秒是:”+(end-start));} class SubDemo extends GetTime{ public void code(){ //子類復(fù)寫功能方法 for(int y=0;y<1000;y++){ System.out.println(“y”);} / 105 } } 接 口:★★★★★ 1:是用關(guān)鍵字interface定義的。 2:接口中包含的成員,最常見的有全局常量、抽象方法。 注意:接口中的成員都有固定的修飾符。 成員變量:public static final 成員方法:public abstract interface Inter{ public static final int x = 3;public abstract void show();} 3:接口中有抽象方法,說明接口不可以實例化。接口的子類必須實現(xiàn)了接口中所有的抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。 4:類與類之間存在著繼承關(guān)系,類與接口中間存在的是實現(xiàn)關(guān)系。繼承用extends ;實現(xiàn)用implements ; 5:接口和類不一樣的地方,就是,接口可以被多實現(xiàn),這就是多繼承改良后的結(jié)果。java將多繼承機制通過多現(xiàn)實來體現(xiàn)。 6:一個類在繼承另一個類的同時,還可以實現(xiàn)多個接口。所以接口的出現(xiàn)避免了單繼承的局限性。還可以將類進行功能的擴展。 7:其實java中是有多繼承的。接口與接口之間存在著繼承關(guān)系,接口可以多繼承接口。 接口都用于設(shè)計上,設(shè)計上的特點:(可以理解主板上提供的接口) 1:接口是對外提供的規(guī)則。2:接口是功能的擴展。3:接口的出現(xiàn)降低了耦合性。 / 105 抽象類與接口: 抽象類:一般用于描述一個體系單元,將一組共性內(nèi)容進行抽取,特點:可以在類中定義抽象內(nèi)容讓子類實現(xiàn),可以定義非抽象內(nèi)容讓子類直接使用。它里面定義的都是一些體系中的基本內(nèi)容。接口:一般用于定義對象的擴展功能,是在繼承之外還需這個對象具備的一些功能。 抽象類和接口的共性:都是不斷向上抽取的結(jié)果。 抽象類和接口的區(qū)別: 1:抽象類只能被繼承,而且只能單繼承。 接口需要被實現(xiàn),而且可以多實現(xiàn)。 2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。 接口中都有抽象方法,需要子類去實現(xiàn)。3:抽象類使用的是 is a 關(guān)系。 接口使用的 like a 關(guān)系。4:抽象類的成員修飾符可以自定義。 接口中的成員修飾符是固定的。全都是public的。 在開發(fā)之前,先定義規(guī)則,A和B分別開發(fā),A負責(zé)實現(xiàn)這個規(guī)則,B負責(zé)使用這個規(guī)則。至于A是如何對規(guī)則具體實現(xiàn)的,B是不需要知道的。這樣這個接口的出現(xiàn)就降低了A和B直接耦合性。 ---多 態(tài)★★★★★(面向?qū)ο筇卣髦唬汉瘮?shù)本身就具備多態(tài)性,某一種事物有不同的具體的體現(xiàn)。 體現(xiàn):父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();多態(tài)的好處:提高了程序的擴展性。 多態(tài)的弊端:當(dāng)父類引用指向子類對象時,雖然提高了擴展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產(chǎn)生的功能,即訪問的局限性) / 105 多態(tài)的前提: 多態(tài)的出現(xiàn)思想上也做著變化:以前是創(chuàng)建對象并指揮對象做事情。有了多態(tài)以后,我們可以找到對象的共性類型,直接操作共性類型做事情即可,這樣可以指揮一批對象做事情,即通過操作父類或接口實現(xiàn)。class 畢姥爺{ void 講課(){ } void 釣魚(){ System.out.println(“釣魚”);System.out.println(“企業(yè)管理”);1:必須要有關(guān)系,比如繼承、或者實現(xiàn)。2:通常會有覆蓋操作。 } } class 畢老師 extends 畢姥爺{ void 講課(){ System.out.println(“JAVA”);} void 看電影(){ System.out.println(“看電影”);} } class { public static void main(String[] args){ 畢姥爺 x = new 畢老師();//畢老師對象被提升為了畢姥爺類型。x.講課();x.看電影();//錯誤.畢老師 y =(畢老師)x;//將畢姥爺類型強制轉(zhuǎn)換成畢老師類型。 / 105 // // y.看電影();//在多態(tài)中,自始自終都是子類對象在做著類型的變化。 } }導(dǎo)入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個關(guān)鍵字:import,可以使用這個關(guān)鍵字導(dǎo)入指定包中的類。記?。簩嶋H開發(fā)時,到的哪個類就導(dǎo)入哪個類,不建議使用*.import packa.*;//這個僅僅是導(dǎo)入了packa當(dāng)前目錄下的所有的類。不包含子包。import packa.abc.*;//導(dǎo)入了packa包中的子包abc下的當(dāng)前的所有類。 如果導(dǎo)入的兩個包中存在著相同名稱的類。這時如果用到該類,必須在代碼中指定包名。 常見的軟件包: java.lang : language java的核心包,Object System String Throwable jdk1.2版本后,該包中的類自動被導(dǎo)入。 java.awt : 定義的都是用于java圖形界面開發(fā)的對象。 javax.swing: 提供所有的windows桌面應(yīng)用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的圖形界面庫。 java.net : 用于java網(wǎng)絡(luò)編程方面的對象都在該包中。 java.io : input output 用于操作設(shè)備上數(shù)據(jù)的對象都在該包中。比如:讀取硬盤數(shù)據(jù),往硬盤寫入數(shù)據(jù)。java.util : java的工具包,時間對象,集合框架。 java.applet: application+let 客戶端java小程序。server+let--> servlet 服務(wù)端java小程序。 jar :java的壓縮包,主要用于存儲類文件,或者配置文件等。 命令格式:jar –cf 包名.jar 包目錄 解壓縮:jar –xvf 包名.jar / 105 將jar包目錄列表重定向到一個文件中:jar –tf 包名.jar >c:1.txt--多線程:★★★★ 進程:正在進行中的程序。其實進程就是一個應(yīng)用程序運行時的內(nèi)存分配空間。 線程:其實就是進程中一個程序執(zhí)行控制單元,一條執(zhí)行路徑。進程負責(zé)的是應(yīng)用程序的空間的標示。線程負責(zé)的是應(yīng)用程序的執(zhí)行順序。 一個進程至少有一個線程在運行,當(dāng)一個進程中出現(xiàn)多個線程時,就稱這個應(yīng)用程序是多線程應(yīng)用程序,每個線程在棧區(qū)中都有自己的執(zhí)行空間,自己的方法區(qū)、自己的變量。 jvm在啟動的時,首先有一個主線程,負責(zé)程序的執(zhí)行,調(diào)用的是main函數(shù)。主線程執(zhí)行的代碼都在main方法中。 當(dāng)產(chǎn)生垃圾時,收垃圾的動作,是不需要主線程來完成,因為這樣,會出現(xiàn)主線程中的代碼執(zhí)行會停止,會去運行垃圾回收器代碼,效率較低,所以由單獨一個線程來負責(zé)垃圾回收。 隨機性的原理:因為cpu的快速切換造成,哪個線程獲取到了cpu的執(zhí)行權(quán),哪個線程就執(zhí)行。 返回當(dāng)前線程的名稱:Thread.currentThread().getName()線程的名稱是由:Thread-編號定義的。編號從0開始。線程要運行的代碼都統(tǒng)一存放在了run方法中。 線程要運行必須要通過類中指定的方法開啟。start方法。(啟動后,就多了一條執(zhí)行路徑)start方法:1)、啟動了線程;2)、讓jvm調(diào)用了run方法。 創(chuàng)建線程的第一種方式:繼承Thread,由子類復(fù)寫run方法。步驟: 1,定義類繼承Thread類; 2,目的是復(fù)寫run方法,將要讓線程運行的代碼都存儲到run方法中; / 105 3,通過創(chuàng)建Thread類的子類對象,創(chuàng)建線程對象; 4,調(diào)用線程的start方法,開啟線程,并執(zhí)行run方法。 線程狀態(tài): 被創(chuàng)建:start()運行:具備執(zhí)行資格,同時具備執(zhí)行權(quán); 凍結(jié):sleep(time),wait()—notify()喚醒;線程釋放了執(zhí)行權(quán),同時釋放執(zhí)行資格; 臨時阻塞狀態(tài):線程具備cpu的執(zhí)行資格,沒有cpu的執(zhí)行權(quán); 消亡:stop() 創(chuàng)建線程的第二種方式:實現(xiàn)一個接口Runnable。步驟: 1,定義類實現(xiàn)Runnable接口。 2,覆蓋接口中的run方法(用于封裝線程要運行的代碼)。3,通過Thread類創(chuàng)建線程對象; 4,將實現(xiàn)了Runnable接口的子類對象作為實際參數(shù)傳遞給Thread類中的構(gòu)造函數(shù)。為什么要傳遞呢?因為要讓線程對象明確要運行的run方法所屬的對象。 5,調(diào)用Thread對象的start方法。開啟線程,并運行Runnable接口子類中的run方法。 / 105 Ticket t = new Ticket();/* 直接創(chuàng)建Ticket對象,并不是創(chuàng)建線程對象。 因為創(chuàng)建對象只能通過new Thread類,或者new Thread類的子類才可以。所以最終想要創(chuàng)建線程。既然沒有了Thread類的子類,就只能用Thread類。*/ Thread t1 = new Thread(t);//創(chuàng)建線程。/* 只要將t作為Thread類的構(gòu)造函數(shù)的實際參數(shù)傳入即可完成線程對象和t之間的關(guān)聯(lián) 為什么要將t傳給Thread類的構(gòu)造函數(shù)呢?其實就是為了明確線程要運行的代碼run方法。*/ t1.start(); 為什么要有Runnable接口的出現(xiàn)? 1:通過繼承Thread類的方式,可以完成多線程的建立。但是這種方式有一個局限性,如果一個類已經(jīng)有了自己的父類,就不可以繼承Thread類,因為java單繼承的局限性。 可是該類中的還有部分代碼需要被多個線程同時執(zhí)行。這時怎么辦呢? 只有對該類進行額外的功能擴展,java就提供了一個接口Runnable。這個接口中定義了run方法,其實run方法的定義就是為了存儲多線程要運行的代碼。 所以,通常創(chuàng)建線程都用第二種方式。 因為實現(xiàn)Runnable接口可以避免單繼承的局限性。 2:其實是將不同類中需要被多線程執(zhí)行的代碼進行抽取。將多線程要運行的代碼的位置單獨定義到接口中。為其他類進行功能擴展提供了前提。 所以Thread類在描述線程時,內(nèi)部定義的run方法,也來自于Runnable接口。 實現(xiàn)Runnable接口可以避免單繼承的局限性。而且,繼承Thread,是可以對Thread類中的方法,進行子類復(fù)寫的。但是不需要做這個復(fù)寫動作的話,只為定義線程代碼存放位置,實現(xiàn)Runnable接口更方便一些。所 / 105 以Runnable接口將線程要執(zhí)行的任務(wù)封裝成了對象。------------------------//面試 new Thread(new Runnable(){ //匿名 }){ public void run(){ System.out.println(“runnable run”);} public void run(){ System.out.println(“subthread run”);} }.start();//結(jié)果:subthread run --------------------------Try { Thread.sleep(10);}catch(InterruptedException e){}// 當(dāng)刻意讓線程稍微停一下,模擬cpu 切換情況。 多線程安全問題的原因: 通過圖解:發(fā)現(xiàn)一個線程在執(zhí)行多條語句時,并運算同一個數(shù)據(jù)時,在執(zhí)行過程中,其他線程參與進來,并操作了這個數(shù)據(jù)。導(dǎo)致到了錯誤數(shù)據(jù)的產(chǎn)生。 涉及到兩個因素: 1,多個線程在操作共享數(shù)據(jù)。2,有多條語句對共享數(shù)據(jù)進行運算。 原因:這多條語句,在某一個時刻被一個線程執(zhí)行時,還沒有執(zhí)行完,就被其他線程執(zhí)行了。 解決安全問題的原理: 只要將操作共享數(shù)據(jù)的語句在某一時段讓一個線程執(zhí)行完,在執(zhí)行過程中,其他線程不能進來執(zhí)行就可以解決這個問題。 如何進行多句操作共享數(shù)據(jù)代碼的封裝呢? / 105 java中提供了一個解決方式:就是同步代碼塊。 格式: synchronized(對象){ // 任意對象都可以。這個對象就是鎖。需要被同步的代碼; }-同步:★★★★★ 好處:解決了線程安全問題。 弊端:相對降低性能,因為判斷鎖需要消耗資源,產(chǎn)生了死鎖。 定義同步是有前提的: 1,必須要有兩個或者兩個以上的線程,才需要同步。2,多個線程必須保證使用的是同一個鎖。 同步的第二種表現(xiàn)形式: 同步函數(shù):其實就是將同步關(guān)鍵字定義在函數(shù)上,讓函數(shù)具備了同步性。 同步函數(shù)是用的哪個鎖呢? 通過驗證,函數(shù)都有自己所屬的對象this,所以同步函數(shù)所使用的鎖就是this鎖。 當(dāng)同步函數(shù)被static修飾時,這時的同步用的是哪個鎖呢? 靜態(tài)函數(shù)在加載時所屬于類,這時有可能還沒有該類產(chǎn)生的對象,但是該類的字節(jié)碼文件加載進內(nèi)存就已經(jīng)被封裝成了對象,這個對象就是該類的字節(jié)碼文件對象。 所以靜態(tài)加載時,只有一個對象存在,那么靜態(tài)同步函數(shù)就使用的這個對象。這個對象就是 類名.class 同步代碼塊和同步函數(shù)的區(qū)別? / 105 同步代碼塊使用的鎖可以是任意對象。 同步函數(shù)使用的鎖是this,靜態(tài)同步函數(shù)的鎖是該類的字節(jié)碼文件對象。 在一個類中只有一個同步,可以使用同步函數(shù)。如果有多同步,必須使用同步代碼塊,來確定不同的鎖。所以同步代碼塊相對靈活一些。 ------------------------★考點問題:請寫一個延遲加載的單例模式?寫懶漢式;當(dāng)出現(xiàn)多線程訪問時怎么解決?加同步,解決安全問題;效率高嗎?不高;怎樣解決?通過雙重判斷的形式解決。 //懶漢式:延遲加載方式。 當(dāng)多線程訪問懶漢式時,因為懶漢式的方法內(nèi)對共性數(shù)據(jù)進行多條語句的操作。所以容易出現(xiàn)線程安全問題。為了解決,加入同步機制,解決安全問題。但是卻帶來了效率降低。 為了效率問題,通過雙重判斷的形式解決。class Single{ private static Single s = null;private Single(){} public static Single getInstance(){ //鎖是誰?字節(jié)碼文件對象; if(s == null){ synchronized(Single.class){ if(s == null) s = new Single(); } } return s;} }--------------------------同步死鎖:通常只要將同步進行嵌套,就可以看到現(xiàn)象。同步函數(shù)中有同步代碼塊,同步代碼塊中還有同步函數(shù)。 線程間通信:思路:多個線程在操作同一個資源,但是操作的動作卻不一樣。1:將資源封裝成對象。 2:將線程執(zhí)行的任務(wù)(任務(wù)其實就是run方法。)也封裝成對象。 / 105 等待喚醒機制:涉及的方法: wait:將同步中的線程處于凍結(jié)狀態(tài)。釋放了執(zhí)行權(quán),釋放了資格。同時將線程對象存儲到線程池中。notify:喚醒線程池中某一個等待線程。notifyAll:喚醒的是線程池中的所有線程。 注意: 1:這些方法都需要定義在同步中。2:因為這些方法必須要標示所屬的鎖。你要知道 A鎖上的線程被wait了,那這個線程就相當(dāng)于處于A鎖的線程池中,只能A鎖的notify喚醒。3:這三個方法都定義在Object類中。為什么操作線程的方法定義在Object類中? 因為這三個方法都需要定義同步內(nèi),并標示所屬的同步鎖,既然被鎖調(diào)用,而鎖又可以是任意對象,那么能被任意對象調(diào)用的方法一定定義在Object類中。 wait和sleep區(qū)別: 分析這兩個方法:從執(zhí)行權(quán)和鎖上來分析: wait:可以指定時間也可以不指定時間。不指定時間,只能由對應(yīng)的notify或者notifyAll來喚醒。sleep:必須指定時間,時間到自動從凍結(jié)狀態(tài)轉(zhuǎn)成運行狀態(tài)(臨時阻塞狀態(tài))。wait:線程會釋放執(zhí)行權(quán),而且線程會釋放鎖。Sleep:線程會釋放執(zhí)行權(quán),但不是不釋放鎖。 線程的停止:通過stop方法就可以停止線程。但是這個方式過時了。 停止線程:原理就是:讓線程運行的代碼結(jié)束,也就是結(jié)束run方法。怎么結(jié)束run方法?一般run方法里肯定定義循環(huán)。所以只要結(jié)束循環(huán)即可。第一種方式:定義循環(huán)的結(jié)束標記。 第二種方式:如果線程處于了凍結(jié)狀態(tài),是不可能讀到標記的,這時就需要通過Thread類中的interrupt方法,將其凍結(jié)狀態(tài)強制清除。讓線程恢復(fù)具備執(zhí)行資格的狀態(tài),讓線程可以讀到標記,并結(jié)束。 / 105 ---------< java.lang.Thread >----------interrupt():中斷線程。 setPriority(int newPriority):更改線程的優(yōu)先級。getPriority():返回線程的優(yōu)先級。 toString():返回該線程的字符串表示形式,包括線程名稱、優(yōu)先級和線程組。Thread.yield():暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。 setDaemon(true):將該線程標記為守護線程或用戶線程。將該線程標記為守護線程或用戶線程。當(dāng)正在運行的線程都是守護線程時,Java 虛擬機退出。該方法必須在啟動線程前調(diào)用。join:臨時加入一個線程的時候可以使用join方法。 當(dāng)A線程執(zhí)行到了B線程的join方式。A線程處于凍結(jié)狀態(tài),釋放了執(zhí)行權(quán),B開始執(zhí)行。A什么時候執(zhí)行呢?只有當(dāng)B線程運行結(jié)束后,A才從凍結(jié)狀態(tài)恢復(fù)運行狀態(tài)執(zhí)行。----------------------------Lock接口:多線程在JDK1.5版本升級時,推出一個接口Lock接口。 解決線程安全問題使用同步的形式,(同步代碼塊,要么同步函數(shù))其實最終使用的都是鎖機制。 到了后期版本,直接將鎖封裝成了對象。線程進入同步就是具備了鎖,執(zhí)行完,離開同步,就是釋放了鎖。在后期對鎖的分析過程中,發(fā)現(xiàn),獲取鎖,或者釋放鎖的動作應(yīng)該是鎖這個事物更清楚。所以將這些動作定義在了鎖當(dāng)中,并把鎖定義成對象。 所以同步是隱示的鎖操作,而Lock對象是顯示的鎖操作,它的出現(xiàn)就替代了同步。 在之前的版本中使用Object類中wait、notify、notifyAll的方式來完成的。那是因為同步中的鎖是任意對象,所以操作鎖的等待喚醒的方法都定義在Object類中。 而現(xiàn)在鎖是指定對象Lock。所以查找等待喚醒機制方式需要通過Lock接口來完成。而Lock接口中并沒有直接操作等待喚醒的方法,而是將這些方式又單獨封裝到了一個對象中。這個對象就是Condition,將Object中的 48 / 105 三個方法進行單獨的封裝。并提供了功能一致的方法 await()、signal()、signalAll()體現(xiàn)新版本對象的好處。 < java.util.concurrent.locks > Condition接口:await()、signal()、signalAll(); -------------------------class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition();final Condition notEmpty = lock.newCondition();final Object[] items = new Object[100];int putptr, takeptr, count;public void put(Object x)throws InterruptedException { lock.lock();try { while(count == items.length)notFull.await();items[putptr] = x;if(++putptr == items.length)putptr = 0;++count;notEmpty.signal(); } finally { lock.unlock();} } public Object take()throws InterruptedException { lock.lock();try { while(count == 0)notEmpty.await(); Object x = items[takeptr];if(++takeptr == items.length)takeptr = 0;--count;notFull.signal();return x;} finally { lock.unlock();} } }---API:(Application Programming Interface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開發(fā)人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機制的細節(jié)。 / 105 --< java.lang >--String字符串:★★★☆ java中用String類進行描述。對字符串進行了對象的封裝。這樣的好處是可以對字符串這種常見數(shù)據(jù)進行方便的操作。對象封裝后,可以定義N多屬性和行為。 如何定義字符串對象呢?String s = “abc”;只要是雙引號引起的數(shù)據(jù)都是字符串對象。 特點:字符串一旦被初始化,就不可以被改變,存放在方法區(qū)中的常量池中。-----------------------String s1 = “abc”;// s1指向的內(nèi)存中只有一個對象abc。 String s2 = new String(“abc”);// s2指向的內(nèi)容中有兩個對象abc、new。 System.out.println(s1==s2);//false System.out.println(s1.equals(s2));//true,字符串中equals比較的是字符串內(nèi)容是否相同。------------------------字符串的方法: 1:構(gòu)造方法:將字節(jié)數(shù)組或者字符數(shù)組轉(zhuǎn)成字符串。 String s1 = new String();//創(chuàng)建了一個空內(nèi)容的字符串。String s2 = null;//s2沒有任何對象指向,是一個null常量值。 String s3 = “";//s3指向一個具體的字符串對象,只不過這個字符串中沒有內(nèi)容。//一般在定義字符串時,不用new。String s4 = new String(”abc“);String s5 = ”abc";一般用此寫法 new String(char[]);//將字符數(shù)組轉(zhuǎn)成字符串。 new String(char[],offset,count);//將字符數(shù)組中的一部分轉(zhuǎn)成字符串。 2:一般方法: 按照面向?qū)ο蟮乃枷耄?/p> / 105