實
驗
報
告
課 課
程
名
稱
Java 技術
專 專
業 業
班 班
級
13 -計算機科學與技術-1 班 班
學生姓名及學號
2013217 098 潘汀
指 指
導
教
師
鐘華剛
實 實
驗 驗
地 地
點
計算中心
20 15 5
~ 2016 6
學年第
一
學期
實驗一
類得封裝、繼承、多態
一、實驗目得
1。復習、理解OOP 得特征—-封裝、繼承與多態。
2。學會使用 Java編寫簡單得類。理解類得屬性與方法。
3。掌握關鍵字 private, protected, public 得作用.
4。掌握多態得概念。
二、實驗內容
1.分別編寫兩個類Point2D,Point3D 來表示二維空間與三維空間得點,使之滿足下列要求: (1)
Point2D 有兩個整型成員變量 x, y (分別為二維空間得 X,Y方向坐標),Point2D得構造方法要實現對其成員變量x, y 得初始化。
(2) Point2D 有一個 void型成員方法offset(int a, int b),它可以實現 Point2D得平移。
(3)
Point3D 就是Point2D得直接子類,它有有三個整型成員變量x,y,z (分別為三維空間得X,Y,Z方向坐標),Point3D有兩個構造方法:Point3D(int x,int y,int z)與 Point3D(Point2D p,int z),兩者均可實現對 Point3D 得成員變量x, y,z 得初始化。
(4) Point3D 有一個 void 型成員方法 offset(int a, int b,int c),該方法可以實現 Point3D得平移。
(5)
在 Point3D中得主函數 main()中實例化兩個 Point2D 得對象p2d1,p2d2,打印出它們之間得距離,再實例化兩個Point3D得對象p3d1,p3d2,打印出她們之間得距離。
提示:java、lang、Math、sqrt()方法 2.創建一個數組,隨機生成 Point2D 或者 Point3D 得對象放于其中。最后依次調用數組中每個對象得“打印方法” ,顯示數組中存儲得對象就是什么。
提示:java、lang、Math、random()方法
或者 java、util、Ran
dom 類 三、 實驗代碼
pa ckag e exp1; i mport java、util、Random; c la ss Point2D {
int x,y; tni(D2tnioP? nt x,int y){this、x=x;t hi s、y=y;} i,a tni(tesffo diov? int b)
{t his、x+=a;t his、y+=b;}
void print()
{System、 o u t 、printf(”Point2D:(%d,%d)\n",x,y);} } cla ss Point3D ex tends Point2D {
in t z; ni(D3tnioP? nt x, i nt y, int z) { super(x, y);thi s、z=z;} ov? oid offset(int a,int b,i nt c) { this、x+=a;this、y+=b;t his、z+=c;}
vo id print()
{System、o u t、printf(”Point3D:(%d,%d,%d)\n”,x,y,z);} } p ub lic c lass Main {
stati c double distance(Point2D a,Point2D b){
ter? eturn java、lang、Math、sqr t (((a、x—b、x)*(a、x-b、x)+(a、y—b、y)*(a、y—b、y)));
}? stati c double distance(Point3D a,Point3D b){ er?? ret urn java、lang、Math、s q rt (((a、x—b、x)*(a、x-b、x)+(a、y-b、y)*(a、y-b、y)+(a、z-b、z)*(a、z-b、z)));}
publ ic static v oi d main(String args[])
{
Point2D p2d1=new Point2D(1,1),p2d2=new Point2D(2,2);
? Point3D p3d1=ne w Point3D(1,1,1),p3d2=new Point3D(2,2,2);
、metsyS? ou t、printf("%f %f\n”,di st a n ce(p2d1,p2d2),di sta n c e(p3d1,p3d2));
? in t T=10;
? Point2D arr[]=new Point2D[T];
rof? r(int i=0;i<T;i++){
? r、htaM、gnal、avaj()tni(=epyt tni? a ndom()*2);
int x=(in t)(java、lang、Math、r an do m ()*100),
y=( int)(java、lang、Math、r a ndom()*100),
r、htaM、gnal、avaj()tni(=z?? a ndom()*100);
if(type==0)
arr[i]=new Point2D(x,y);
le? lse arr[i]=new Point3D(x,y,z);
? }
for(int i=0;i〈T;i++){arr[i]、print();}
}?} 四 、思考題
1.您對面向對象得理解. 答:面向對象最重要得三大特性:封裝、繼承、多態。圍繞這三個核心特性, 面向對象程序設計方法給軟件工程帶來得全新得程序結構設計模式. 面向對象與核心概念就就是理解【類】、與【對象】。
具體來講,首先我對【類】一詞得理解如下:
類就就是一組有共性得對象。它描述一個特定得抽象并提供創建對象得模板,如果類不具備某中特性,那么它得對象也不能具備該特性.
類就就是分類,比如人類,就就是關于人得定義,包括一些屬性與操作這些屬性得動作,就是對一個實體得抽象得描述。因為就是一個抽象概念,在使用得時候必須進行實例化,即將類具體為一個具體得實體。
由類牽扯出【對象】得理解: 對象,就是一個類得具體實現,比如某人 Jack,就就是擁有一個名字屬性為Jack得人類,她可以有其她得屬性,具有人類里得所有方法(可以簡單得理解為行為與操作屬性得)。
對象需要有狀態,用以描述對象得特征與當前得狀態.對象還需要有行為,定義其她對象對該對象所施加得動作.行為可能需要依賴于對象得狀態。在某種情 況下,對象可以有某種行為,而在另外一些情況下,則不能。每一個對象都必須被唯一得標識(對象得名字不能相同,至少在一個場景中)。
對象通過協作,通信來完成一個比較完整得分工,這些分工整合起來,就就是整個軟件系統.
2.什么就是多態?Java 中如何實現多態? 【概念理解】
多態就就是說,比較低層次得抽象得實體可以被支持比較高層次抽象得一些操作得實體所支持。實現這些概念需要得工具,或者說描述方式,關于多態得描述有一個比較傳統得例子:一個比較高層次得抽象,稱為形狀,然后從形狀繼承而來得有圓,長方形(也可以有由長方形繼承而來正方形),三角形等低層次抽象,有這樣一個外部實體,它支持對形狀得操作,比如計算形狀得面積(不用考慮怎么計算,也不用 考慮計算得形狀就是那種),由于它支持得就是形狀(比較高層次得抽象),那么不論就是圓,長方形,三角形它就都支持。而具體到每個低層次得抽象得實際計算時,各自使用各自得計算方法,最終返回結果就可以了.
這樣做得一個明顯得好處就是,如果以后發現新得比較低層次得抽象后,直接加入系統即可,無需考慮上層使用者得修改。在運行時,編譯器會知道需要計算哪個。
【Java 實現機制】
Java中實現多態得機制靠得就是父類或者接口定義得引用變量可以指向子類或者具體得實現類得實例對象,而程序調得方法在運行期才動態綁定,就就是引用變量所指向得具體實例對象得方法,也就就是內存里正在運行得那個對象得方法,而不就是引用變量得類型中定義得方法. 二 實驗二 統系理管銷進物貨? 貨物進銷管理系統
一、實驗目得
1.掌握 Java 中文件得讀寫操作。
.2 功得定特成完來)tsiLyarrA ,rotceV(類用實得供提 avaJ用使會學?能。
3.掌握字符串類(String, StringBuffer)得使用。
。4
。題問雜復決解與析分法方得象對向面用握掌?二、實驗內容
編寫一個 Inventory、java 完成以下功能(沒有學過 Java 文件處理之前,各位同學可以使用硬編碼將數據放進兩個Vector 變量里。等學過Java 文件處理之后,再補充數據文件讀取部分):
。1 rT 取讀后然,錄記存庫有所得錄記中 tad、yrotnevnI 取讀并開打先首序程?ansactions、dat,處理這個文件中包含得事務,記錄發貨記錄到Shipping、dat,并記錄錯誤信息到 Errors、dat 中。最后更新庫存到另外一個文件NewInventory、dat 中. .2 ,錄記貨存個一含包行每得 tad、yrotnevnIweN與tad、yrotnevnI件文?沒條記錄包含下面一些字段息,這些字段之間用一個 tab分開(見后面得文件格式): 字段 格式與含義 Item number 字符串型,貨物編號 Quantity 整型,貨物數量 Supplier 字符串型,供應商編號 Description 貨物描述
3.字段 Items 按照從小到大得順序寫如文件得。注意 Item 號不必連續,如Item 號為 752 得后面可能就是 800。
4.文件Transactions、dat 包含幾個不同得事務處理記錄(每行一條記錄)。每條記錄前面以一個大寫字母開頭,表示這條記錄就是什么類型得事務.在不同得大寫字母后面就是不同得信息格式。所有得字段也就是以 tab 鍵分開得(見Transactions、dat 文件格式)。
5。以’O"開頭得事務表示這就是一個發貨,即某一種貨物應該發給特定得客戶。Item號與數量 Quantity 得格式如上面表格定義。Custom編號與上面得 Supplier編號一致。處理一條定單記錄(以"O"開頭得事務)意味著從減少庫存記錄中相應貨物得數量(減少得數量=發貨單中得數量),記錄發貨信息到Shipping、
dat 中。注意:Inventory、dat 中得 quantity不應該小于 0,如果對于某一種貨物,庫存得數量小于發貨單得數量得話,系統應該停止處理發貨單,并記錄出錯信息到Errors、dat。如果對于某一種貨物有多個發貨單,而且庫存總量小于這些發貨單得總與得話,系統應該按照發貨單中得數量從小到大得有限原則滿足客戶.也就就是說,對于某一種貨物如果一個數量 Quantity少得發貨單沒有處理之前,數量 Quantity 多得發貨單永遠不會被處理。(這種處理原則不受發貨單記錄在 Transactions、dat得先后順序影響) 6.以'R’開頭得事務表示這就是一個到貨單記錄,在’R'后面就是Item號與它得數量。處理一條到貨單意味著增加庫存中相應貨物得數量(增加得數量=到貨單中得數量)。注意如果在 Transactions、dat文件中,到貨單出現在發貨單之后,到貨單中得貨物數量可以用來填補發貨單中得數量(可以理解成在 Transactions、dat 中,優先處理到貨單)。
7.以’A'開頭得事務表示向庫存中增加一種新得貨物(即這種貨物以前庫存中沒有),在’A'后面就是Item 號,供應商 supplier以及貨物得描述 description。處理一個新增貨物記錄意味著向庫存中增加一個數量 Quantity為 0 得新得 Item.您可以假設在一個 Transactions、dat 中,新增貨物記錄總就是出現在第一個到貨單之前。
8.以"D"開頭得事務表示從庫存中刪除一種貨物,在"D'后面就是 Item 號.刪除操作總就是在所有得事物處理之后才被處理,以保證對于可能出現得同一種貨物得發貨單得操作能在刪除之前被正確處理。如果要刪除得某種貨物得庫存量 Quantity 不為 0 得話,系統應該向 Errors、dat記錄出錯信息。
9.文件 Shipping、dat中得每一行代表給某一客戶得發貨信息.Shipping、dat 中得每一行分別就是客戶編號、Item 號、貨物數量,它們之間用tab 鍵分隔。如果發貨單中有兩條客戶編號與 Item 編號一樣得記錄,在Shipping、dat中應該將這兩條發貨信息合并(即將它們得數量相加)。
10.Errors、dat文件包含未發送得發貨記錄與庫存量大于0得刪除記錄。Errors、dat 每一行包含 Custom 編號、Item 編號以及發貨單上得數量Quantity。對于刪除操作,Custom 編號為0,數量 Quntity 為庫存中得 Quantity、 11。實驗測試數據:
三、 實驗代碼
class Item {
;noitpircsed,reilppus,rebmun gnirtS? ;ytitnauq tni?tni,rebmun gnirtS(metI? t quantity,String supplier,String description){
? t hi s、number=number;
;ytitnauq=ytitnauq、siht?? t? thi s、supplier=supplier;
? this、description=description;
} } class Transpare i mp le men ts parator {
publi c int pare(Object o1, Object o2) {
;1o)metI(=1e metI?
Item e2=(Item)o2;
if(e1、quantity > e2、quantity)
ret urn 1;
e lse if(e1、quantity〈e2、quantity) re tur n -1;
e lse retu rn 0;
} } p ubl ic class Main {
pu blic sta tic vo id main(String args[]) throws IOException{
wen=ni?? w ("Inventory、txt”);
n=1tuo? ne w ("Shipping、txt");
en=2tuo?? ew ("Errors、txt”);
? BufferedWriter shipping=new BufferedWriter(out1);
BufferedWriter errors=new BufferedWriter(out2);
? Scanner scan=ne w Scanner(in);
String number = null,supplier,description;
ni?? nt quantity;
? Map<String,Item〉 map=new HashMap<String,Item>();
? Map<String,Item〉 transHash= new HashMap<String,Item〉();
Vector<Item> trans=new Vector<Item〉(),del=new Vector〈Item〉(),
rec=new Vector<Item>(),add=new Vector<Item〉();
//記錄生成
))(txeNsah、nacs(elihw??
{ ?;)(txen、nacs=rebmun??;)(tnItxen、nacs=ytitnauq?
;)(txen、nacs=reilppus???;)(txen、nacs=noitpircsed?
;))noitpircsed,reilppus,ytitnauq,rebmun(metI wen ,rebmun(tup、pam??
}? ? String type;
wen=ni? w (”Transactions、txt");
;)ni(rennacS wen=nacs? ? //數據讀入—離線存儲
while (scan、hasNext())
{ ?;)(txen、nacs = epyt? ?
if (type、equals("0")) {
?? number = scan、next();
;)(tnItxen、nacs = ytitnauq??
;)(txen、nacs = reilppus???
;reilppus+"###”+rebmun=txeThsah gnirtS??
? if(!transHash、containsKey(hashText)){
//Hash 發貨單
?
tup、hsaHsnart??
(hashText, new Item(number,quantity,supplier,”None"));
?
}
e?? el se transHash、get(hashText)、quantity+=quantity;
}??e? else if (type、equals(”R”)) {
?;)(txen、nacs = rebmun? ?
quantity = scan、nextInt();
wen(dda、cer?? w Item(number,quantity,"None”,"None”));
}esle?? se if (type、equals("D”)) {
?
;)(txen、nacs = rebmun?? ?n(dda、led? ne w Item(number,-1,”",""));
?
} else if (type、equals("A”)) {
?? number = scan、next();
supplier = scan、next();
;)(txen、nacs = noitpircsed???
;))noitpircsed,reilppus,0,rebmun(metI wen(dda、dda?? ?
}? ? }
//? ? for (Map、Entry<String,Item> entry :
transHash、entrySet())
{??
、yrtne,rebmun、)(eulaVteg、yrtne(metI wen(dda、snart?getValue()、quantity,entry、getValue()、supplier,”None”));
?
//合并發貨單寫入
shipping、write(entry、getValue()、number + " ");
、gnirtS(etirw、gnippihs?? v a l ueO f (entry、getValue()、quantity) + " ”);
;)reilppus、)(eulaVteg、yrtne(etirw、gnippihs?
;)(eniLwen、gnippihs?
}
Collections、 so r t (trans, ne w Transpare());
//按發貨數量升序排序
加添//
)++i;)(ezis、dda<i;0=i tni(rof?
{? ?
;)i(teg、dda=meti metI?
;)meti,rebmun、meti(tup、pam?? 、metsyS?? ou t、printf ("添加存種:%s 供應商:%s 描述:
%s\n",item、number,item、supplier,item、description);
}? ? for( int i=0;i<rec、size();i++)
//收貨
{? ?
;)rebmun、meti(teg、pam=ter,)i(teg、cer=meti metI?
ret、quantity+=item、quantity;
;)ter,rebmun、ter(tup、pam?
? System、o ut 、printf ("收貨:%s 數量:%d 剩余:%d\n”,item、number,item、quantity,ret、quantity);
}
for( int i=0;i<trans、size();i++)
//發貨
{?
Item item=trans、get(i),ret=map、get(item、number);
?
{)ytitnauq、meti<ytitnauq、ter(fi?
、metsyS?? out 、printf("發貨%s 給%s 失敗,剩余:%d 需求:%d\n",item、number,item、supplier,ret、quantity,item、quantity); ;)” "+reilppus、meti(etirw、srorre??
?
;)" "+rebmun、meti(etirw、srorre?
;)))ytitnauq、meti((fOeulav、gnirtS(etirw、srorre??
;)(eniLwen、srorre??
c?? co nt inue;
? }
ret、quantity—=item、quantity; ?;)ter,rebmun、meti(tup、pam?
? System、o u t、printf(”發貨%s 給%s 成功, 剩余:%d 需求:%d\n”,item、number,item、supplier,ret、quantity,item、quantity);
}??of?? for(int i=0;i<del、size();i++)
//刪除
{
;)rebmun、meti(teg、pam=ter,)i(teg、led=meti metI? ?
if(ret==nul l)
c ontinue; //去除無效
{)0=!ytitnauq、ter(fi?? ?ftnirp、tuo、metsyS?(”刪除%s 失敗 ,數量剩余:%d\n",item、number,ret、quantity);
?
;)" 0"(etirw、srorre??;)” ”+rebmun、meti(etirw、srorre??
? av、gnirtS(etirw、srorre? l u e Of((ret、quantity)));
?
? errors、newLine();
?? cont inue;
} ?? ?
System、ou t 、printf("刪除%s 成功,\n”,item、number);
;)rebmun、meti(evomer、pam?
? }
? shipping、flush();
? errors、flush();
}?} 四、 實驗結果
五 、思考題
、1
.得心驗實出寫,結總行進驗實個整對?【摘要】
該實驗本質就就是一個模擬題。要求模擬一個進貨發貨系統。
注意關鍵點:數據不能在線處理. 體現在兩個方面:
①讀入操作順序與實際工作順序不符 ②讀入操作需要Hash 與合并 因此,只能采取離線保存+處理得手段. 由于數據主鍵并非整型值,如果就是用數組來保存,需要手寫一個 Hash 表來 Hash. 考慮到基于紅黑樹實現得關聯 Map 容器,所以使用 Map 來Hash 與模擬數據庫。
【數據結構設計】
Map〈String,Item> map
——作為中心數據庫 Map〈String,Item> transHash
—-用于發貨單Hash Vector<Item〉 trans,del,rec,add;
-—最終操作序列 【流程簡述】
①Inventory 文件讀入 ②Transactions 文件讀入
★-——〉在讀入發貨單時,進行 Hash 處理,去重合并
★—--〉對于其它操作,直接扔入最終操作序列 ③對 Hash 過得 transHash ,按數量升序排序,生成最終操作序列,同時寫入 ShippingBuffer
④對四個操作序列,循環模擬。
★--—>先處理庫存添加,更新 map 中心數據庫
★--->再處理收貨操作,更新 map 中心數據庫
★—-—>再處理發貨操作,如果庫存不足,向 errorBuffer 寫入信息
★—-—〉再處理刪除操作,如果庫存>0,向 errorBuffer 寫入信息 ⑤★★★(不能遺忘)將緩沖區寫入文件,生成 Shipping、dat、Errors、txt
推薦訪問: 實驗 報告 java上一篇:哈希表實驗報告
下一篇:對于系統設計實驗報告
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究