🕌
让全家人像养育宝可梦一样学习面向对象编程的超强Java入门书~将热情转化为学习的神奇绘本~
📚 宝可梦与Java编程:章节目录
- 🔹 第1章 创建宝可梦图鉴!类的设计图
- 🔹 第2章 从精灵球中召唤!实例的创建与使用
- 🔹 第3章 保护宝可梦的秘密!类的机制
- 🔹 第4章 指向宝可梦!实例与引用的秘密
- 🔹 第5章 设计你的原创宝可梦!对象建模
- 🔹 第6章 揭开进化的秘密!继承的血统
- 🔹 第7章 解开宝可梦家族之谜!深入继承关系
- 🔹 第8章 宝可梦的变身术!引用的自动类型转换
- 🔹 第9章 一招多用!多态性的魔力
- 🔹 第10章 幻之宝可梦的谜团!抽象类的世界
- 🔹 第11章 宝可梦的属性与能力!接口的力量
🧩 第1章 创建宝可梦图鉴!类的设计图
🎯 1.1 什么是对象
在宝可梦的世界中,比如皮卡丘、小火龙等,都是“对象”。
在现实世界中,自行车或智能手机也是对象。
对象有两个主要部分:
- 🧬 属性(字段):例如皮卡丘的“类型”、“等级”等
- 🛠 行为(方法):例如“十万伏特”、“叫声”等技能
🏗 1.2 创建类
类是对象的“设计图”。
例如有一个“宝可梦”类,可以用它来创建皮卡丘、小火龙等各种对象。
public class Pokemon {
String name;
String type;
int level;
public void introduce() {
System.out.println("你好!我是" + name + ",类型是" + type + ",等级是" + level + "!");
}
}
🧪 1.3 总结与测试
| 项目 | 内容 |
|---|---|
| 类 | 宝可梦的设计图 |
| 对象 | 实际创建的皮卡丘、小火龙等实例 |
| 属性 | 名称、类型、等级等 |
| 方法 | 比如 introduce() 自我介绍方法 |
🎯 第2章 从精灵球中召唤!实例的创建与使用
🧱 2.1 创建实例
使用 new 关键字可以根据类创建对象,这就像从精灵球中召唤宝可梦一样。
Pokemon pika = new Pokemon();
🔓 2.2 使用 getter 和 setter
getter 用于获取属性值,setter 用于设置属性值。
public String getName() { return name; }
public void setName(String name) { this.name = name; }
🛠 2.3 添加方法
public void useMove() {
System.out.println(name + "使用了" + move + "!效果拔群!");
}
🎯 2.4 总结与测试
通过实例、getter、setter 和方法调用,掌握类的基本用法。
🛡 第3章 保护宝可梦的秘密!类的机制
🔐 3.1 限制其他类的访问
使用 private 关键字可以保护字段不被外部直接访问。
public class Pokemon {
private int hp;
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
}
⚙️ 3.2 成员的机制
-
static成员是所有实例共享的属性(如最大等级)。 - 实例成员是每个对象独有的。
🧱 3.3 构造方法的机制
构造方法用于在创建对象时初始化字段。Java 支持重载多个构造函数。
public Pokemon(String name, int level) {
this.name = name;
this.level = level;
}
🧪 3.4 总结与测试
| 项目 | 内容 |
|---|---|
| private | 限制访问 |
| public | 允许访问 |
| static | 类共享的字段 |
| 构造方法 | 创建对象时自动调用的方法 |
🧭 第4章 指向宝可梦!实例与引用的秘密
🎯 4.1 什么是引用
在 Java 中,变量实际保存的是对象的引用(地址),而不是对象本身。
Pokemon p1 = new Pokemon();
Pokemon p2 = p1; // p1 和 p2 指向同一个对象
👀 4.2 注意引用的副作用
修改 p2 的内容,会影响到 p1,因为它们指向同一个实例。
🧊 4.3 创建不可变类(Immutable)
使用 final 和不提供 setter 方法可以创建不可变对象。
public final class Pokemon {
private final String name;
public Pokemon(String name) { this.name = name; }
public String getName() { return name; }
}
🧬 4.4 引用类型
| 类型 | 示例 | 说明 |
|---|---|---|
| 基本类型 | int, double | 存储值本身 |
| 引用类型 | String, Object | 存储对象地址 |
🧪 4.5 总结与测试
理解引用对于避免误修改、掌握 Java 内存模型至关重要。
🧪 第5章 设计你的原创宝可梦!对象建模
🧱 5.1 用类实现功能
通过类建模可以表达宝可梦的名字、类型、等级、技能等。
public class Pokemon {
private String name;
private String type;
private int level;
private String[] moves;
public Pokemon(String name, String type, int level, String[] moves) {
this.name = name;
this.type = type;
this.level = level;
this.moves = moves;
}
public void introduce() {
System.out.println("名字:" + name + " 类型:" + type + " 等级:" + level);
for (String move : moves) {
System.out.println("- " + move);
}
}
}
📦 5.2 使用 record 简化类定义(Java 16+)
public record SimplePokemon(String name, String type, int level) {
public boolean isStarter() {
return level <= 10;
}
}
🎯 5.3 总结与测试
| 概念 | 说明 |
|---|---|
| 建模 | 将现实世界的对象转化为类 |
| record | 简化的数据类定义 |
| 不可变性 | 保证对象状态不会被修改 |
🧬 第6章 揭开进化的秘密!继承的血统
📊 6.1 类图
继承关系可以通过类图展示,如皮丘 → 皮卡丘 → 雷丘:
Pokemon(父类)
└─ Pikachu(子类)
└─ Raichu(孙类)
🧪 6.2 继承的使用方法
public class Pokemon {
String name;
String type;
public void introduce() {
System.out.println("我是" + name + " 类型是" + type + "!");
}
}
public class Pikachu extends Pokemon {
int level;
public void thunderbolt() {
System.out.println(name + "使用了十万伏特!");
}
}
📜 6.3 继承的规则
-
is-a关系成立时可继承(如“皮卡丘是宝可梦”) -
final类不能被继承 -
sealed类可限制继承类(Java 17+)
🎯 6.4 总结与测试
| 概念 | 说明 |
|---|---|
| 继承 | 子类从父类继承属性和方法 |
| final | 禁止进一步继承 |
| sealed | 限定允许继承的类(Java 17) |
🌳 第7章 解开宝可梦家族之谜!深入继承关系
🌳 7.1 继承树
构建一个宝可梦继承家族树,如:
Pokemon
├── Meowth
│ └── Perrserker
└── Eevee
├── Vaporeon
├── Jolteon
└── Flareon
🔗 7.2 构造函数的调用链
父类构造函数会先被调用:
public class Pokemon {
public Pokemon(String name) {
System.out.println(name + " 诞生了!");
}
}
public class Eevee extends Pokemon {
public Eevee() {
super("伊布");
System.out.println("伊布准备好了!");
}
}
📁 7.3 将多个类写在一个文件中
public class Pokemon {
String name;
public void greet() {
System.out.println("你好,我是" + name + "!");
}
}
class Pikachu extends Pokemon {
public Pikachu() {
name = "皮卡丘";
}
}
🛡 7.4 protected 修饰符
protected 表示可以在同一包或子类中访问。
🎯 7.5 总结与测试
| 概念 | 内容 |
|---|---|
| Object类 | 所有类的祖先类 |
| super() | 调用父类构造函数 |
| protected | 限制访问范围到包和子类 |
🌀 第8章 宝可梦的变身术!引用的自动类型转换
🪄 8.1 引用的自动类型转换
Pokemon pika = new Pikachu("皮卡丘", 20);
pika.introduce();
子类对象可以赋值给父类类型变量,这就像百变怪变成了其他宝可梦。
🧱 8.2 向上转型与向下转型
- 向上转型:子类 → 父类(自动)
- 向下转型:父类 → 子类(需要强制转换)
Pikachu pika = (Pikachu) poke;
🔍 8.3 使用 instanceof 判断类型
if (poke instanceof Pikachu) {
Pikachu pika = (Pikachu) poke;
}
🧠 8.4 使用 switch 判断类型(Java 14+)
switch (poke) {
case Pikachu p -> p.thunderbolt();
case Eevee e -> e.adapt();
}
🎯 8.5 总结与测试
| 概念 | 说明 |
|---|---|
| 向上转型 | 自动类型转换 |
| 向下转型 | 强制类型转换 |
| instanceof | 类型判断关键字 |
| switch 表达式 | Java 14 起支持类型模式匹配 |
🎭 第9章 一招多用!多态性的魔力
💡 9.1 方法重载(Overload)
同名方法根据参数不同执行不同逻辑。
public void attack(String move) { ... }
public void attack(String move, int times) { ... }
🔁 9.2 方法重写(Override)
子类重写父类方法,实现不同表现。
public class Pokemon {
public void attack() { ... }
}
public class Pikachu extends Pokemon {
@Override
public void attack() {
System.out.println("皮卡丘使用了十万伏特!");
}
}
🌀 9.3 多态(Polymorphism)
父类变量调用子类方法,实现多种行为。
Pokemon poke = new Pikachu();
poke.attack(); // 实际调用子类方法
🎯 9.4 总结与测试
| 概念 | 说明 |
|---|---|
| 重载 | 同名不同参数的方法 |
| 重写 | 子类覆盖父类的方法 |
| 多态 | 运行时根据对象类型决定方法行为 |
| 动态绑定 | 在运行时决定调用哪个方法 |
🦄 第10章 幻之宝可梦的谜团!抽象类的世界
🧩 10.1 什么是抽象类
抽象类是“未完成的设计图”,不能被实例化。
public abstract class Pokemon {
String name;
String type;
public void introduce() {
System.out.println("我是 " + name + " 类型是 " + type);
}
public abstract void specialMove(); // 抽象方法
}
🧬 10.2 继承抽象类
子类必须实现所有抽象方法。
public class Mew extends Pokemon {
public Mew() {
name = "梦幻";
type = "超能力";
}
@Override
public void specialMove() {
System.out.println("梦幻使用了精神强念!");
}
}
🗺 10.3 抽象类的类图
<<abstract>> Pokemon
+introduce()
+specialMove() ← 抽象方法
▲
|
Mew
🎯 10.4 总结与测试
| 概念 | 内容 |
|---|---|
| 抽象类 | 无法实例化的类 |
| 抽象方法 | 没有实现内容的方法 |
| 继承强制实现 | 子类必须实现抽象方法 |
| 中间抽象类设计 | 可以抽象继承链的一部分 |
🔗 第11章 宝可梦的属性与能力!接口的力量
💡 11.1 什么是接口(interface)
接口像“飞行属性”、“水属性”这样的能力说明书。
public interface Flyable {
void fly(); // 所有实现者都必须实现该方法
}
🔁 11.2 类型转换为接口类型
Flyable flyingPokemon = new Charizard();
flyingPokemon.fly();
🎭 11.3 接口实现多态
public void useFly(Flyable f) {
f.fly(); // 任意实现了接口的类都能飞
}
🌐 11.4 接口继承接口
public interface FlyingWaterType extends Flyable, WaterType {
void dive();
}
🎯 11.5 总结与测试
| 概念 | 内容 |
|---|---|
| 接口 | 能力规范,所有实现者需遵守 |
| implements | 类实现接口 |
| 多重实现 | 一个类可以实现多个接口 |
| 接口多态性 | 可用接口类型调用具体实现 |
Discussion