中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用java如何實現簡易超市管理系統

發布時間:2021-03-23 10:49:16 來源:億速云 閱讀:259 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關使用java如何實現簡易超市管理系統的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、確定需求

程序概述:
小型超市商品銷售管理系統選擇小型超市的四類商品進行管理。
這四類商品是:食品、化妝品、生活用品和飲料(四個類)。
每類商品都包含有商品名和商品利潤 (其中包括商品的售價、進價、庫存量)。(五個屬性)
每類不同的商品還有區別于其他商品的特殊信息(子類特有屬性)例如,食品有批發商,化妝品有品牌,飲料有生產廠家。

上述文字可以確定以下幾點

程序要實現“增,刪,改,查”這四個基本功能 + 顯示利潤本程序要求對四類商品進行操作,因此分類很明確,只需要創建四個類分別表示四類商品即可本程序中要求商品有(以下屬性)商品名、商品利潤、售價、進價、庫存量(我們當然可以額外加入一個屬性:商品id,以實現更加明確的equals比較,后文會提及)。本程序中要求對于不同類的商品還要有自己特有的信息(食品有批發商,化妝品有品牌,飲料有生產廠家)

通過以上內容,我們大概對這個程序有了初步的想法和思路,下面我們深入分析一下需要哪些類以及哪些方法

二、確定類、接口、方法實現

1.確定類

上文提及到:我們需要定義四個類分別表示四類商品,那么我們在寫之前是否可以從四個類抽取它們相同的特點(屬性)來引入繼承的思想呢?

顯然是可以的,我們可以定義一個商品類Wares作為父類,(并且使用多態來切換父類引用的不同指向)Wares父類包含了四個類商品的共性(具有商品名、售價、進價、庫存量、商品編號id這五個屬性),而其子類當然就是食品Food、化妝品Cosmetic、生活用品DailyUsing和飲料Drinking,這樣程序中的類就確定下來了

我們可以再深入思考一下:Wares可以是普通類、可以是抽象類,我們如何去選擇呢?

其實兩者在功能實現上都是可以的,但是普通類實現接口的時候,是一定要重寫接口中每一個方法的,而抽象類卻不需要;況且Wares是四類商品的父類,我們在對商品進行操作的時候,只需要操作其子類的對象即可,沒有必要實例化Wares對象,因此我們選擇將Wares定義為抽象類。

關于四個子類:食品類Food、飲料類Drinking、化妝品類Cosmetic、生活用品類DailyUsing的確定

四個子類只需要繼承父類Wares即可,共性屬性自然而然的繼承了下來,特性屬性在每個類中單獨編寫即可。

//Wares類中的屬性
//商品名字
private String name;
//商品編號
private int id;
//商品進價
private double inPrice;
//商品售價
private double outPrice;
//庫存量
private int Count;

注:Wares及其子類的屬性我們最好都設為私有屬性,再去通過settergetter方法進行存取,養成封裝的好習慣~

2.確定接口

商品類Wares會包含所以商品類及其子類所共有的靜態特征(屬性)和對商品的動態操作(方法),屬性在類中一一初始化即可,但是方法我們也要在此類中一一寫出方法體嗎?

我們可以利用接口,把我們程序所需要的方法都一一聲明到接口內,不需實現,只需等待父類Waresimplement接口,再讓其子類中對接口內的方法一一實現(重寫)即可

3.確定方法

下面我們來根據程序需求來確定方法(需求:增刪改查、顯示利潤)

我們還可以加入“遍歷所有商品”功能,這樣還可以在程序調試的時候,判斷是否可以真正實現增刪改查功能,起到驗證作用

因此我們確定下來了有以下幾個方法:

public interface Operations {
 /*
  添加商品信息
  */
 void addWareInfo(ArrayList<Wares> arrayList);
 /*
  輸出商品信息
  注意:需要重寫toString方法
  */
 void printWareInfo(ArrayList<Wares> arrayList);

 /*
  查詢商品信息
  注意:需要重寫equals方法
  */
 void findWareInfo(ArrayList<Wares> arrayList);
 /*
  計算并顯示某個商品的利潤
  注意:需要重寫equals方法
  */
 void countWarePrice(ArrayList<Wares> arrayList);
 /*
  刪除商品的信息
  注意:需要重寫equals方法
  */
 void delWareInfo(ArrayList<Wares> arrayList);
 /*
  修改貨物信息
  注意:需要重寫equals方法
  */
 void updateWareInfo(ArrayList<Wares> arrayList);
}

三、敲代碼前再分析一波~

