Java内部类:修仙界的\”法宝内藏玄机\”
什么是内部类?体内的\”第二元神\”
想象一下,修仙者体内藏着一个\”本命飞剑\”——它属于你,但又相对独立。这就是内部类:定义在另一个类内部的类,就像体内修炼出的第二元神。
// 修仙者本体 - 外部类
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. 成员内部类:标准的\”本命法宝\”
// 外部类 - 修仙洞府
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. 静态内部类:独立的\”护山法阵\”
// 修仙门派
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. 方法内部类:临时的\”符咒术\”
// 符咒大师
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. 匿名内部类:一次性的\”召唤术\”
// 召唤术接口
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. 访问外部类私有成员
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 的妙用
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();
}
}
实战:完整的修仙系统
// 修仙系统完整示例
public class CultivationSystem {
private String systemName;
private List 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;
}
}
吕洞宾的内部类心法
记住这几条修仙要诀:
- \”内外合一\”:内部类天然拥有访问外部类的能力
- \”静动有别\”:静态内部类独立,非静态的依赖实例
- \”临机应变\”:方法内部类和匿名内部类适合临时需求
- \”隐显自如\”:合理使用访问控制,保护内部实现
内部类就像修仙者的\”第二元神\”,藏在体内却威力无穷。用好了内部类,你的代码就能像修炼出元婴的仙人一样,内外兼修,神通广大!



还没有评论呢,快来抢沙发~