“吃货联盟订餐系统”错误记录,问题出在static

作者在开发一个订餐系统时,误将点赞数设为静态变量,导致所有菜品都被多次点赞。通过理解静态变量的作用,作者解决了这个问题,意识到静态变量在特定场景下的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在练习写一个名为“吃货联盟订餐系统”时遇到了一个小问题,这个问题就是在选择给菜品点赞的选项时,明明下标的查找和修改都很正确,但是运行结果每次都是给所有的菜品都点一次赞。因为这个错误愣是反反复复的修改都找不出问题,抓耳挠腮,中午想午睡休息一会儿都睡不着。

后来发现是因为在我创建的Dish类中给点赞数这个成员变量加了static,此时我想肯定会有人想问,好好的一个成员变量加static干嘛,这是因为,我为了初始化餐单这个数组,使用了静态代码块来进行初始化的添加操作:

此时可能会觉得用静态代码块来添加几个初始数据这很正常,问题就出在我在初始化点赞数时我当时也不知道咋想的用的是 getLove() ,这是IDEA就给我报错提示,说我get方法应该加static、love(点赞数)这个变量也应该加static……一顿修改错误都没了,运行就出现了开头的结果。在修改过程中我也层把 getLove() 换成0,但是我也只是把getLove() 换成了0,没有把get和set方法中的static去掉,也没有吧变量love中的static去掉,这也导致运行结果依然报错!

(抠脚丫子都比扣这代码有成就感!)真的无语死了~

没想到通过这种方式让我体会到 static 这么“强大”

回顾一下static:

自己手搓的“吃货联盟订餐系统”,大家可以参考一下自行修改:

Dish类:

package com.qiku.homework.demo3;

import java.util.ArrayList;
import java.util.Objects;

public class Dish {
    private String dishName;//菜名
    private Double dishMoney;//单价
    private int love;//点赞数


    public Dish() {
    }
    static ArrayList<Dish>dishList=new ArrayList<>();

    /**
     * 初始化菜单
     */
    static {
        dishList.add(new Dish("红烧肉丝",38.0,0));
        dishList.add(new Dish("鱼香肉丝",20.0,0));
        dishList.add(new Dish("时令鲜疏",10.0,0));
    }


    public Dish(String dishName, Double dishMoney, int love) {
        this.dishName = dishName;
        this.dishMoney = dishMoney;
        this.love = love;
    }

    public void show(){
        System.out.println("序号\t菜名\t\t单价\t\t点赞数");
        for (int i = 0; i < dishList.size(); i++) {
            System.out.println((i+1)+"\t"+dishList.get(i).dishName+"\t"+dishList.get(i).dishMoney+"元\t"+dishList.get(i).love);
        }
    }

    public void giveLove(int index) {
        if (index>0&&index<=dishList.size()){
            Dish dish = dishList.get(index - 1);
            dish.setLove(dish.getLove() + 1);
            dishList.set(index - 1, dish);
            System.out.println("点赞成功!");
        }else {
            System.out.println("不存在该菜品的序号,请输入正确的菜品序号。");
        }
    }

    public String getDishName() {
        return dishName;
    }

    public void setDishName(String dishName) {
        this.dishName = dishName;
    }

    public Double getDishMoney() {
        return dishMoney;
    }

    public void setDishMoney(Double dishMoney) {
        this.dishMoney = dishMoney;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        this.love = love;
    }

    public static ArrayList<Dish> getDishList() {
        return dishList;
    }

    public static void setDishList(ArrayList<Dish> dishList) {
        Dish.dishList = dishList;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dish dish = (Dish) o;
        return love == dish.love && Objects.equals(dishName, dish.dishName) && Objects.equals(dishMoney, dish.dishMoney) && Objects.equals(dishList, dish.dishList);
    }

    @Override
    public int hashCode() {
        return Objects.hash(dishName, dishMoney, love, dishList);
    }

    @Override
    public String toString() {
        return "Dish{" +
                "dishName='" + dishName + '\'' +
                ", dishMoney=" + dishMoney +
                ", love=" + love +
                ", dishList=" + dishList +
                '}';
    }
}

