java day1

java 三大特性/: 封装 继承 多态
java 中的嵌套类和 非静态嵌套类
image
在静态内部访问外层类的成员 这样是不可行的

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 语句本身就是整个文件的教学精华。

posted @ 2026-06-25 00:30  为什么---why  阅读(1)  评论(1)    收藏  举报