继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕姐8265434
关注TA
已关注
手记 1309
粉丝 222
获赞 1065

① 包(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


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP