第十一讲 包和引入

2018-04-05  本文已影响0人  农民工进城

此章是有关包(package)和引入(import)的讲解,相对来说比较简单,所以就不大篇幅的来赘述。

11.1 包(package)

scala中的包的概念和java目的是一样的。
但也有不同之处:

11.1.1 包定义

例子如下:

package com {
  package horstmann {
    package impatient {
      class Employee{
        var salary:Double=1;
        var empNo:Int=0;
      }
    }
  }
}

或和java一样的方式,如下

package com.horstmann.impatient {
  package people {
    class Person{
    }
  }
}

package com.horstmann.impatient
package people
class Person{
  
}
11.1.2 作用域规则

在Scala中,包的作用域比起java来更加前后一致。Scala的包和其他作用域一样地支持嵌套,你可以访问上层作用域中的名称。例如:

package com.horstmann.impatient
package people
class Person{
}

注意Utils.percentOf修饰符。Utils类定义于父包,所有父包中的内容都在作用域内,因此没必要使用com.horstmann.Utils.precentOf

11.1.3 包对象

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

package com.horstmann.impatient

package object people {
  val defaultName = "John Q. Public"
}
package people {
  class Person {
    var name = defaultName // 从包对象拿到的常置
  }
  …….
}
11.1.4 包可见性

在Java中,没有被声明为public、private或protected的类成员在包含该类的包中可见。在Scala中,你可以通过修饰符达到同样的效果。以下方法在它自己的包中可见:

package com.horstmann.impatient.people
class Person {
  var name:String="";
  private[people] def description = "A person with name " + name
  //……
}

还可以将可见度延展到上层包:

private[impatient] def description="A person with name "+name

11.2 包的引入(import)

11.2.1 显示引入

scala包的引入和java包的引入是一样的,都是用 import 关键字。
和java不同的是:

class Manager {
  import scala.collection.mutable._
  val subordinates = new ArrayBuffer[String]
}
11.2.2 隐式引入

和Java程序一样,java.lang总是被引入。scala包也被引入一些包。
每个Scala程序都隐式地以如下代码开始:

import java.lang._
import scala.
import Predef._

由于scala包默认被引入,对于那些以scala开头的包,你完全不需要写全这个前缀。例如:

collection.mutable.HashMap

上述代码和以下写法效果是一样的:

scala.collection.mutable.HashMap
上一篇 下一篇

猜你喜欢

热点阅读