为了账号安全,请及时绑定邮箱和手机立即绑定

Scala(四)-②-面相对象中级-包-包对象-访问控制权限

标签:
Premiere

① 包(package)

Why

包的三个主要作用是

  • 区分类: 区分相同名字的,防止命名冲突

  • 管理类:通过包来,管理类.

  • 控制访问

How

Java中的包
  • java中的源文件保存在对应的包路径,本质上就是一个包对应一个文件夹.

  • java中的字节码文件也保存在对应的包路径.


Scala中的包
  • Scala中的包更加强大.不仅有如上三个特点,Scala中的包还能对类的功能进行拓展

Scala中包的命名规则
  • 只能包含数字、字母、下划线、小圆点.,但不能用数字开头, 也不要使用关键字

命名规范

一般是小写字母+小圆点一般是, com.公司名.项目名.业务模块名

webp

object TestTiger {  def main(args: Array[String]): Unit = {    val tiger1 = new com.sweetcs.bigdata.scala.day04.chapter07.packagedemo.scala.xh.Tiger
    val tiger2 = new com.sweetcs.bigdata.scala.day04.chapter07.packagedemo.scala.xm.Tiger

    println(tiger1 +"\t"+ tiger2)

  }
}

Details

  • Scala中源文件可以和包目录结构不对应.但是编译后的字节码文件必定和包目录结构对应.(这是编译期特性)

graph TD
C(目录结构)
C --> |无需对应| D(源文件)
C --> |和目录结构对应| E(字节码文件)
  • scala会自动引入的三个包.java.lang.*scalaPredef

  • scala还有两种不同于java的两种打包方式, 主要介绍最后一种.(scala支持在一个文件中,同时创建多个包,以及trait,object)

第二种

package com.sweetcspackage scalaclass Person{  val name = "lisi"
  def play(message: String): Unit ={
  }
}
代码说明

第三种(最常用,方便在一个文件中的不同包中创建class和trait)

/**
  * @author sweetcs
  */object AdvincePackageDemo {  def main(args: Array[String]): Unit = {

  }
}package com.sweetcs{  package scala{    class Person{      val name = "lisi"
      def play(message: String): Unit ={
      }
    }    object Student {

    }

  }
}

编译后可以对应查看到如下内容


webp

package com.sweetcs{  package scala{    class User {

    }    class Person{      val name = "lisi"
      def play(message: String): Unit ={
      }
    }    object Student {

    }
  }  package scala2 {    class User {

    }
  }
}

webp

image.png

  • 作用域1: Scala中的子包可以自己使用父包的内容,当Scala子包内容和父包冲突,默认使用最近原则.如果希望指定使用某个类,则带上包名即可.

package com.sweetcs{  package scala{    class User {

    }    class Person{      val name = "lisi"
      def play(message: String): Unit ={
      }
    }    object Student {

    }
  }  package scala2 {    class User {

    }    object TestSubPackage {      def main(args: Array[String]): Unit = {        val user = new User // 不指定权限定类名使用最近原则
        println(user)        val user2 = new com.sweetcs.scala.User  // 指定某个类要用权限定类名
        println(user2)

      }
    }
  }
}
  • 作用域2: 父包要访问子包的内容需要使用import关键字导入子包的内容

package com.sweetcs{  package scala{    class User {      def sayHello(): Unit = {        import com.sweetcs.scala.scala12.UserInScala12
        val userInScala= new UserInScala12
        userInScala.sayHello()
      }

    }    package scala12 {      class UserInScala12 {        def sayHello(): Unit = {

        }
      }

    }
  }
}
  • Scala可以使用绝对路径引入包(当包名冲突时候可以使用这个方法,一般很少能用到)


②-包对象

Why

尽管我们可以在包中写classtraitobject但是没法写函数方法或者变量.因为JVM的限制,无法这样做.于是scala提出了包对象技术就是为了解决这个缺陷,我们可以将函数方法或者变量写在包对象中,相当于对包做了扩展,这样以后我们可以在包里调用这些写函数方法或者变量.

How

语法
package object 要扩展的包名 {
   
}
Demo
package com.sweetcs {  package object packageObject {    def sayHello(): Unit = {
      println("hello packageobject")
    }

  }  package packageObject {    class User {      def callPackageObject(): Unit = {
        sayHello()
      }
    }    object Test {      def main(args: Array[String]): Unit = {        val user = new User
        user.callPackageObject()
      }
    }

  }
}

webp



作者:sixleaves
链接:https://www.jianshu.com/p/5e324867f9a2


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消