【日耕一题】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. 对象数组:批量管理多个对象,数组遍历。

诸位共勉,无限学习!

相关推荐
武子康37 分钟前
Java-07 深入浅出 MyBatis数据库一对多关系模型实战:表结构设计与查询实现
java·后端
REDcker3 小时前
Linux OverlayFS详解
java·linux·运维
Royzst3 小时前
xml知识点
java·服务器·前端
鱼鳞_3 小时前
苍穹外卖-Day08(缓存套餐)
java·redis·缓存
过期动态4 小时前
【LeetCode 热题 100】移动零
java·数据结构·算法·leetcode·职场和发展·rabbitmq
努力努力再努力wz4 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
skywalk81634 小时前
言知(Yanzhi)系统提升建议报告和完工报告 by AutoCoder
开发语言·编程
yunn_4 小时前
单例模式两种实现方法
开发语言·c++·单例模式
我材不敲代码5 小时前
Python基础:列表详解、增删改查及常用高阶操作
开发语言·windows·python
sinat_255487815 小时前
IDEA:查找文件/类
java·ide·设计模式·intellij-idea