scala包和引入

scala包和引入


1.scala包

scala的包和Java中的包的目的是相同的:管理大型程序中的名称。
要增加条目到包中,可以将其包含在包语句里面,如:
package org{
    package cai{
       package test{
           class MyClass
            // ......
       }
   }
}


MyClass就可以在任何地方以org.cai.test.MyClass被访问。

**源文件的目录和包之间并没有强制的关联关系,并不需要将MyClass.scala放在org/cai/test目录下面。

**可以在一个.scala文件中定义多个包的内容,如:
//包org.cai.test
package org{
    package cai{
       package test{
           class MyClass1
            // ......
       }
   }
}

//包org.yong.test
package org{
    package yong{
       package test{
           class MyClass2
             //......
       }
   }
}


2.包的作用域

scala的包和其它作用域一样支持嵌套。可以在程序中访问上层作用域中的名称。
有时候包的引入会发生冲突,这个时候我们可以通过绝对包名进行引入:
绝对包名以“_root_”开始。
val test = new _root_.scala.collection.mutable.ArrayBuffer[claaName]


3.串联式包语句

包语句可以包含一个串(路径区段),这样的包语法限定了可见的成员。
package org.cai.test{
    //org和org.cai的成员在这里不可见
    package pack1{
       class MyClass
        //......
   }
}


4.文件顶部标记法

和Java类似,在源文件顶部声明包。
如:
package org.cai.test
package yong
class MyClass
//......


//这等同于
package org{
    package cai{
       package test{
           package yong{
              class MyClass1
               // ......
           }
       }
   }
}

注意:在上例子中,文件所有的内容都属于org.cai.test.yong包,但是org.cai.test包的内容是可见的,可以被直接引用。

5.包对象

包可以包含类、对象和特质,但是不能包含函数或变量的定义。这是Java虚拟机的局限。

每一个包都可以有一个包对象,需要在父包中定义它,且名称与子包一样。
例如:
package org.cai.test

package object people{
  val defaultName = "cy"
}

package people{
  class Person{
    var name = defaultName //从包对象拿到常量
  }
  //......
}

defaultName不需要加限定词,因为它位于同一个包内。在其它地方,这个常量可以用org.cai.test.people.defaultName来访问到。包对象会被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。

6.包可见性

在Java中,没有被声明为private、protected和public的类成员在包含该类的包中可见,在scala中,可以通过修饰符达到同样的效果。
//声明方法在自己的包中可见
package org.cai.test
class Person{
    private[test] def func = ""
    //......

}


//将方法的可见度提升到上一层
package org.cai.test
class Person{
    private[cai] def func = ""
    //......
}


7.包的引入


scala引入包和java一样。
import org.cai._  "_"和Java中的"*"通配符一样,表示引入对应路径下的所有类或对象的所有成员。

在scala中,import语句可以出现在任何地方,并不是仅仅限于文件顶部。

import进来的成员的作用效果延伸到包含该语句的块末尾。



8.包重命名和隐藏方法

(1)包重命名
如果要引入包中的多个成员,可以使用选取器,如下:
import java.awt.{Color,Font}

可以重命名选取的包成员:
import java.util.{HashMap=>JavaHashMap}

这样一来,JavaHashMap就是java.util.HashMap

(2)隐藏方法
“成员 => _”将隐藏某一个成员而不是重命名,这仅仅在需要引入其它同

名成员时候有用,如:

import java.util.{HashMap=>_,_}
import scala.collection.mutable._
现在,HashMap无二义性地指向scala.collection.mutable.HashMap,因为java.util.HashMap被隐藏了。

9.隐式引入

每一个scala程序都隐式地引入了如下代码:
import java.lang._
import scala._
import Predef._

和Java程序一样,lang包总是被引入,接下来引入scala包,这个引入会覆盖之前的引入,最后,Predef包被引入,这个包中包含了很多有用的函数。




>>>>>__以上内容摘自:《快学Scala》  [美]Cay S. Horstmann著   电子工业出版社__<<<<<





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值