• Scala 面向对象(三):package 包 (二)


    1 包对象

    基本介绍:包可以包含类、对象和特质trait,但不能包含函数/方法或变量的定义。这是Java虚拟机的局限。为了弥补这一点不足,scala提供了包对象的概念来解决这个问题。

    复制代码; "复制代码")

    package com.atguigu { //每个包都可以有一个包对象。你需要在父包(com.atguigu)中定义它,且名称与子包一样。
    package object scala {

    var name = "jack" def sayOk(): Unit = {
      println("package object sayOk!")
    }

    } package scala { class Test {

      def test() : Unit ={ //这里的name就是包对象scala中声明的name

    println(name)

        sayOk()//这个sayOk 就是包对象scala中声明的sayOk

    }

    }
    object TestObj {
      def main(args: Array[String]): Unit = {
        val t = new Test()
        t.test() //因为TestObje和scala这个包对象在同一包,因此也可以使用
        println("name=" + name)
      }}}}
    

    复制代码; "复制代码")

    2 包对象的底层实现机制分析(重点)

    当创建包对象后,在该包下生成 public final class package 和 public final class package$

    通过 package$ 的一个静态实例完成对包对象中的属性和方法的调用。

    包对象的注意事项

    1)每个包都可以有一个包对象。你需要在父包中定义它。如图:

     2) 包对象名称需要和包名一致,一般用来对包的功能补充

    3 Scala中包的可见性介绍:

    在Java中,访问权限分为: public,private,protected和默认。在Scala中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。

    复制代码; "复制代码")

    object Testvisit {
    def main(args: Array[String]): Unit = {

    val  c = new Clerk()
    c.showInfo()
    Clerk.test(c)

    }} class Clerk {
    var name : String = "jack"
    private var sal : Double = 9999.9 def showInfo(): Unit = {

    println(" name " + name + " sal= " + sal)

    }}
    object Clerk{
    def test(c : Clerk): Unit = { //这里体现出在伴生对象中,可以访问c.sal

    println("test() name=" + c.name + " sal= " + c.sal)

    }}

    复制代码; "复制代码")

    Scala中包的可见性和访问修饰符的使用

    1)当属性访问权限为默认时,从底层看属性是private的,但是因为提供了xxx_$eq()[类似setter]/xxx()[类似getter] 方法,因此从使用效果看是任何地方都可以访问)

    2)当方法访问权限为默认时,默认为public访问权限

    3)private为私有权限,只在类的内部伴生对象中可用 

    4)protected为受保护权限,scala中受保护权限比Java中更严格,只能子类访问,同包无法访问 (编译器)

    5)在scala中没有public关键字,即不能用public显式的修饰属性和方法。

    6)包访问权限(表示属性有了限制。同时包也有了限制),这点和Java不一样,体现出Scala包使用的灵活性。

    复制代码; "复制代码")

    package com.atguigu.scala class Person { private[scala] val pname="hello" // 增加包访问权限后,1.private同时起作用。不仅同类可以使用 2. 同时com.atguigu.scala中包下其他类也可以使用
    }
    当然,也可以将可见度延展到上层包 private[atguigu] val description="zhangsan" 说明:private也可以变化,比如protected[atguigu], 非常的灵活。

  • 相关阅读:
    BZOJ 2565 最长双回文串 (Manacher)
    BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
    BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
    BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)
    BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
    luogu P5289 [十二省联考2019]皮配
    luogu P5285 [十二省联考2019]骗分过样例
    luogu P5294 [HNOI2019]序列
    luogu P5292 [HNOI2019]校园旅行
    luogu P5284 [十二省联考2019]字符串问题
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309037.html
Copyright © 2020-2023  润新知