Scala 访问修饰符

  • 访问修饰符

    本章将指导您完成Scala访问修饰符。包,类或对象的成员可以使用访问修饰符标记为私有和受保护,并且如果我们不使用这两个关键字中的任何一个,则访问将被假定为公共。这些修饰符将对成员的访问限制在代码的某些区域。要使用访问修饰符,请将其关键字包含在包,类或对象的成员的定义中,这将在下一部分中看到。
  • 私有(private)成员

    私有成员仅在包含成员定义的类或对象内部可见。以下是解释私有成员的示例代码片段-
    
    class Outer {
       class Inner {
          private def f():Unit = { println("f") }
          
          class InnerMost {
             f() // OK
          }
       }
       (new Inner).f() // 错误: f 不能在类外部访问
    }
    
    在Scala中,访问权限(new Inner).f()是非法的,因为f在Inner中声明为private,并且访问不是从Inner类内部进行的。相比之下,对Innermost类的f的首次访问是可以的,因为该访问包含在Inner类的主体中。Java将允许两种访问,因为Java允许外部类访问其内部类的私有成员。
  • 受保护的(protected)成员

    受保护的成员只能从定义该成员的类的子类中访问。以下是用于解释受保护成员的示例代码片段-
    
    package p {
       class Super {
          protected def f():Unit={ println("f") }
       }
       
       class Sub extends Super {
          f()
       }
       
       class Other {
          (new Super).f() // 错误: f 不能从其他类访问
       }
    }
    
    可以在"Sub"类中访问f,因为f在'Super'类中声明protected,并且'Sub'类是Super的子类。相比之下,不允许访问“Other”类中的f,因为类“Othen”不继承自“Super”类。在Java中,由于 Other”类与“ Sub”类位于同一包中,因此仍将允许后者访问。
  • 公共(public)成员

    与私有成员和受保护成员不同,不需要为公共成员指定public关键字。公共成员没有明确的修饰语。这样的成员可以从任何地方访问。以下是解释公共成员的示例代码片段-
    
    class Outer {
       class Inner {
          def f():Unit = { println("f") }
          
          class InnerMost {
             f() // OK
          }
       }
       (new Inner).f() // OK because now f() is public
    }
    
  • 保护范围

    Scala中的访问修饰符可以通过限定符进行扩充。形式为private [X]或protected [X]的修饰符表示访问是X的私有或受保护的,其中X指定一些封闭的包,类或单例对象。考虑以下示例-
    
    package society {
       package professional {
          class Executive {
             private[professional] var workDetails = null
             private[society] var friends = null
             private[this] var secrets = null
    
             def help(another : Executive) :Unit = {
                println(another.workDetails)
                println(another.secrets) //ERROR
             }
          }
       }
    }
    
    注意 -上面示例中的以下几点-
    • 变量 workDetails 可以被封装在package professional包中的任何类访问。
    • 变量 friends 可以被封装在package society包中的任何类访问。
    • 变量 secret 只能在实例方法(this)中的隐式对象上访问。