① 包(package)
Why
包的三个主要作用是
区分类: 区分相同名字的类,防止命名冲突管理类:通过包来,管理类.控制访问
How
Java中的包
java中的源文件保存在对应的包路径,本质上就是一个包对应一个文件夹.
java中的字节码文件也保存在对应的包路径.
Scala中的包
Scala中的包更加强大.不仅有如上三个特点,Scala中的包还能对类的功能进行拓展
Scala中包的命名规则
只能包含数字、字母、下划线、小圆点.,但不能用数字开头, 也不要使用关键字
命名规范
一般是小写字母+小圆点一般是, com.公司名.项目名.业务模块名
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.*、scala、Predefscala还有两种不同于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 {
}
}
}编译后可以对应查看到如下内容
package com.sweetcs{ package scala{ class User {
} class Person{ val name = "lisi"
def play(message: String): Unit ={
}
} object Student {
}
} package scala2 { class User {
}
}
}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
尽管我们可以在包中写class、trait、object但是没法写函数和方法或者变量.因为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()
}
}
}
}
作者:sixleaves
链接:https://www.jianshu.com/p/5e324867f9a2
共同学习,写下你的评论
评论加载中...
作者其他优质文章



