① 包(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
、Predef
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 { } } }
编译后可以对应查看到如下内容
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章