【日耕一题】1. 图书类:声明图书类,记录图书总册数,利用静态变量赋值

你好,我是林森lsjs

欢迎来到日耕一题,跟着我,吃透这道题, 这道题是 Java 面向对象、static 静态变量的经典例题。

目录

一、题目解读

二、核心知识点:静态变量到底怎么用?

三、图书类Book完整代码编写

[1. 定义成员变量](#1. 定义成员变量)

[2. 构造方法](#2. 构造方法)

[3. 展示图书信息的方法](#3. 展示图书信息的方法)

四、主方法

五、完整可运行代码

六、流程复盘(重中之重)​编辑

七、几个坑

[坑 1:把编号计数器或总册数定义为实例变量](#坑 1:把编号计数器或总册数定义为实例变量)

[坑 2:混淆静态方法和实例方法的调用方式](#坑 2:混淆静态方法和实例方法的调用方式)

八、总结


一、题目解读

声明图书类,记录图书总册数,利用静态变量赋值。

声明一个图书类,其数据成员为书名、编号(利用静态变量实现自动编号)、书价,并拥有静态数据成员册数,记录图书的总册数;在构造方法中,利用静态变量为对象的编号赋值,在主方法中定义对象数组,并求出总册数。

输出格式:

请输出每本图书对应的书名,书号,书价以及总图书数。

输出样例:

书名:Java程序设计, 书号:1, 书价:34.5

书名:数据结构, 书号:2, 书价:44.8

书名:C++程序设计, 书号:3, 书价:35.0

图书总册数为:3

先把题目给你讲明白:

  1. 写一个图书类 Book
  2. 每个图书有:书名、书号、书价
  3. 书号自动增长 (1、2、3......),用静态变量实现
  4. 静态变量记录总册数,每创建一本书就 + 1
  5. 在主方法里用对象数组创建多本图书
  6. 输出每本书信息 + 输出总册数

二、核心知识点:静态变量到底怎么用?

这道题的重点就是 static 静态变量

我用最简单的话讲:

静态变量属于类,所有对象共用一份

一个地方改了,全部对象都跟着变

可以用来做计数器、自动编号、统计总数

本题我们要用两个静态变量:

  1. static int nextId = 1; → 下一本书的编号(自动增长)
  2. static int count = 0; → 图书总册数

三、图书类Book完整代码编写

1. 定义成员变量

规则:

书名、价格:每个图书不一样 → 非静态

编号、总册数:所有图书共用 → 静态

java 复制代码
public class Book {
    // 非静态:每个图书独有的
    private String name;   // 书名
    private double price;  // 书价
    private int id;        // 本书的编号

    // 静态:所有图书共用
    private static int nextId = 1;  // 下一本书的编号(自动增长)
    private static int count = 0;  // 图书总册数
}

2. 构造方法

构造方法作用:

给当前书自动分配编号

总册数 +1

给书名、价格赋值

java 复制代码
// 构造方法
public Book(String name, double price) {
    this.name = name;
    this.price = price;
    this.id = nextId;       // 当前编号 = 下一个编号
    nextId++;               // 编号自增,给下一本书用
    count++;                // 每创建一本书,总数+1
}

3. 展示图书信息的方法

输出格式:书名:XXX, 书号:X, 书价:XX.X

复制代码
// 展示图书信息
public void showInfo() {
    System.out.println("书名:" + name + ", 书号:" + id + ", 书价:" + price);
}

// 获取总册数
public static int getCount() {
    return count;
}

四、主方法

步骤:

  1. 创建 Book 数组,存放多本图书

  2. 创建 3 本图书(赋值书名、价格)

  3. 循环输出每本书信息

  4. 输出总册数

    public static void main(String[] args) {
    // 创建对象数组
    Book[] books = new Book[3];

    复制代码
     // 创建图书
     books[0] = new Book("Java程序设计", 34.5);
     books[1] = new Book("数据结构", 44.8);
     books[2] = new Book("C++程序设计", 35.0);
    
     // 遍历输出
     for (Book book : books) {
         book.showInfo();
     }
    
     // 输出总册数
     System.out.println("图书总册数为:" + Book.getCount());

    }


五、完整可运行代码

复制代码
public class Book {
    // 非静态成员变量
    private String name;
    private double price;
    private int id;

    // 静态成员变量(自动编号 + 统计总数)
    private static int nextId = 1;
    private static int count = 0;

    // 构造方法
    public Book(String name, double price) {
        this.name = name;
        this.price = price;
        this.id = nextId;
        nextId++;
        count++;
    }

    // 展示信息
    public void showInfo() {
        System.out.println("书名:" + name + ", 书号:" + id + ", 书价:" + price);
    }

    // 获取总册数
    public static int getCount() {
        return count;
    }

    // 主方法测试
    public static void main(String[] args) {
        Book[] books = new Book[3];

        books[0] = new Book("Java程序设计", 34.5);
        books[1] = new Book("数据结构", 44.8);
        books[2] = new Book("C++程序设计", 35.0);

        for (Book b : books) {
            b.showInfo();
        }

        System.out.println("图书总册数为:" + Book.getCount());
    }
}

六、流程复盘(重中之重)

  1. 程序启动, 静态变量优先初始化nextId = 1count = 0;静态变量在全局共享区域,所有对象共用。

  2. 执行 main 方法,创建对象数组 Book[] books = new Book[3];开辟数组空间,3 个位置暂时为空。

  3. **创建第一本图书 new Book("Java程序设计", 34.5)**自动调用构造方法:

    • 书名、价格赋值;
    • id = nextIdid = 1
    • nextId++nextId = 2
    • count++count = 1;第一本书编号 1,总册数 1。
  4. **创建第二本图书 new Book("数据结构", 44.8)**再次调用构造方法:

    • id = nextIdid = 2
    • nextId++nextId = 3
    • count++count = 2;第二本书编号 2,总册数 2。
  5. **创建第三本图书 new Book("C++程序设计", 35.0)**调用构造方法:

    • id = nextIdid = 3
    • nextId++nextId = 4
    • count++count = 3;第三本书编号 3,总册数 3。
  6. **遍历数组,调用showInfo()**依次打印 3 本图书的名称、编号、价格。

  7. 调用Book.getCount() 读取静态变量count=3,打印总册数。

核心结论:nextIdcount 全程只有一份,不会因为创建新对象而重置,这就是静态变量实现自动编号、全局统计的原理。


七、几个坑

坑 1:把编号计数器或总册数定义为实例变量

错误写法:

复制代码
private int nextId = 1;
private int count = 0;

问题:每创建一个对象,这两个变量都会重新初始化为 1 和 0

编号永远是 1,总数永远是 1,完全不符合题目要求。

统计、编号类变量必须加static

坑 2:混淆静态方法和实例方法的调用方式

实例方法showInfo():必须 对象.方法名(),不能用类名调用;

静态方法getCount():推荐 类名.方法名(),不推荐对象调用。

八、总结

  1. static关键字:静态变量的特性、使用场景(计数器、自动编号、全局统计);
  2. 面向对象封装:private私有化成员变量,通过方法访问数据;
  3. 构造方法:对象初始化、业务逻辑编写;
  4. 对象数组:批量管理多个对象,数组遍历。

诸位共勉,无限学习!

相关推荐
Lhappy嘻嘻9 小时前
Java 并发编程(六)|并发进阶高频:CAS、锁升级
java·开发语言
techdashen9 小时前
Arborium:把 tree-sitter 语法高亮打包成 Rust 文档生态的基础设施
开发语言·后端·rust
要开心吖ZSH9 小时前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
京韵养生记9 小时前
【无标题】
java·服务器·前端
会周易的程序员9 小时前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot
小强库计算机毕业设计9 小时前
源码分享Spring Boot + Vue3 的校园社团管理系统
java·spring boot·后端·计算机毕业设计
Esaka_Forever9 小时前
Python 完整内存管理机制详解
开发语言·python·spring
星空露珠10 小时前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua
格子软件10 小时前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
hj28625110 小时前
Docker 容器化技术标准化笔记
java·笔记·docker