1.重寫equals()嗎?

重寫equals()的目的是用于比較兩個不同對象在其本身內容相同時,希望equals方法判定結果是true而非false,這時我們需要重寫equals()

本程序我們自定義equals()判定規則為:當對象的編號和名稱同時相同時,判定兩個對象為同一個對象
很顯然,本程序無論是“增刪改查”操作這四個基本功能,還是驗證用戶是否重復添加同一商品這一功能,都需要兩個對象進行equals比較,因此重寫equals()是必須的。

那么是否每一個類都需要重寫equals方法呢?

顯然,Wares抽象類是不需要的,因為我們在比較的時候,是比較其子類的對象是否是同一對象,而并非父類對象(況且該父類是抽象類,無法實例化對象,更別談可以調用其equals()了)因此我們可以確定:要重寫Food類、Drinking類、DailyUsing類、Cosmetic類中的equals()要進行重寫

/*
 重寫equals方法
 自定義為:當名稱相同且商品id相同的時候,視為同一件商品
 */
@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.重寫toString嗎?

由于需要清晰的顯示商品信息,每一次需要輸出信息的時候,可以System.out.print(“…” + 屬性1 + “…” + 屬性2);來顯示每一條信息。

但是鑒于本程序輸出的次數很多,而且System.out.print()方法在內部調用toString()

因此我們可以重寫(父類)toString方法,使得每次的輸出都有一套固定的輸出格式,實現了System.out.print(實例化的對象名);即可完成格式化輸出。

那么是否每一個類都需要重寫toString()呢?

顯然,Wares抽象類是不需要的,因為我們輸出信息的時候,是要輸出四個子類對象的信息(父類Wares是抽象類,無法實例化對象,更別談可以調用其toString()了)因此我們可以確定:要重寫Food類、Drinking類、DailyUsing類、Cosmetic類中的toString()要進行重寫

/*
 重寫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.重寫hashCode()嗎?

Java中規定:如果兩個對象相同,那么它們的hashCode值一定要相同;如果兩個對象的hashCode相同,它們對象本身equals比較并不一定相同。
因此如果改寫了equals方法,令兩個實際不是一個對象的兩個實例在邏輯上相等了,但是hashcode卻是不等,這是有矛盾的。

這種矛盾會在hashMap等集合中造成實際運行結果和預期運行結果的不一致產生。
(個人理解:equals()返回true表示兩個對象相同,在同一個單向鏈表上比較那么對于同一個單向鏈表上的結點來說,他們的哈希值都應該是相同的所以hashCode()的返回值也應該相同)。

就本程序來說沒有用到hashMap這樣集合底層的數據結構來存儲每一個對象(而是用的arrayList),因此是否重寫hashCode方法對本程序的影響不大,但是鑒于程序的規范性,還是應該遵循以下原則:

如果一個類的equals方法重寫了,那么hashCode方法必須重寫。并且equals方法返回如果是true,hashCode方法返回的值必須一樣。

/*
 重寫hashCode方法
 */
@Override
public int hashCode() {
 return Objects.hash(brand);
}

4.存儲結構的確定

類、接口、方法、屬性、數據類型以及實現方法都已經確定了,現在需要把實例化的對象以什么樣的形式存儲到一起呢?

一種是數組、一種是集合

很顯然,我們在進行初始化的時候,不知道需要存入多少商品,無法對數組進行預估計容量;數組只能存放單一數據類型的元素,在對其操作的時候(相比較集合中已提供了對集合的很多操作而言)很不方便,而且數組雖然檢索效率高,但是插入查找效率很低。

本程序我們選擇arrayList集合進行對象的存儲。

注:就本程序而言,個人感覺還是使用hashMap(查詢更加快捷)或hashSet(排序更加便捷),且兩者都可以自動控制存儲的信息無重復的特點。這是本程序需要改進的地方之一

感謝各位的閱讀!關于“使用java如何實現簡易超市管理系統”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇赉县| 神木县| 天峻县| 舞阳县| 西华县| 莒南县| 光山县| 海林市| 黔西| 铅山县| 襄城县| 西城区| 隆回县| 西乌| 临泉县| 安西县| 波密县| 平乡县| 东山县| 常山县| 正阳县| 通山县| 昌乐县| 大足县| 安仁县| 望江县| 根河市| 平湖市| 读书| 阿坝县| 习水县| 平度市| 朝阳市| 修文县| 赣州市| 晋中市| 富宁县| 武安市| 金堂县| 鄂伦春自治旗| 麻江县|