Java复用之道:贫道吕洞宾的"修仙传承"指南
作者:会编程的吕洞宾(一个擅长"道法传承"的程序员)
各位道友,今日贫道要传授Java中的复用大法!这就像我们修仙界的"功法传承"——如何继承前辈的修为,如何组合各种神通,如何让代码"生生不息"!
一、复用的两种大道:组合与继承
1.1 组合(Composition):法宝组合术
组合就像把各种法宝组合起来使用,**"有一个"**的关系:
java
// 组合示例:修仙者拥有各种法宝
public class CompositionDemo {
public static void main(String[] args) {
Immortal cultivator = new Immortal("张三丰");
cultivator.performCultivation();
}
}
// 法宝类 - 独立的工具
class MagicalSword {
public void attack() {
System.out.println("宝剑出鞘,斩妖除魔!");
}
}
class MagicalPill {
public void heal() {
System.out.println("仙丹入口,起死回生!");
}
}
class FlyingSword {
public void fly() {
System.out.println("御剑飞行,日行千里!");
}
}
// 修仙者类 - 组合各种法宝
class Immortal {
private String name;
private MagicalSword sword; // 组合:有一个宝剑
private MagicalPill pill; // 组合:有一个仙丹
private FlyingSword flyingSword; // 组合:有一个飞剑
public Immortal(String name) {
this.name = name;
this.sword = new MagicalSword();
this.pill = new MagicalPill();
this.flyingSword = new FlyingSword();
System.out.println(name + "道友诞生,携带全套法宝!");
}
public void performCultivation() {
System.out.println(name + "开始修炼:");
flyingSword.fly(); // 使用飞剑
sword.attack(); // 使用宝剑
pill.heal(); // 使用仙丹
}
}
1.2 继承(Inheritance):功法传承术
继承就像师父把毕生功力传给徒弟,**"是一个"**的关系:
java
// 继承示例:功法传承体系
public class InheritanceDemo {
public static void main(String[] args) {
// 向上转型:徒弟可以被当作师父看待
Master luDongbin = new Disciple("韩湘子");
luDongbin.performMagic();
}
}
// 师父类 - 基类
class Master {
protected String name;
protected int cultivationLevel;
public Master(String name) {
this.name = name;
this.cultivationLevel = 100;
System.out.println("师父" + name + "出关,修为:" + cultivationLevel);
}
public void performMagic() {
System.out.println(name + "施展基础法术");
}
public final void ultimateSkill() {
System.out.println(name + "施展终极绝学(不可被重写)");
}
}
// 徒弟类 - 继承师父
class Disciple extends Master {
private String specialSkill;
public Disciple(String name) {
super(name); // 必须调用父类构造器
this.cultivationLevel = 50; // 继承的修为
this.specialSkill = "独门绝技";
System.out.println("徒弟" + name + "拜师,继承修为:" + cultivationLevel);
}
// 方法重写:青出于蓝
@Override
public void performMagic() {
super.performMagic(); // 调用父类方法
System.out.println(name + "施展改良版法术 + " + specialSkill);
}
// 不能重写final方法
// public void ultimateSkill() {} // ❌ 编译错误
}
二、继承的详细修炼:筑基到飞升
2.1 构造器调用顺序:传承仪式
java
public class ConstructorOrder {
public static void main(String[] args) {
System.out.println("开始传承仪式:");
GrandDisciple disciple = new GrandDisciple("吕洞宾");
}
}
class GrandMaster {
GrandMaster() {
System.out.println("师祖出关");
}
}
class Master extends GrandMaster {
Master() {
System.out.println("师父接收传承");
}
}
class GrandDisciple extends Master {
GrandDisciple(String name) {
super(); // 隐含调用父类构造器
System.out.println("徒孙" + name + "完成传承");
}
}
2.2 方法重写(Override):青出于蓝
java
public class OverrideDemo {
public static void main(String[] args) {
MagicUser user = new AdvancedMagicUser();
user.castSpell(); // 调用重写后的方法
}
}
class MagicUser {
public void castSpell() {
System.out.println("基础法术:火球术");
}
}
class AdvancedMagicUser extends MagicUser {
@Override
public void castSpell() {
super.castSpell(); // 先调用父类方法
System.out.println("进阶法术:流星火雨");
}
}
三、访问控制:功法秘传等级
Java的访问修饰符就像修仙界的功法保密等级:
java
public class AccessControlDemo {
public static void main(String[] args) {
SectMaster master = new SectMaster();
master.publicMethod(); // 公开:所有门派都可学
// master.privateMethod(); // ❌ 私有:只有本类可用
master.protectedMethod(); // 受保护:本派弟子可学
}
}
class SectMaster {
// public:公开功法 - 所有修仙者都可学
public void publicMethod() {
System.out.println("公开功法:基础吐纳术");
}
// private:秘传心法 - 只有师父亲自掌握
private void privateMethod() {
System.out.println("秘传心法:只能师父使用");
}
// protected:门派绝学 - 本派弟子可学
protected void protectedMethod() {
System.out.println("门派绝学:本派专用");
}
// 默认(包访问):同门功法 - 同包弟子可学
void packageMethod() {
System.out.println("同门功法:同包可用");
}
}
class SectDisciple extends SectMaster {
public void learnSkills() {
publicMethod(); // ✅ 可访问:公开功法
protectedMethod(); // ✅ 可访问:本派绝学
// privateMethod(); // ❌ 不可访问:秘传心法
// packageMethod(); // ❌ 不可访问:不同包时不行
}
}
四、final关键字:功法定式
4.1 final类:功法不可传承
java
// final类:绝世神功,不可再传
public final class UltimateTechnique {
public void unleash() {
System.out.println("施展绝世神功!");
}
}
// class ForbiddenArt extends UltimateTechnique {} // ❌ 不能继承final类
4.2 final方法:招式不可改动
java
class KungFuMaster {
// final方法:固定招式,不可重写
public final void secretMove() {
System.out.println("独门绝技:降龙十八掌");
}
public void normalMove() {
System.out.println("普通招式:可被改良");
}
}
class KungFuDisciple extends KungFuMaster {
@Override
public void normalMove() {
System.out.println("改良招式:威力增强");
}
// public void secretMove() {} // ❌ 不能重写final方法
}
4.3 final变量:功法口诀固定
java
class SpellBook {
// final变量:功法口诀,不可更改
public final String SPELL_WORD = "临兵斗者皆阵列在前";
private final int POWER_LEVEL; // 空白final
public SpellBook(int power) {
POWER_LEVEL = power; // 构造器中初始化
}
public void demonstrate() {
// SPELL_WORD = "改口诀"; // ❌ 不能修改final变量
System.out.println("口诀:" + SPELL_WORD + ",威力:" + POWER_LEVEL);
}
}
五、多态:千变万化的道法
多态让同一个方法在不同对象上有不同表现:
java
public class PolymorphismDemo {
public static void main(String[] args) {
// 多态:父类引用指向子类对象
MagicSpell[] spells = {
new FireSpell(), // 火系法术
new WaterSpell(), // 水系法术
new WindSpell() // 风系法术
};
// 同一接口,不同表现
for (MagicSpell spell : spells) {
spell.cast(); // 多态调用
}
}
}
abstract class MagicSpell {
public abstract void cast(); // 抽象方法
}
class FireSpell extends MagicSpell {
@Override
public void cast() {
System.out.println("火系法术:烈焰焚天!");
}
}
class WaterSpell extends MagicSpell {
@Override
public void cast() {
System.out.println("水系法术:冰封万里!");
}
}
class WindSpell extends MagicSpell {
@Override
public void cast() {
System.out.println("风系法术:狂风呼啸!");
}
}
六、实战案例:完整的修仙门派系统
java
// 完整的复用实战
public class CompleteSectSystem {
public static void main(String[] args) {
// 创建门派
Sect heavenlySect = new Sect("天庭", "玉皇大帝");
// 招收弟子(组合)
heavenlySect.recruitDisciple("孙悟空");
heavenlySect.recruitDisciple("哪吒");
// 功法传承(继承)
heavenlySect.teachAdvancedMagic();
// 多态演示
heavenlySect.demonstratePolymorphism();
}
}
// 法宝类(组合用)
class MagicalArtifact {
private String name;
private int power;
public MagicalArtifact(String name, int power) {
this.name = name;
this.power = power;
}
public void use() {
System.out.println("使用" + name + ",威力:" + power);
}
}
// 修仙者基类(继承用)
abstract class Cultivator {
protected String name;
protected int level;
public Cultivator(String name) {
this.name = name;
this.level = 1;
}
public abstract void cultivate();
public void introduce() {
System.out.println("我是" + name + ",修为:" + level);
}
}
// 弟子类
class Disciple extends Cultivator {
private MagicalArtifact artifact; // 组合:拥有法宝
public Disciple(String name) {
super(name);
this.artifact = new MagicalArtifact("新手飞剑", 10);
}
@Override
public void cultivate() {
level++;
System.out.println(name + "修炼突破,当前修为:" + level);
}
public void useArtifact() {
artifact.use();
}
}
// 门派类
class Sect {
private String name;
private String leader;
private List<Disciple> disciples; // 组合:拥有弟子
public Sect(String name, String leader) {
this.name = name;
this.leader = leader;
this.disciples = new ArrayList<>();
System.out.println("创建门派:" + name + ",掌门:" + leader);
}
public void recruitDisciple(String name) {
Disciple disciple = new Disciple(name);
disciples.add(disciple);
System.out.println(name + "加入" + this.name);
}
public void teachAdvancedMagic() {
System.out.println("开始传授进阶功法:");
for (Disciple disciple : disciples) {
disciple.cultivate(); // 弟子修炼(继承的方法)
disciple.useArtifact(); // 使用法宝(组合的方法)
}
}
public void demonstratePolymorphism() {
System.out.println("多态演示:");
Cultivator[] cultivators = disciples.toArray(new Cultivator[0](@ref);
for (Cultivator cultivator : cultivators) {
cultivator.introduce(); // 多态调用
}
}
}
七、道友心得:复用选择的"天道法则"
7.1 何时使用组合?
"有一个"的关系时使用组合:
- 法宝和修仙者的关系
- 弟子和门派的关系
- 需要灵活替换组件时
口诀:想要灵活多变,组合是首选
7.2 何时使用继承?
"是一个"的关系时使用继承:
- 徒弟和师父的关系
- 进阶功法和基础功法的关系
- 需要向上转型实现多态时
口诀:想要传承有序,继承是根本
7.3 重要原则
-
优先使用组合:组合比继承更灵活
-
继承要谨慎:只有在真正是"is-a"关系时才用
-
多用接口:接口实现更松散的耦合
-
遵循里氏替换:子类应该能替换父类
无量天尊!愿各位道友掌握复用大道,让代码如修仙功法般传承有序、组合巧妙!
记住贫道的复用真言:
组合重灵活,继承重传承 多态显神通,接口定规范 复用得当者,代码自成仙!