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;
}
}
吕洞宾的内部类心法
记住这几条修仙要诀:
- "内外合一":内部类天然拥有访问外部类的能力
- "静动有别":静态内部类独立,非静态的依赖实例
- "临机应变":方法内部类和匿名内部类适合临时需求
- "隐显自如":合理使用访问控制,保护内部实现
内部类就像修仙者的"第二元神",藏在体内却威力无穷。用好了内部类,你的代码就能像修炼出元婴的仙人一样,内外兼修,神通广大!