Java内部类:修仙界的"法宝内藏玄机"

Java内部类:修仙界的"法宝内藏玄机"

作者:会编程的吕洞宾

温馨提示:内部类就像修仙者的"本命法宝",藏在体内却又威力无穷!

什么是内部类?体内的"第二元神"

想象一下,修仙者体内藏着一个"本命飞剑"------它属于你,但又相对独立。这就是内部类:定义在另一个类内部的类,就像体内修炼出的第二元神。

typescript 复制代码
// 修仙者本体 - 外部类
public class Cultivator {
    private String name;
    private int cultivationLevel;
    
    // 本命法宝 - 内部类
    class InnerSword {
        private String swordName;
        private boolean isActivated;
        
        public InnerSword(String name) {
            this.swordName = name;
            this.isActivated = false;
        }
        
        public void activate() {
            if (cultivationLevel >= 3) { // 直接访问外部类的私有成员!
                isActivated = true;
                System.out.println(name + "的本命飞剑" + swordName + "激活!");
            }
        }
        
        public void displayStatus() {
            System.out.println("飞剑" + swordName + "状态:" + 
                (isActivated ? "已激活" : "未激活"));
        }
    }
    
    public Cultivator(String name) {
        this.name = name;
        this.cultivationLevel = 1;
    }
    
    public void cultivate() {
        cultivationLevel++;
        System.out.println(name + "修炼,境界提升至" + cultivationLevel);
    }
    
    // 创建本命法宝的方法
    public InnerSword createInnerSword(String swordName) {
        return new InnerSword(swordName);
    }
}

内部类的四大类型:不同的"修炼方式"

1. 成员内部类:标准的"本命法宝"

csharp 复制代码
// 外部类 - 修仙洞府
public class ImmortalCave {
    private String caveName;
    private int spiritualEnergy;
    
    // 成员内部类 - 洞府守护灵
    class GuardianSpirit {
        private String spiritName;
        private int powerLevel;
        
        public GuardianSpirit(String name) {
            this.spiritName = name;
            this.powerLevel = spiritualEnergy / 10; // 依赖外部类状态
        }
        
        public void protect() {
            System.out.println(spiritName + "守护" + caveName + "洞府");
            System.out.println("守护力量:" + powerLevel);
        }
        
        // 内部类可以访问外部类的所有成员
        public void absorbEnergy() {
            powerLevel += spiritualEnergy / 5;
            spiritualEnergy -= 10;
            System.out.println(spiritName + "吸收灵气,力量增强");
        }
    }
    
    public ImmortalCave(String name, int energy) {
        this.caveName = name;
        this.spiritualEnergy = energy;
    }
    
    public GuardianSpirit summonGuardian(String name) {
        return new GuardianSpirit(name);
    }
    
    public void displayCaveInfo() {
        System.out.println("洞府:" + caveName + ",灵气:" + spiritualEnergy);
    }
}

// 使用示例
public class CaveTest {
    public static void main(String[] args) {
        ImmortalCave cave = new ImmortalCave("紫霄洞", 100);
        cave.displayCaveInfo();
        
        // 创建内部类对象
        ImmortalCave.GuardianSpirit spirit = cave.summonGuardian("青龙");
        spirit.protect();
        spirit.absorbEnergy();
        
        cave.displayCaveInfo(); // 灵气减少了!
    }
}

2. 静态内部类:独立的"护山法阵"

arduino 复制代码
// 修仙门派
public class Sect {
    private String sectName;
    private static String daoScripture = "道德经"; // 静态经典
    
    // 静态内部类 - 护山法阵(不依赖具体门派实例)
    static class ProtectionFormation {
        private String formationName;
        private static int formationCount = 0;
        
        public ProtectionFormation(String name) {
            this.formationName = name;
            formationCount++;
        }
        
        public void activate() {
            System.out.println("启动" + formationName + "法阵");
            System.out.println("依据:" + daoScripture); // 只能访问外部类的静态成员
            System.out.println("当前法阵数量:" + formationCount);
        }
        
        // 静态方法
        public static int getTotalFormations() {
            return formationCount;
        }
    }
    
    public Sect(String name) {
        this.sectName = name;
    }
}

// 使用静态内部类(不需要外部类实例)
public class FormationTest {
    public static void main(String[] args) {
        // 直接创建静态内部类
        Sect.ProtectionFormation formation = new Sect.ProtectionFormation("九宫八卦阵");
        formation.activate();
        
        // 访问静态内部类的静态方法
        System.out.println("总法阵数:" + Sect.ProtectionFormation.getTotalFormations());
    }
}

