Chapter07 包和引入

1. 包 package

  • 源文件目錄和包之間並沒有強制的關聯關係。比如下面Manager.scala不一定要在./com/horstmann/impatient目錄中。
    // Manager.scala
    package com {
      package horstmann {
        package impatient {
          class Manager(name: String) {
            def description = "A manager with name " + name
          }      
        }
      }
    }
  • 同一個文件中可以給多個包貢獻內容,比如Employee.scala文件可以包含:
    package com {
      package horstmann {
        package impatient {
          class Employee(id: Int) {
            def description = "An employee with id " + id
          }      
        }
      }
    }

    package org {
      package bigjava {
        class Counter {
          private var value = 0 
          def increment() { value += 1 } 
          def description = "A counter with value " + value
        }
      }
    }

2. 作用域規則

  • Scala的包作用域支持嵌套,包路徑都是相對的。

  • java.langscalaPredef總是被引入,這種引入被稱爲隱式引入


3. 串聯式包語句

  • 包語句可以包含一個“串”或者說是“路徑區段”
    package com.horstmann.impatient {
      package people {
        class Person(val name: String) {
          val friends = new collection.mutable.ArrayBuffer[Person]
          // comcom.hosrstmann的成員這裏不可見
          def description = name + " with friends " + 
            friends.map(_.name).mkString(", ")
        }
      }
    }

4. 文件頂部標記法

  • 可以在文件頂部使用package語句,不帶花括號。
    package com.horstmann.impatient

    class Car

5. 包對象

  • 每個包都可以有一個包對象,要在父包中定義它,且名稱與子包一樣。
    package com.horstmann.impatient

    package object people {
      val defaultName = "John Q. Public"
    }

    package people {
      class Person {
        var name = defaultName // A constant from the package
        def description = "A person with name " + name
      }
    }

    // Run as scala com.horstmann.impatient.Main

    object Main extends App {
      val john = new com.horstmann.impatient.people.Person
      println(john.description)
    }

6. 包可見性

  • 沒有被public、private或protected聲明的類成員,在包含該類的包中可見,可以使用private[包名]達到同樣效果。
    package com.horstmann.impatient

    package object people {
      val defaultName = "John Q. Public"
    }

    package people {
      class Person {
        var name = defaultName // A constant from the package
        private[impatient] def description = "A person with name " + name
      }
    }

7. 引入import

  • 引入讓你可以使用更短的名稱

    import java.awt.Color
    
  • 引入包的全部成員,也可以引入類或對象的全部成員。

    import java.awt._
    
  • 任何地方都可以出現import引入,作用到該塊的結尾。


8. 重命名和隱藏方法

  • 只項引入幾個成員,使用選擇器

    import java.awt.{Color, Font}
    
  • 重命名選到的成員。

    import java.util.{HashMap => JavaHashMap}
    
  • HashMap => _ 是用來隱藏某個成員。


【待續】

發佈了84 篇原創文章 · 獲贊 324 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章