你好,我是林森lsjs

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

目录
[1. 定义成员变量](#1. 定义成员变量)
[2. 构造方法](#2. 构造方法)
[3. 展示图书信息的方法](#3. 展示图书信息的方法)
[坑 1:把编号计数器或总册数定义为实例变量](#坑 1:把编号计数器或总册数定义为实例变量)
[坑 2:混淆静态方法和实例方法的调用方式](#坑 2:混淆静态方法和实例方法的调用方式)
一、题目解读
声明图书类,记录图书总册数,利用静态变量赋值。
声明一个图书类,其数据成员为书名、编号(利用静态变量实现自动编号)、书价,并拥有静态数据成员册数,记录图书的总册数;在构造方法中,利用静态变量为对象的编号赋值,在主方法中定义对象数组,并求出总册数。
输出格式:
请输出每本图书对应的书名,书号,书价以及总图书数。
输出样例:
书名:Java程序设计, 书号:1, 书价:34.5
书名:数据结构, 书号:2, 书价:44.8
书名:C++程序设计, 书号:3, 书价:35.0
图书总册数为:3
先把题目给你讲明白:
- 写一个图书类 Book
- 每个图书有:书名、书号、书价
- 书号自动增长 (1、2、3......),用静态变量实现
- 静态变量记录总册数,每创建一本书就 + 1
- 在主方法里用对象数组创建多本图书
- 输出每本书信息 + 输出总册数
二、核心知识点:静态变量到底怎么用?
这道题的重点就是 static 静态变量
我用最简单的话讲:
静态变量属于类,所有对象共用一份
一个地方改了,全部对象都跟着变
可以用来做计数器、自动编号、统计总数
本题我们要用两个静态变量:
static int nextId = 1;→ 下一本书的编号(自动增长)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;
}
四、主方法
步骤:
-
创建 Book 数组,存放多本图书
-
创建 3 本图书(赋值书名、价格)
-
循环输出每本书信息
-
输出总册数
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());
}
}
六、流程复盘(重中之重)
-
程序启动, 静态变量优先初始化 :
nextId = 1,count = 0;静态变量在全局共享区域,所有对象共用。 -
执行 main 方法,创建对象数组
Book[] books = new Book[3];开辟数组空间,3 个位置暂时为空。 -
**创建第一本图书
new Book("Java程序设计", 34.5)**自动调用构造方法:- 书名、价格赋值;
id = nextId→id = 1;nextId++→nextId = 2;count++→count = 1;第一本书编号 1,总册数 1。
-
**创建第二本图书
new Book("数据结构", 44.8)**再次调用构造方法:id = nextId→id = 2;nextId++→nextId = 3;count++→count = 2;第二本书编号 2,总册数 2。
-
**创建第三本图书
new Book("C++程序设计", 35.0)**调用构造方法:id = nextId→id = 3;nextId++→nextId = 4;count++→count = 3;第三本书编号 3,总册数 3。
-
**遍历数组,调用
showInfo()**依次打印 3 本图书的名称、编号、价格。 -
调用
Book.getCount()读取静态变量count=3,打印总册数。
核心结论:
nextId和count全程只有一份,不会因为创建新对象而重置,这就是静态变量实现自动编号、全局统计的原理。
七、几个坑
坑 1:把编号计数器或总册数定义为实例变量
错误写法:
private int nextId = 1;
private int count = 0;
问题:每创建一个对象,这两个变量都会重新初始化为 1 和 0
编号永远是 1,总数永远是 1,完全不符合题目要求。
统计、编号类变量必须加static 。
坑 2:混淆静态方法和实例方法的调用方式
实例方法showInfo():必须 对象.方法名(),不能用类名调用;
静态方法getCount():推荐 类名.方法名(),不推荐对象调用。
八、总结
static关键字:静态变量的特性、使用场景(计数器、自动编号、全局统计);- 面向对象封装:
private私有化成员变量,通过方法访问数据; - 构造方法:对象初始化、业务逻辑编写;
- 对象数组:批量管理多个对象,数组遍历。
诸位共勉,无限学习!
