java實(shí)現(xiàn)簡(jiǎn)易超市管理系統(tǒng) 附源碼下載
java超市管理系統(tǒng) 1.0(含源文件,后續(xù)會(huì)繼續(xù)優(yōu)化~)
前言
一個(gè)月零零散散的時(shí)間學(xué)習(xí)了java,通過(guò)這次“超市管理系統(tǒng)”的練習(xí),希望可以給一同開(kāi)始學(xué)習(xí)java的朋友一些參考,更希望大佬們多多指點(diǎn)和批評(píng)~
一、確定需求
程序概述:
小型超市商品銷售管理系統(tǒng)選擇小型超市的四類商品進(jìn)行管理。
這四類商品是:食品、化妝品、生活用品和飲料(四個(gè)類)。
每類商品都包含有商品名和商品利潤(rùn) (其中包括商品的售價(jià)、進(jìn)價(jià)、庫(kù)存量)。(五個(gè)屬性)
每類不同的商品還有區(qū)別于其他商品的特殊信息(子類特有屬性)例如,食品有批發(fā)商,化妝品有品牌,飲料有生產(chǎn)廠家。
上述文字可以確定以下幾點(diǎn)
程序要實(shí)現(xiàn)“增,刪,改,查”這四個(gè)基本功能 + 顯示利潤(rùn)本程序要求對(duì)四類商品進(jìn)行操作,因此分類很明確,只需要?jiǎng)?chuàng)建四個(gè)類分別表示四類商品即可本程序中要求商品有(以下屬性)商品名、商品利潤(rùn)、售價(jià)、進(jìn)價(jià)、庫(kù)存量(我們當(dāng)然可以額外加入一個(gè)屬性:商品id,以實(shí)現(xiàn)更加明確的equals比較,后文會(huì)提及)。本程序中要求對(duì)于不同類的商品還要有自己特有的信息(食品有批發(fā)商,化妝品有品牌,飲料有生產(chǎn)廠家)
通過(guò)以上內(nèi)容,我們大概對(duì)這個(gè)程序有了初步的想法和思路,下面我們深入分析一下需要哪些類以及哪些方法
二、確定類、接口、方法實(shí)現(xiàn)
1.確定類
上文提及到:我們需要定義四個(gè)類分別表示四類商品,那么我們?cè)趯?xiě)之前是否可以從四個(gè)類抽取它們相同的特點(diǎn)(屬性)來(lái)引入繼承的思想呢?
顯然是可以的,我們可以定義一個(gè)商品類Wares
作為父類,(并且使用多態(tài)來(lái)切換父類引用的不同指向)Wares
父類包含了四個(gè)類商品的共性(具有商品名、售價(jià)、進(jìn)價(jià)、庫(kù)存量、商品編號(hào)id這五個(gè)屬性),而其子類當(dāng)然就是食品Food
、化妝品Cosmetic
、生活用品DailyUsing
和飲料Drinking
,這樣程序中的類就確定下來(lái)了
我們可以再深入思考一下:
Wares
可以是普通類、可以是抽象類,我們?nèi)绾稳ミx擇呢?
其實(shí)兩者在功能實(shí)現(xiàn)上都是可以的,但是普通類實(shí)現(xiàn)接口的時(shí)候,是一定要重寫(xiě)接口中每一個(gè)方法的,而抽象類卻不需要;況且Wares
是四類商品的父類,我們?cè)趯?duì)商品進(jìn)行操作的時(shí)候,只需要操作其子類的對(duì)象即可,沒(méi)有必要實(shí)例化Wares
對(duì)象,因此我們選擇將Wares
定義為抽象類。
關(guān)于四個(gè)子類:食品類
Food
、飲料類Drinking
、化妝品類Cosmetic
、生活用品類DailyUsing
的確定
四個(gè)子類只需要繼承父類Wares
即可,共性屬性自然而然的繼承了下來(lái),特性屬性在每個(gè)類中單獨(dú)編寫(xiě)即可。
//Wares類中的屬性 //商品名字 private String name; //商品編號(hào) private int id; //商品進(jìn)價(jià) private double inPrice; //商品售價(jià) private double outPrice; //庫(kù)存量 private int Count;
注:Wares
及其子類的屬性我們最好都設(shè)為私有屬性,再去通過(guò)setter
和getter
方法進(jìn)行存取,養(yǎng)成封裝的好習(xí)慣~
2.確定接口
商品類
Wares
會(huì)包含所以商品類及其子類所共有的靜態(tài)特征(屬性)和對(duì)商品的動(dòng)態(tài)操作(方法),屬性在類中一一初始化即可,但是方法我們也要在此類中一一寫(xiě)出方法體嗎?
我們可以利用接口,把我們程序所需要的方法都一一聲明到接口內(nèi),不需實(shí)現(xiàn),只需等待父類Wares
去implement
接口,再讓其子類中對(duì)接口內(nèi)的方法一一實(shí)現(xiàn)(重寫(xiě))即可
3.確定方法
下面我們來(lái)根據(jù)程序需求來(lái)確定方法(需求:增刪改查、顯示利潤(rùn))
我們還可以加入“遍歷所有商品”功能,這樣還可以在程序調(diào)試的時(shí)候,判斷是否可以真正實(shí)現(xiàn)增刪改查功能,起到驗(yàn)證作用
因此我們確定下來(lái)了有以下幾個(gè)方法:
public interface Operations { /* 添加商品信息 */ void addWareInfo(ArrayList<Wares> arrayList); /* 輸出商品信息 注意:需要重寫(xiě)toString方法 */ void printWareInfo(ArrayList<Wares> arrayList); /* 查詢商品信息 注意:需要重寫(xiě)equals方法 */ void findWareInfo(ArrayList<Wares> arrayList); /* 計(jì)算并顯示某個(gè)商品的利潤(rùn) 注意:需要重寫(xiě)equals方法 */ void countWarePrice(ArrayList<Wares> arrayList); /* 刪除商品的信息 注意:需要重寫(xiě)equals方法 */ void delWareInfo(ArrayList<Wares> arrayList); /* 修改貨物信息 注意:需要重寫(xiě)equals方法 */ void updateWareInfo(ArrayList<Wares> arrayList); }
三、敲代碼前再分析一波~
1.重寫(xiě)equals()嗎?
重寫(xiě)
equals()
的目的是用于比較兩個(gè)不同對(duì)象在其本身內(nèi)容相同時(shí),希望equals方法判定結(jié)果是true而非false,這時(shí)我們需要重寫(xiě)equals()
本程序我們自定義equals()
判定規(guī)則為:當(dāng)對(duì)象的編號(hào)和名稱同時(shí)相同時(shí),判定兩個(gè)對(duì)象為同一個(gè)對(duì)象
很顯然,本程序無(wú)論是“增刪改查”操作這四個(gè)基本功能,還是驗(yàn)證用戶是否重復(fù)添加同一商品這一功能,都需要兩個(gè)對(duì)象進(jìn)行equals比較,因此重寫(xiě)equals()
是必須的。
那么是否每一個(gè)類都需要重寫(xiě)equals方法呢?
顯然,Wares
抽象類是不需要的,因?yàn)槲覀冊(cè)诒容^的時(shí)候,是比較其子類的對(duì)象是否是同一對(duì)象,而并非父類對(duì)象(況且該父類是抽象類,無(wú)法實(shí)例化對(duì)象,更別談可以調(diào)用其equals()
了)因此我們可以確定:要重寫(xiě)Food
類、Drinking
類、DailyUsing
類、Cosmetic
類中的equals()
要進(jìn)行重寫(xiě)
/* 重寫(xiě)equals方法 自定義為:當(dāng)名稱相同且商品id相同的時(shí)候,視為同一件商品 */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || !(o instanceof Wares)) return false; Cosmetic cosmetic = (Cosmetic) o; return super.getName().equals(cosmetic.getName()) && super.getId()==cosmetic.getId(); }
2.重寫(xiě)toString嗎?
由于需要清晰的顯示商品信息,每一次需要輸出信息的時(shí)候,可以
System.out.print(“…” + 屬性1 + “…” + 屬性2);
來(lái)顯示每一條信息。
但是鑒于本程序輸出的次數(shù)很多,而且System.out.print()
方法在內(nèi)部調(diào)用toString()
。
因此我們可以重寫(xiě)(父類)toString方法,使得每次的輸出都有一套固定的輸出格式,實(shí)現(xiàn)了System.out.print(實(shí)例化的對(duì)象名);
即可完成格式化輸出。
那么是否每一個(gè)類都需要重寫(xiě)
toString()
呢?
顯然,Wares
抽象類是不需要的,因?yàn)槲覀冚敵鲂畔⒌臅r(shí)候,是要輸出四個(gè)子類對(duì)象的信息(父類Wares
是抽象類,無(wú)法實(shí)例化對(duì)象,更別談可以調(diào)用其toString()
了)因此我們可以確定:要重寫(xiě)Food
類、Drinking
類、DailyUsing
類、Cosmetic
類中的toString()
要進(jìn)行重寫(xiě)
/* 重寫(xiě)toString方法 */ @Override public String toString() { return "化妝品 {\t " + super.getId() + "\t " + super.getName() + "\t\t" + super.getInPrice() + "元" + "\t\t" + super.getOutPrice() + "元" + "\t\t" + super.getCount() + "件" + "\t}"; }
3.重寫(xiě)hashCode()嗎?
Java中規(guī)定:如果兩個(gè)對(duì)象相同,那么它們的
hashCode
值一定要相同;如果兩個(gè)對(duì)象的hashCode
相同,它們對(duì)象本身equals
比較并不一定相同。
因此如果改寫(xiě)了equals方法,令兩個(gè)實(shí)際不是一個(gè)對(duì)象的兩個(gè)實(shí)例在邏輯上相等了,但是hashcode卻是不等,這是有矛盾的。
這種矛盾會(huì)在hashMap
等集合中造成實(shí)際運(yùn)行結(jié)果和預(yù)期運(yùn)行結(jié)果的不一致產(chǎn)生。
(個(gè)人理解:equals()
返回true表示兩個(gè)對(duì)象相同,在同一個(gè)單向鏈表上比較那么對(duì)于同一個(gè)單向鏈表上的結(jié)點(diǎn)來(lái)說(shuō),他們的哈希值都應(yīng)該是相同的所以hashCode()
的返回值也應(yīng)該相同)。
就本程序來(lái)說(shuō)沒(méi)有用到hashMap
這樣集合底層的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)每一個(gè)對(duì)象(而是用的arrayList
),因此是否重寫(xiě)hashCode方法對(duì)本程序的影響不大,但是鑒于程序的規(guī)范性,還是應(yīng)該遵循以下原則:
如果一個(gè)類的equals方法重寫(xiě)了,那么hashCode方法必須重寫(xiě)。并且equals方法返回如果是true,hashCode方法返回的值必須一樣。
/* 重寫(xiě)hashCode方法 */ @Override public int hashCode() { return Objects.hash(brand); }
4.存儲(chǔ)結(jié)構(gòu)的確定
類、接口、方法、屬性、數(shù)據(jù)類型以及實(shí)現(xiàn)方法都已經(jīng)確定了,現(xiàn)在需要把實(shí)例化的對(duì)象以什么樣的形式存儲(chǔ)到一起呢?
一種是數(shù)組、一種是集合
很顯然,我們?cè)谶M(jìn)行初始化的時(shí)候,不知道需要存入多少商品,無(wú)法對(duì)數(shù)組進(jìn)行預(yù)估計(jì)容量;數(shù)組只能存放單一數(shù)據(jù)類型的元素,在對(duì)其操作的時(shí)候(相比較集合中已提供了對(duì)集合的很多操作而言)很不方便,而且數(shù)組雖然檢索效率高,但是插入查找效率很低。
本程序我們選擇arrayList
集合進(jìn)行對(duì)象的存儲(chǔ)。
注:就本程序而言,個(gè)人感覺(jué)還是使用
hashMap
(查詢更加快捷)或hashSet
(排序更加便捷),且兩者都可以自動(dòng)控制存儲(chǔ)的信息無(wú)重復(fù)的特點(diǎn)。這是本程序需要改進(jìn)的地方之一
四、總結(jié)以及源代碼
希望通過(guò)這篇文章可以幫助到初學(xué)java的你!
如果在文章中的描述或者想法不正確或不恰當(dāng),希望路過(guò)的大佬們可以多多指正!
鏈接: https://pan.baidu.com/s/167ee8r1IMW80y3-MKq4aoQ
提取碼: i4bk
到此這篇關(guān)于java實(shí)現(xiàn)簡(jiǎn)易超市管理系統(tǒng) 附源碼下載的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)超市管理系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 實(shí)戰(zhàn)練手項(xiàng)目之校園超市管理系統(tǒng)的實(shí)現(xiàn)流程
- 基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- java實(shí)現(xiàn)簡(jiǎn)單的小超市程序
- java實(shí)現(xiàn)簡(jiǎn)單超市管理系統(tǒng)
- java實(shí)現(xiàn)超市管理系統(tǒng)
- java實(shí)現(xiàn)超市庫(kù)存管理系統(tǒng)
- java實(shí)現(xiàn)超市商品庫(kù)存管理平臺(tái)
- java實(shí)現(xiàn)水果超市管理系統(tǒng)
- Java編寫(xiě)網(wǎng)上超市購(gòu)物結(jié)算功能程序
- Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)
相關(guān)文章
SpringCloud中分析講解Feign組件添加請(qǐng)求頭有哪些坑梳理
在spring?cloud的項(xiàng)目中用到了feign組件,簡(jiǎn)單配置過(guò)后即可完成請(qǐng)求的調(diào)用。又因?yàn)橛邢蛘?qǐng)求添加Header頭的需求,查閱了官方示例后,就覺(jué)得很簡(jiǎn)單,然后一頓操作之后調(diào)試報(bào)錯(cuò)...下面我們來(lái)詳細(xì)了解2022-06-06Java基本數(shù)據(jù)類型與對(duì)應(yīng)的包裝類(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
Java是面向?qū)ο蟮木幊陶Z(yǔ)言,包裝類的出現(xiàn)更好的體現(xiàn)這一思想,Java語(yǔ)言提供了八種基本類型。六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型),一種字符類型,還有一種布爾型。 下面通過(guò)本文給大家詳細(xì)介紹,感興趣的朋友一起學(xué)習(xí)吧2017-04-04SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)
本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2022-03-03Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式
這篇文章主要介紹了Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)方式
這篇文章主要介紹了基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10單例模式垃圾回收_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了單例模式垃圾回收的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08淺談String類型等值比較引起的“==”、“equals()”和“hashCode”思考
這篇文章主要介紹了淺談String類型等值比較引起的“==”、“equals()”和“hashCode”思考。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09