Java复用之道:贫道吕洞宾的"修仙传承"指南

50 阅读6分钟

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 重要原则

  1. 优先使用组合:组合比继承更灵活

  2. 继承要谨慎:只有在真正是"is-a"关系时才用

  3. 多用接口:接口实现更松散的耦合

  4. 遵循里氏替换:子类应该能替换父类


无量天尊!愿各位道友掌握复用大道,让代码如修仙功法般传承有序、组合巧妙!

记住贫道的复用真言:

组合重灵活,继承重传承 多态显神通,接口定规范 复用得当者,代码自成仙!