Order类:

package com.qiku.homework.demo3;

import java.util.ArrayList;
import java.util.Objects;

public class Order {
    private String clientName;//订餐人姓名
    private String dishName;//菜品名
    private int dishNum;//份数
    private int time;//送餐时间
    private String address;//送餐地址
    private double price;//总金额
    private String status="已预订";//订单状态
    public Order() {
    }
    ArrayList<Order>clientList=new ArrayList<>();//客户信息

    public Order(String clientName, String dishName, int dishNum, int time, String address, double price, String status) {
        this.clientName = clientName;
        this.dishName = dishName;
        this.dishNum = dishNum;
        this.time = time;
        this.address = address;
        this.price = price;
        this.status = status;
    }

    /**
     *
     * @return 订单
     */
    public ArrayList<Order> addClient(){
        Order order = new Order(getClientName(), getDishName(), getDishNum(), getTime(), getAddress(), getPrice(), getStatus());
        clientList.add(order);
        return clientList;
    }
    public void show(){
        System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t\t送餐地址\t\t总金额\t\t订单状态");
        for (int i = 0; i < clientList.size(); i++) {
            System.out.println((i+1)+"\t"+clientList.get(i).clientName+"\t\t"+clientList.get(i).dishName+clientList.get(i).dishNum+"份\t"+clientList.get(i).time+"时\t\t"+clientList.get(i).address+"\t\t"+clientList.get(i).price+"元\t\t"+clientList.get(i).status);
        }

    }

