0%

scala包

scala包

scala也像java一样有包这个概念,但是功能更加强大
Scala包的三大作用(和Java一样)

  • 区分相同名字的类
  • 当类很多时,可以很好地管理类
  • 控制访问范围

包定义方式

scala中包名和源码所在系统文件目录结构可以不一致,这点与java不一样,但是编译之后的字节码路径会和包名保持一致
这也就意味着scala中一个源文件可以包含多个包
且scala有三种包定义方式

  • 第一种方式与java一致,使用package声明所在包

    1
    package com.zhanghe.study.study_scala.oop
  • 第二种方式,可以将包拆分成多行

    1
    2
    package com.zhanghe.study.study_scala
    package oop
  • 第三种方式,同一源文件中包含多个包的class、object

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.zhanghe.study.study_scala.oop { // 包com.zhanghe.study.study_scala.oop,块内可以声明package,class,object
    package model { // 子包,com.zhanghe.study.study_scala.oop.model

    class Dog {
    var name: String = _
    }

    }

    package service { // 子包,com.zhanghe.study.study_scala.oop.service

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

    }
    }

    }

    package utils {
    object MathUtils {
    def percentOf(value: Double,rate: Double) = value * rate / 100
    }

    package langs {
    class CalculationRatioUtils{
    def giveRaise(salary: Double,rate: Double){
    // MathUtils在父包中定义,所有父包内的内容都在作用域内,可以直接使用
    MathUtils.percentOf(salary,rate)
    }
    }
    }
    }

    }

    package com.zhanghe.study.study_scala.testop { // 包com.zhanghe.study.study_scala.testop,块内可以声明package,class,object

    class Cow {
    var age: Int = _
    }

    }

在使用第三种方式声明包时,由于作用域是以{}来决定的,所以子包可以直接使用父包的class,而无需引入,如果子包和父包中有相同的class,则采用就近引入(由于在编译成java时会自动的引入import 父包.*的方式)

包对象

在使用第三种方式声明package的时候,在package块内只能声明package、class、object、trait等,却不可以声明变量和方法,这是java中JVM的限制,scala为了解决这个问题,引入了包对象

每一个包都可以有一个包对象

1
2
3
4
5
6
7
8
9
10
11
package object people{
// 使用包对象来声明常量
val defaultName = "人"
}

package people{
class Person {
// 直接从包对象中取常量
var name = defaultName
}
}

注意包对象的名称必须与包名称一致,用来对包的功能的补充

包引入

scala中的包引入基本操作与java相似,但是比java更强大

  • 在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部,import语句的作用一直延伸到包含该语句的块末尾

    1
    2
    3
    // 引入某个确定的类
    import scala.beans.BeanProperty
    @BeanProperty var weight:Double = _
  • Java中如果想要导入包中所有的类,可以通过通配符*,Scala中可以使用 _来作为通配符

    1
    2
    3
    // 引入整个包下的类及其子包
    import scala.io._
    StdIn.readInt()
  • 如果不想要某个包中全部的类,而是其中的几个类,可以采用选取器

    1
    2
    3
    import scala.math.{BigDecimal,BigInt}
    var dec:BigDecimal = BigDecimal.double2bigDecimal(100.0)
    var bint:BigInt = BigInt.int2bigInt(200)
  • 如果引入的多个包中含有相同的类,那么可以将冲突的类进行重命名进行区分

    1
    2
    3
    //可以对引入的类进行重命名  将java.util.HashMap重命名为JavaHashMap
    import java.util.{HashMap=>JavaHashMap,_}
    var map = new JavaHashMap[String,String]()
  • 如果某个冲突的类根本就不会用到,那么这个类可以直接隐藏掉

    1
    2
    // 排除掉HashMap类,引入该包下其他的类
    import scala.collection.mutable.{HashMap=>_,_}

scala会自动引入java.lang包,scala包以及Predef包

欢迎关注我的其它发布渠道