scala访问修饰符

一、访问修饰符 private,protected,public

Scala 访问修饰符有:private,protected,public;如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public

1、私有(Private)成员

private 关键字修饰,带有此标记的成员仅在包含了成员定义的class、object或者package内部可见,同样的规则还适用内部类。

  • 类的例子
package p1{
    class A{
      private val class_member = "Alex"
      //类内部访问
      class Inner{
        println(class_member) // 正确
      }
    }
    //类外部访问
    class Outer{
      println((new A).class_member) //错误
    }
}
  • 包的例子
package p1{
  package p2{
    private class package_member
    //p2包内部
    class inner{
      new package_member //正确
    }
  }
  //p2包外部
  class outer{
    new p2.package_member //错误
  }
}
2、保护(Protected)成员

在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的class、object或者package的内部和class的子类中被访问

  • 类的例子
// protected
package p1{
  class Super{
    protected val class_member = "Alex"
    //内部访问
    class Inner{
      println(class_member ) // 正确
    }
  }
  //外部访问---子类
  class Sub extends Super{
    println(class_member ) // 正确
  }
  //外部访问---非子类
  class Other{
    println((new Super).class_member ) //错误
  }
}
  • 包的例子
package p1{
  package p2{
    protected class package_member
    //p2包内部
    class inner{
      new package_member //正确
    }
  }
  //p2包外部
  class outer{
    new p2.package_member //错误
  }
}
3、公共(Public)成员

Scala 中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。

  • 类的例子
//public
package p1 {
    class A {
      val class_member = "Alex"
      //内部访问
      class Inner {
        println(class_member ) // 正确
      }
    }
    //外部访问
    class Other{
      println((new A).class_member ) //正确
    }
}
  • 包的例子
package p1{
  package p2{
    class package_member
    //p2包内部
    class inner{
      new package_member //正确
    }
  }
  //p2包外部
  class outer{
    new p2.package_member //正确
  }
}
//p1包外部
package p3{
  class outer_p1{
    new p1.p2.package_member //正确
  }
}

二、作用域保护 private[x],protected[x]

这里的x指代某个class、object或package,它的意思是:在不加限定词的基础上,把访问权限扩大到X的内部。

package A {
  package B {
    private[A] class JustA
  }
 
  class MakeA {
    val a = new B.JustA  // OK
  }
}
 
package C {
  class Error {
    val a = new A.B.JustA  // error
  }
}

三、作用域保护 private[this],protected[this]

在这里插入图片描述
private[this]private更严格,除了只能由内部代码访问,且修饰的成员不能被子类访问(如subMyInt2子类mi2也是错误的,不能被访问)之外,还必须是调用该方法的对象才能访问。如上图中MyInt2中的m.mi2这句是错误的,因为它是由该函数的入参,也即传入的外部对象访问的,虽然它仍是MyInt2类型的对象,但是就是不能访问。

protected[this]private[this]的相比,在能被内部代码访问的基础上,mi2变量也可以被子类访问,如subMyInt3子类mi2这句是对的;但是仍然不能被外部对象访问,如MyInt3m.mi2仍然是错的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耐心的小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值