    public String getClientName() {
        return clientName;
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    public String getDishName() {
        return dishName;
    }

    public void setDishName(String dishName) {
        this.dishName = dishName;
    }

    public int getDishNum() {
        return dishNum;
    }

    public void setDishNum(int dishNum) {
        this.dishNum = dishNum;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getStatus() {
        return status;
    }

    public Order setStatus(String status) {
        this.status = status;
        return this;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Order order = (Order) o;
        return dishNum == order.dishNum && time == order.time && Double.compare(price, order.price) == 0 && Objects.equals(clientName, order.clientName) && Objects.equals(dishName, order.dishName) && Objects.equals(address, order.address) && Objects.equals(status, order.status);
    }

    @Override
    public int hashCode() {
        return Objects.hash(clientName, dishName, dishNum, time, address, price, status);
    }

    @Override
    public String toString() {
        return "Order{" +
                "clientName='" + clientName + '\'' +
                ", dishName='" + dishName + '\'' +
                ", dishNum=" + dishNum +
                ", time=" + time +
                ", address='" + address + '\'' +
                ", price=" + price +
                ", status='" + status + '\'' +
                '}';
    }
}

Test类:

package com.qiku.homework.demo3;

import java.util.Scanner;

public class Test {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {

        Order client = new Order();
        Dish dish = new Dish();
        System.out.println("欢迎使用“吃货联盟订餐系统");
        do {
            System.out.println("****************************");
            System.out.println("1.我要订餐");
            System.out.println("2.查看餐袋");
            System.out.println("3.签收订单");
            System.out.println("4.删除订单");
            System.out.println("5.我要点赞");
            System.out.println("6.退出系统");
            System.out.println("****************************");
            System.out.print("请选择:");
            int choice=sc.nextInt();
            switch (choice){
                case 1:
                    System.out.println("***我要订餐***");
                    System.out.print("请输入订餐人姓名:");
                    client.setClientName(sc.next());
                    dish.show();
                    System.out.print("请选择您要点的菜品编号:");
                    int serialNum = sc.nextInt();
                    if (serialNum==1){
                        client.setDishName("红烧带鱼");
                        /*暂时先按照单价作为总餐费*/
                        client.setPrice(38.0);
                    } else if (serialNum==2) {
                        client.setDishName("鱼香肉丝");
                        client.setPrice(20.0);
                    } else if (serialNum==3) {
                        client.setDishName("时令鲜蔬");
                        client.setPrice(10.0);
                    }
                    System.out.print("请输入您需要的份数:");
                    client.setDishNum(sc.nextInt());
                    System.out.print("请输入送餐时间(送餐时间是10点至20点间整点送餐):");
                    client.setTime(sc.nextInt());
                    System.out.print("请输入送餐地址:");
                    client.setAddress(sc.next());

                    System.out.println("订餐成功!");
                    System.out.println("您订的是:"+client.getDishName()+"\t"+client.getDishNum()+"份");
                    System.out.println("送餐时间:"+client.getTime());
                    double mealFee=client.getPrice()*client.getDishNum();
                    /*extra 送餐费*/
                    double extra=0;
                    if (mealFee<30){
                        extra=5;
                    }
                    double sum=mealFee+extra;
                    /*这里根据用户前面选择的份数和是否需要配送费,重新给总餐费赋值*/
                    client.setPrice(sum);
                    System.out.println("餐费:"+mealFee+"元,送餐费"+extra+"元,总计"+sum+"元。");
                    client.addClient();
                    back();
                    break;
                case 2:
                    System.out.println("***查看餐袋***");
                    client.show();
                    back();
                    break;
                case 3:
                    System.out.println("***签收订单***");
                    System.out.print("请输入要签收的订单编号:");
                    int orderNum3 = sc.nextInt();
                    if (orderNum3 > 0 && orderNum3 <= client.clientList.size()) {
                        Order order = client.clientList.get(orderNum3 - 1);
                        order.setStatus("已完成");
                        client.clientList.set(orderNum3 - 1, order);
                        System.out.println("订单状态修改成功。");
                    } else {
                        System.out.println("订单编号无效,请输入正确的订单编号。");
                    }
                    System.out.println("订单签收成功!");
                    back();
                    break;
                case 4:
                    System.out.println("***删除订单***");
                    System.out.print("请输入要删除的订单序号:");
                    int orderNun4= sc.nextInt();
                    client.clientList.remove(orderNun4-1);
                    System.out.println("删除订单成功!");
                    back();
                    break;
                case 5:
                    System.out.println("***我要点赞***");
                    dish.show();
                    System.out.print("请选择您要点赞的菜品序号:");
                    int dishNum5=sc.nextInt();
                    dish.giveLove(dishNum5);
                    dish.show();
                    back();
                    break;
                case 6:
                    System.out.println("感谢使用本系统!");
                    return;
                default:
                    System.out.println("输入错误,请重新输入!");
            }
        }while (true);
    }
    public static void back(){
        int choice;
        do {
            System.out.print("输入0返回:");
            choice=sc.nextInt();
            if (choice==0){
                break;
            }else {
                System.out.println("注意!程序未退出无法做其他操作");
            }
        }while (true);
    }
}

运行结果展示:

太长不好截图,大家自行运行看一下吧!


最近其实是一直想写博客的,主要是想把java基础内容还有面向对象的内容都总结一下,但是会很费时间,而且自己最近也是还在学的阶段,时间不是很充裕(晚上熬夜到一两点还在看剧),毕竟我觉得现在白天还是蛮辛苦的,晚上娱乐一下也很正常,只要不影响白天学习就行,嘿嘿。尽量抽时间吧,我写完这篇就开始写关于它们俩的草稿,准备准备。(反正现在的状态也学不进新东西了,干脆复习吧!)


个人简介
👋 你好,我是 九病难祎,一位立志未来成为一名 Java工程师  热爱生活的终身学习者!目前的偶像是彭志辉(人称“稚晖君”,“野生钢铁侠”)。

🚀 我对技术的热情是我不断学习和分享的动力。希望未来通过自己所学习到的知识和技能带给我不再为金钱所困扰的生活,为自己未来所追求的幸福而创造基础和条件。我的博客内容目前没有具体的定位,未来我也将会不断摸索具体的方向,并进行归类。

💡 我的博客主要以分享自己总结的知识为主,同时它也将作为我个人的生活记录。

🌐 如果有什么问题,欢迎大家在评论区留言。

📖 今天晚上打算去看余华《第七天》,我现在还不清楚内容有多长,但是打算今天晚上+明天把它看完。(还是看漂亮的女生推荐的书动力十足,哈~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值