scala入门 包和引入

  1. 支持嵌套,下层可以访问上层作用域中的名称
  2. 可串联
  3. 顶部标记
  4. 包对象
  5. 包可见性
  6. 包在任何地方都可以引入,作用域至该语句所在块的末尾
  7. 重命名引入成员(xx => yy)
  8. 隐藏方法(xx =>_)
  9. 自动引入(java.lang._   scala._   Predef._)

 

支持嵌套,下层可以访问上层作用域中的名称

包可以嵌套,一个包可以定义在多个文件当中,也不需要将源文件和包之间对应起来;

package com.benlai{
     class Fruit{
        def sell : Unit= {
            println("all fruit sell out")
       }
      }      
        
    package life{
        class Apple {
           def currentState : Unit = {
                 val f = new Fruit //不需要引入Fruit的包
                 f.sell
           }  
      }        
    }
}            

 

可串联

串联式包名,上级包的成员不可见

package com{
     class Fruit{
        def sell : Unit= {
            println("all fruit sell out")
       }
      }      
}   

  

package com.benlai{
     //此处不可见com包成员
      class Apple {
          def currentState : Unit = {
                 import com.Fruit
                 val f = new Fruit //不可见com成员,需要引入Fruit的包
                 f.sell
          }  
     }

     class Banana {
          .....
     }        
    
}      

  

顶部标记

代码位于同一个包内,在文件顶部标记包;

package com.benlai
package life
   class Apple {
          def currentState : Unit = {
               println("this is an apple")
          }  
     }

     class Banana {
         def currentState : Unit = {
                println("this is a banana")
          } 
     }        

文件的内容在com.benlai.life包中,com.benlai包中的内容对com.benlai.life均可见;但com包中成员对com.benlai.life不可见

 

包对象

类似于Java中将一个Util类定义在一个静态类中一样,包对象就是将一些常用的方法写在一个package object中,需要的时候,引入这个包;

package com.benlai.life

package object DateUtil {
      val info = "current date ...."
      def display():Unit = {
            println("info is " + info)
       }
}
//在 Fruit对象中调用DateUtil的display方法
class
Fruit { def currentInfo():Unit = { import com.benlai.life.DateUtil DateUtil.display() } }

 

包的可见性

scala中类内的成员默认是公有访问权限的,如果想要把scala的成员设定为私有类型的需添加 private[package-name];如 private[this] val name:String = "jack"

package com.benlai

    class Person{
       val name:String = "jack" //公有访问权限
       private[this] val age:Int = 21 //类内成员可访问
       private[com] val address:String = "shanghai" //com、com.benlai包下成员可访问
    }

 

包在任何地方都可以引入,作用域至该语句所在块的末尾

{
    import package com.benlai.Person  //作用域在这个"块"中有效,这个"块"外无效
}

  

重命名引入成员(xx => yy)和隐藏方法

//重命名引入成员
import java.util.{HashMap=>JHashMap}

//引入java.util包下的所有成员除去HashMap外;
improt java.util.{HashMap=>_,_}

 

自动引入

scala会自动引入java.lang._、scala._、Predef._这些包

 

posted @ 2016-01-08 12:50  双子流云  阅读(369)  评论(0编辑  收藏  举报