Chapter07 包和引入

本文深入探讨Scala中的包系统,包括包的作用域、串联式包语句、文件顶部标记法、包对象、包可见性以及引入import等核心概念。

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 => _ 是用来隐藏某个成员。


【待续】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值