3. 方法内部类:临时的"符咒术"

arduino 复制代码
// 符咒大师
public class TalismanMaster {
    private String masterName;
    
    public TalismanMaster(String name) {
        this.masterName = name;
    }
    
    // 方法内部类 - 只能在方法内使用
    public void createTalisman(String target, String effect) {
        final int powerLevel = 5; // 必须是final或等效final
        
        // 方法内部类
        class Talisman {
            private String talismanName;
            private boolean isActivated;
            
            public Talisman(String name) {
                this.talismanName = name;
                this.isActivated = false;
            }
            
            public void activate() {
                if (powerLevel >= 3) { // 访问方法的final变量
                    isActivated = true;
                    System.out.println(masterName + "激活" + talismanName);
                    System.out.println("目标:" + target + ",效果:" + effect);
                }
            }
        }
        
        // 在方法内创建和使用
        Talisman talisman = new Talisman(target + "符");
        talisman.activate();
    }
    
    public void batchCreateTalismans() {
        String[] targets = {"驱邪", "招财", "护身"};
        
        for (String target : targets) {
            // 每次循环都创建不同的内部类(概念上)
            createTalisman(target, "灵验");
        }
    }
}

4. 匿名内部类:一次性的"召唤术"

csharp 复制代码
// 召唤术接口
interface Summoning {
    void summon();
    String getCreatureType();
}

// 召唤师
public class Summoner {
    private String summonerName;
    
    public Summoner(String name) {
        this.summonerName = name;
    }
    
    public void performSummoning(final String creatureName) {
        // 匿名内部类 - 一次性实现接口
        Summoning summoning = new Summoning() {
            private int manaCost = 10;
            
            @Override
            public void summon() {
                System.out.println(summonerName + "召唤" + creatureName + "!");
                System.out.println("消耗法力:" + manaCost);
            }
            
            @Override
            public String getCreatureType() {
                return creatureName.contains("龙") ? "神兽" : "灵兽";
            }
        };
        
        summoning.summon();
        System.out.println("生物类型:" + summoning.getCreatureType());
    }
    
    // 更简洁的写法
    public void quickSummon() {
        new Summoning() {
            @Override
            public void summon() {
                System.out.println("快速召唤:天兵天将!");
            }
            
            @Override
            public String getCreatureType() {
                return "天界生物";
            }
        }.summon(); // 直接调用
    }
}

// Java 8+ Lambda简化(适合只有一个方法的接口)
interface SimpleSummon {
    void invoke();
}

public class LambdaSummoner {
    public void modernSummoning() {
        SimpleSummon dragonSummon = () -> System.out.println("召唤神龙!");
        dragonSummon.invoke();
        
        // 更简洁的写法
        ((SimpleSummon)() -> System.out.println("瞬间召唤!")).invoke();
    }
}

内部类的特殊能力:修仙者的"神通"

1. 访问外部类私有成员

csharp 复制代码
public class OuterClass {
    private String secret = "修仙秘法";
    private static String staticSecret = "天道法则";
    
    class InnerClass {
        public void revealSecret() {
            System.out.println("内部类知道秘密:" + secret); // 直接访问
        }
    }
    
    static class StaticInnerClass {
        public void revealStaticSecret() {
            System.out.println("静态内部类知道:" + staticSecret); // 只能访问静态的
            // System.out.println(secret); // 错误!不能访问非静态的
        }
    }
}

2. .this 和 .new 的妙用

csharp 复制代码
public class MagicCircle {
    private String circleName = "五行阵";
    
    class ArrayInner {
        public void printOuterReference() {
            // 获取外部类的引用
            MagicCircle outer = MagicCircle.this;
            System.out.println("我属于:" + outer.circleName);
        }
    }
    
    public void test() {
        ArrayInner inner = this.new ArrayInner(); // 显式创建
        inner.printOuterReference();
    }
}

// 外部创建内部类
public class ExternalTest {
    public static void main(String[] args) {
        MagicCircle circle = new MagicCircle();
        MagicCircle.ArrayInner inner = circle.new ArrayInner(); // 必须通过外部实例
        inner.printOuterReference();
    }
}

实战:完整的修仙系统

csharp 复制代码
// 修仙系统完整示例
public class CultivationSystem {
    private String systemName;
    private List<Cultivator> cultivators = new ArrayList<>();
    
    // 成员内部类 - 系统管理员
    class SystemAdmin {
        private String adminName;
        
        public SystemAdmin(String name) {
            this.adminName = name;
        }
        
