Scala内部类深度解析:封装与访问控制的艺术

87 阅读2分钟

在Scala面向对象编程中,内部类是一种强大的封装机制,它允许在一个类的内部定义另一个类。这种设计不仅使代码组织更加严谨,还能有效避免命名冲突。本文将深入探讨Scala内部类的特性和实际应用。

一、内部类基础概念

什么是内部类?

内部类是定义在另一个类内部的类,它可以访问外部类的所有成员,包括私有成员。这种设计模式在需要紧密耦合的类关系中非常有用。

Snipaste_2025-11-13_20-25-09.png

二、基础内部类实现

简单的内部类定义

package level02

object base2801 {

  // 外部类
  class Car() {
    var wheel: Int = 3

    def run(): Unit = {
      println("run....")
    }

    // 内部类
    class Engin() {
      val power: Int = 12
    }
  }

  def main(args: Array[String]): Unit = {
    val c1 = new Car();

    var eng = new c1.Engin()

    println(eng.power)
  }
}

运行结果

1.png

代码解析

  • Car 是外部类,包含一个基本属性和方法
  • Engin 是内部类,定义在 Car 类内部
  • 内部类的实例化语法:new 外部类实例.内部类()
  • 内部类可以独立拥有自己的属性和方法

三、内部类访问外部类成员

内部类访问外部类私有成员

package level02

object base2802 {

  // 外部类
  class Car() {
    var wheel: Int = 3

    // 私有成员
    private var speed: Int = 0

    def run(): Unit = {
      println(s"速度为:${speed}, run....")
    }

    // 内部类
    class Engin() {
      def acc(increment: Int): Unit = {
        speed += increment  // 内部类可以访问外部类的私有成员
      }
    }

    class AutoPark() {}
  }

  def main(args: Array[String]): Unit = {
    val c1 = new Car();
    //    c1.speed  // 私有成员不能直接访问
    c1.run()
    val en = new c1.Engin()
    en.acc(10)  // 通过内部类方法修改外部类私有成员
    c1.run()
  }
}

运行结果

2.png

代码解析

  • 内部类 Engin 可以访问外部类 Car 的私有属性 speed
  • 外部类的私有成员对外部不可见,但对其内部类可见
  • 通过内部类提供的方法来间接操作外部类的私有状态
  • 这种设计实现了良好的封装性