0

0

Java中实例变量与静态变量的区别:解决“库存未全局递减”问题

霞舞

霞舞

发布时间:2026-02-19 18:54:01

|

109人浏览过

|

来源于php中文网

原创

Java中实例变量与静态变量的区别:解决“库存未全局递减”问题

本文详解为何创建多个JuiceStore对象时,leftJuices无法跨实例递减,并通过static关键字实现共享库存状态,辅以可运行示例与关键注意事项。

本文详解为何创建多个juicestore对象时,`leftjuices`无法跨实例递减,并通过`static`关键字实现共享库存状态,辅以可运行示例与关键注意事项。

在面向对象编程中,实例变量(instance variable)属于每个对象的独立副本——这是理解本问题的核心。原代码中,JuiceStore 类的 leftJuices 被声明为普通私有字段(private int leftJuices = 3;),这意味着每创建一个 JuiceStore 实例(如 Juice1、Juice2、Juice3),JVM 就为其分配一份全新的 leftJuices,初始值均为 3。因此,调用 Juice1.buyJuice() 仅将 Juice1.leftJuices 减至 2;Juice2.buyJuice() 同样从 3 减至 2,而非接续前一实例的剩余数量。最终三者各自剩余 2 瓶,而非全局库存从 3 → 2 → 1 → 0。

要实现所有果汁店实例共享同一份库存,必须将 leftJuices 改为 静态变量(static) ——它属于类本身,而非某个具体对象,所有实例共用同一内存地址:

public class JuiceStore {
    private int temperature;
    private static int leftJuices = 3; // ✅ 改为 static:全局唯一库存

    public JuiceStore(int temperature) {
        this.temperature = temperature;
    }

    public void buyJuice() throws NoJuiceException, TooColdException, TooWarmException {
        if (leftJuices < 1) {
            throw new NoJuiceException("Unfortunately, there is no juice left. Come back tomorrow.");
        }

        leftJuices--; // ✅ 直接操作静态变量(无需 this)
        System.out.println("You have bought a juice, there are " + leftJuices + " left.");

        if (temperature < 9) {
            throw new TooColdException("The juice is too cold.");
        }
        if (temperature > 15) {
            throw new TooWarmException("The juice is too warm.");
        }
        System.out.println("Drink successful.");
    }
}

? 关键修正点说明

  • leftJuices 声明前添加 static 修饰符;
  • 方法内访问时直接写 leftJuices--(this.leftJuices 在静态上下文中非法,编译报错);
  • 构造器中不再初始化 leftJuices(静态变量仅在类加载时初始化一次)。

此时,主程序逻辑保持不变,但行为彻底改变:

码上飞
码上飞

码上飞(CodeFlying) 是一款AI自动化开发平台,通过自然语言描述即可自动生成完整应用程序。

下载

立即学习Java免费学习笔记(深入)”;

public class Program {
    public static void main(String[] args) {
        JuiceStore juice1 = new JuiceStore(14);
        JuiceStore juice2 = new JuiceStore(7);
        JuiceStore juice3 = new JuiceStore(17);

        try { juice1.buyJuice(); } 
        catch (Exception e) { System.out.println(e.getMessage()); }

        try { juice2.buyJuice(); } 
        catch (Exception e) { System.out.println(e.getMessage()); }

        try { juice3.buyJuice(); } 
        catch (Exception e) { System.out.println(e.getMessage()); }
    }
}

预期输出

You have bought a juice, there are 2 left.  
Drink successful.  

You have bought a juice, there are 1 left.  
Drink successful.  

You have bought a juice, there are 0 left.  
Drink successful.  

⚠️ 重要注意事项

  • 线程安全风险:static 变量在多线程环境下可能引发竞态条件(如两个线程同时执行 leftJuices--)。若需并发支持,应使用 AtomicInteger 或同步块(synchronized);
  • 设计语义权衡:static 实现的是“单体库存”,符合“一家果汁店”的业务本质;若需模拟多家独立门店,则应保留实例变量,并引入外部库存管理器(如 InventoryManager 单例);
  • 初始化时机:static 字段在类首次被主动使用(如创建实例、调用静态方法)时初始化,且仅执行一次,确保全局一致性。

总结:当变量需被类的所有实例共享时,static 是正确选择;而误用实例变量会导致状态隔离,看似“不递减”实则是“各减各的”。理解这一区别,是写出健壮、符合业务模型的 Java 代码的关键基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

57

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

574

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

254

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

368

2025.12.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.8万人学习

Java 教程
Java 教程

共578课时 | 68.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号