9.Scala- 包和引入

第9章 包和引入

9.1 包/作用域

在 Java 和 Scala 中管理项目可以使用包结构,C 和 C# 使用命名空间。

对于 package,有如下几种形式:

1)形式体现:

package com.nick.impatient.people

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

}

 

等同于:

package com.nick.impatient
package.people

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

}

 

等同于:

package com.nick.impatient{ // com 和 com.nick 的成员在这里不可见
  package people{

    class Person {

      val name = "Nick"
      def play(message: String): Unit ={

      }
    }
  }
}

 

尖叫提示:位于文件顶部不带花括号的包声明在整个文件范围内有效。

/*
  1、包也可以向内部类那样嵌套,作用域原则:可以直接向上访问。即,子 package 中直接访问父 package 中的内容。(即:作用域)
  2、包对象可以持有函数和变量(可以直接在包里面定义函数和变量)
  3、引入语句可以引入包、类和对象(import scala)(import scala.collection.mutable.Map.add)
  4、源文件的目录和包之间并没有强制的关联关系(包不会体现成文件夹形式,Java会强制关联)
  5、可以在同一个 .scala 文件中,声明多个并列的 package
  6、包名可以相对也可以绝对,比如,访问 ArrayBuffer 的绝对路径是:
  _root_.scala.collection.mutable.ArrayBuffer
  相对路径可以写成:mutable.ArrayBuffer
 */

 

 

9.2 包对象

包可以包含类、对象和特质 trait,但是不能包含函数和变量的定义,这个是Java 虚拟机的限制。
把工具函数或者常量添加到包而不是某个 Utils 对象,这是更加合理的做法。包对象的出现正是
为了解决这个局限。每个包都可以由一个包对象。你需要在父包中定义它,且名称与子包一样。
package com.nick.impatient

package object people1{
  val defaultName = "Nick"
}

package people1{
  
  class people1 {
    var name = defaultName //从包对象拿到的常量
  }
}

 

 

 

 

 

9.3 包可见性

在 Java 中、没有被声明为 public、private 或 protected 的类成员在包含该类的包可见。在Scala 中,

你可以通过修饰符达到同样的效果。以下方法在它自己的包中可见:

package com.nick.impatient.people

class Person1 {

  private[people] def description = "名字:" + name
  
}

 

当然,也可以将可见度延展到上层包:
 

private[impatient] def description = "名字:" + name

 

 

 

 

9.4 引入

 

通过 import 进行包的引入,_ 类似于 java 中的 *

 

 

 

 

9.5 重命名和隐藏方法

1)通过包选取器选择单个类:
import java.awt.{Color, Font}
Color.RED
Font.BOLD

 

 
2)重命名:
如果你想要引入包中的几个成员,可以像这样使用选取器(selector),而且选取得同时,可以
重命名:
//重命名
import java.util.{HashMap => JavaHashMap, List}
import scala.collection.mutable._
new JavaHashMap[String, Int]
new HashMap[String, Int]

 

 这样一来,JavaHashMap 就是 java.util.HashMap,
而 HashMap 则对应 scala.collection.mutable.HashMap。
 
2)隐藏:
选取其 HashMap =>_ 将隐藏某个成员而不是重命名它。这仅在你需要引入其他成员时用:
import java.util.{HashMap => _, _} 
import scala.collection.mutable._

 现在,HashMap 很明确得指向了 scala.collection.mutable.HashMap,因为 java.util.HashMap 被隐藏起来了。

 

 

 

posted @ 2019-07-03 04:08  LXL_1  阅读(281)  评论(0编辑  收藏  举报