java day1
java 三大特性/: 封装 继承 多态
java 中的嵌套类和 非静态嵌套类

在静态内部访问外层类的成员 这样是不可行的
class Animal {
// inner class
class Reptile {
public void displayInfo() {
System.out.println("I am a reptile.");
}
}
// static class
static class Mammal {
public void displayInfo() {
System.out.println("I am a mammal.");
}
}
}
class Main {
public static void main(String[] args) {
// object creation of the outer class
Animal animal = new Animal();
// object creation of the non-static class
Animal.Reptile reptile = animal.new Reptile();
reptile.displayInfo();
// object creation of the static nested class
Animal.Mammal mammal = new Animal.Mammal();
mammal.displayInfo();
}
}
代码解析:两种内部类的创建方式对比
这段 main 方法是最精炼的 "一句话教学"——它把 Java 中两种嵌套类的核心差异浓缩在了两行创建语句里。
整体架构
Animal 类中同时定义了两种嵌套类,形成天然的对比实验:
嵌套类 类型 声明
Reptile 非静态内部类(Inner Class) class Reptile
Mammal 静态嵌套类(Static Nested Class) static class Mammal
逐行分析
第 22 行:创建外部类实例
java
Animal animal = new Animal();
这是普通的对象创建,但这里创建它的目的不是为了用它,而是为了下一步创建内部类对象做准备。
第 25 行:创建非静态内部类对象(核心对比点)
java
Animal.Reptile reptile = animal.new Reptile();
这行代码体现了两个关键信息:
类型声明:Animal.Reptile——内部类的完整限定名需要以外部类名为前缀,这说明 Reptile 在命名空间上属于 Animal。
创建语法:animal.new Reptile()——必须先有一个外部类实例 animal,才能通过它 new 出内部类对象。这揭示了内部类的本质:每个 Reptile 对象都寄生在一个 Animal 对象上。
outerInstance.new InnerClass() 是 Java 中为数不多的"通过实例来 new"的语法,非常特殊。
第 29 行:创建静态嵌套类对象
java
Animal.Mammal mammal = new Animal.Mammal();
对比之下,静态嵌套类的创建与普通类几乎一样——new Animal.Mammal(),不需要任何 Animal 实例。这说明 Mammal 虽然嵌套在 Animal 中,但它是独立存在的,与 Animal 实例没有绑定关系。
核心对比总结
animal.new Reptile() new Animal.Mammal()
需要外部实例? ✅ 必须先有 animal ❌ 不需要
持有外部引用? ✅ 隐式持有 ❌ 不持有
比喻 器官不能脱离身体存在 工具可以独立使用
设计思想:什么时候用哪种?
非静态内部类(Reptile):当内部对象天然属于某个外部对象时。比如 Car.Engine——引擎不能脱离汽车存在。
静态嵌套类(Mammal):当嵌套只是为了逻辑分组/命名空间管理时。比如 Animal.Mammal——哺乳动物这个概念不依赖某个具体的 Animal 实例。
输出结果
code
I am a reptile.
I am a mammal.
方法体本身很简单,重点不在于输出什么,而在于两种对象是如何被创建出来的——这两行 new 语句本身就是整个文件的教学精华。

浙公网安备 33010602011771号