scala学习 包和引入

scala学习 包和引入

1.打包方法

1.在文件顶部放置一个Package子句

package bobsrockets.navigation
class Navigator

2.在Package子句后加上一段花括号包起来的代码块 -- 打包

package bobsrockets.navigation{
	class Navigator
}

2.嵌套包

Scala提供了一种名为_root_的包,这个包不会与任何用户编写的包冲突。每个你能编写的顶层包都被是做_root_的成员。

3.引入

Scala引入灵活性:

1.出现在任何位置

2.引用对象(不论单例或者常规),而不只是包

3.让你重命名并隐藏某些被引入的成员

引入选择器:

一个简单的名称x,将x包含在引入的名称集里。

一个重命名子句x => y,让名为x的成员以y的名称可见

一个隐藏子句x=>__,从引入的名称集里排除掉x

一个捕获所有的__。引入除了之前子句中提到的成员外的所有成员。如果需要捕获所有子句,它必须出现在引入选择器列表的末尾。

隐式引入:

//后引入的会遮挡前面的!
import java.lang._	//java.lang包的全部内容 -- 标准Java类
import scala._		//scala包的全标准类库 -- Scala标准类库
import Predef._		//Predef对象的全部内容 -- 包含许多类型、方法和隐式转换的定义

4.Scala修饰符

私有成员 private

标为private的成员只在包含该定义的类或对象内部可见

class Outer{
 class Inner{
     private def f() = { println("f")}
     class InnerMost{
         f() // OK
     }
 }
 (new Inner).f() //Wrong
}

受保护成员protected

protected成员只能从定义该成员的子类访问

package p {
	class Super{
 	protected def f() = { println("f")}
	} 
 
 class Sub extends Super{
     f()
 }
 
 class Other{
     (new Super).f()	//Wrong
 }
}

公共成员

任何没有被标为private或protected成员都是公共的,公共成员可以从任何位置访问到。

5.保护范围

形如private[X]protected[X]的修饰符含义是对此成员的访问限制“上至”X都是私有的或者受保护的,其中X表示某个包含该定义的包、类或者单例对象 。

package bobsrockets
package navigation{
    private[bobsrockets] class Navigator{
        protected[navigation] def useStartChart() = {}
        class LegOfJourney{
            private[Navigator] val distance = 100
        }
        private[this] var speed = 200
    }
}
package launch{
    import navigation._
    object Vehicle{
        private[launch] val guide =   new Navigator
    }
}
无访问修饰符 公共访问
private[bobsrockets] 外围包内可见
private[navigation] 与Java中包可见性相同
private[Navigator] 与Java中的private相同
private[LegOfJourney] 与Scala中的private相同
private[this] 仅在当前对象内访问(对象私有)

6.可见性与伴生对象

Scala的访问规则在private和protected的处理上给伴生对象和类保留了特权。一个类会将它的所有访问权限跟他的伴生对象共享。简而言之,一个对象可以访问它的伴生类的所有私有成员,一个类可以访问它的伴生对象中的所有私有成员。(与Java修饰符相似,除protected static)

7.包对象

Scala提供包对象作为整个包中方便共享使用的容器。每个包都允许有一个包对象,在包对象中的任何定义都被认为是包自身的成员。

包对象会被编译成名为package.class的类文件,该文件位于它增强的包的对应目录下。按照惯例,其代码通过放在package.scala文件中。

//位于bobsdelights/package.scala
package object bobsdelights{
    def showFruit(fruit:Fruit) = {
        import fruit._
        println(name + "s are " + color)
    }
}

//位于PrintMenu.scala
package printmenu
import bobsdelights.Fruits
import bobsdelights.showFruits
object PrintMenu{
    def main(args:Array[String]) = {
        for(fruit <- Fruits.menu){
            showFruit(fruit)
        }
    }
}
posted @ 2020-04-29 22:14  ganshuoos  阅读(191)  评论(0编辑  收藏  举报