        public void manageSystem() {
            System.out.println(adminName + "管理" + systemName);
            System.out.println("当前修仙者数量:" + cultivators.size());
            
            // 可以操作外部类的私有集合
            for (Cultivator c : cultivators) {
                System.out.println("修仙者:" + c.getName());
            }
        }
        
        public void addCultivator(String name) {
            cultivators.add(new Cultivator(name));
            System.out.println("新增修仙者:" + name);
        }
    }
    
    // 静态内部类 - 系统统计
    static class SystemStats {
        private static int totalSystems = 0;
        private String statsType;
        
        public SystemStats(String type) {
            this.statsType = type;
            totalSystems++;
        }
        
        public void displayStats() {
            System.out.println("统计类型:" + statsType);
            System.out.println("总系统数:" + totalSystems);
        }
        
        public static void resetCount() {
            totalSystems = 0;
        }
    }
    
    public CultivationSystem(String name) {
        this.systemName = name;
    }
    
    // 方法中使用内部类
    public void initialize(final String adminName) {
        final int initPower = 100; // final变量
        
        class Initializer {
            public void setup() {
                System.out.println("初始化系统:" + systemName);
                System.out.println("初始能量:" + initPower);
                System.out.println("管理员:" + adminName);
                
                // 创建管理员
                SystemAdmin admin = new SystemAdmin(adminName);
                admin.manageSystem();
            }
        }
        
        new Initializer().setup();
    }
    
    // 使用匿名内部类实现事件处理
    public void setupEventSystem() {
        // 事件处理器接口
        interface EventHandler {
            void handleEvent(String event);
        }
        
        // 匿名内部类实现
        EventHandler battleHandler = new EventHandler() {
            private int battleCount = 0;
            
            @Override
            public void handleEvent(String event) {
                battleCount++;
                System.out.println("处理事件:" + event);
                System.out.println("累计战斗次数:" + battleCount);
            }
        };
        
        battleHandler.handleEvent("宗门大战");
        battleHandler.handleEvent("秘境探险");
    }
    
    public static void main(String[] args) {
        CultivationSystem system = new CultivationSystem("仙界联盟");
        
        // 测试各种内部类
        system.initialize("太上老君");
        
        // 创建成员内部类
        CultivationSystem.SystemAdmin admin = system.new SystemAdmin("元始天尊");
        admin.addCultivator("张三丰");
        admin.addCultivator("吕洞宾");
        admin.manageSystem();
        
        // 创建静态内部类
        CultivationSystem.SystemStats stats = new CultivationSystem.SystemStats("修仙统计");
        stats.displayStats();
        
        // 测试事件系统
        system.setupEventSystem();
    }
}

// 修仙者类
class Cultivator {
    private String name;
    
    public Cultivator(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

吕洞宾的内部类心法

记住这几条修仙要诀:

  1. "内外合一":内部类天然拥有访问外部类的能力
  2. "静动有别":静态内部类独立,非静态的依赖实例
  3. "临机应变":方法内部类和匿名内部类适合临时需求
  4. "隐显自如":合理使用访问控制,保护内部实现

内部类就像修仙者的"第二元神",藏在体内却威力无穷。用好了内部类,你的代码就能像修炼出元婴的仙人一样,内外兼修,神通广大!

相关推荐
niucloud-admin2 分钟前
插件开发——upgrade 插件版本升级
java
vortex52 分钟前
Gradle 从入门到实战
java·gradle
代码丰3 分钟前
Zero Code Studio:LangChain4j 工具调用 + LangGraph4j 工作流双模式的 AI 网站生成系统
java·人工智能
云烟成雨TD31 分钟前
Spring AI 1.x 系列【28】基于内存和 MySQL 的多轮对话实现案例
java·人工智能·spring
Lyyaoo.33 分钟前
【JAVA基础面经】String、StringBuffer、StringBuilder
java·开发语言
TeamDev39 分钟前
JxBrowser 8.18.2 版本发布啦!
java·前端·跨平台·桌面应用·web ui·jxbrowser·浏览器控件
晴天sir43 分钟前
Redis 在业务中的几种典型用法
java·数据库·redis
WJX_KOI1 小时前
MemOS —— 为大语言模型 (LLMs) 和智能体打造的记忆操作系统。
java·人工智能·语言模型
何陋轩1 小时前
AI时代,程序员何去何从?别慌,看完这篇你就明白了
后端·面试
_日拱一卒1 小时前
LeetCode:矩阵置零
java·数据结构·线性代数·算法·leetcode·职场和发展·矩阵