109姜骡、Scala編程進(jìn)階之package與import實戰(zhàn)詳解

package的概念

因為要對多個同名的類進(jìn)行命名空間的管理冗美,避免同名類發(fā)生沖突
比如說,scala.collection.mutable.Map和scala.collection.immutable.Map

package的定義

第一種方式: 多層級package定義(比較差的做法状答,一般不這么干)

package com {
    package zj {
        package scala {
            class Test {}
        }
    }
}

第二種方式: 串聯(lián)式package定義(也不怎么樣冷守,一般也不這么干)

package com.zj.scala {
    package service {
        class Test {}
    }
}

第三種方式: 文件頂部package定義

package com.zj.scala.service

class Test {

}

第四種方式: IDE自動生成包

package特性

特性一: 同一個包定義,可以在不同的scala源文件中的; 一個scala源文件內(nèi)惊科,可以包含兩個包
Test1.scala

package com {
    package zj {
        package scala {
            class Test1
        }
    }
}

Test2.scala

package com {
    package zj {
        package scala {
            class Test2
        }
    }
}

Test3.scala

package com {
    package zj {
        package scala1 {
            class Test
        }
    }
}

package com {
    package zj {
        package scala2 {
            class Test
        }
    }
}

特性二: 子包中的類拍摇,可以訪問父包中的類

Test.scala

package com {
    package zj {
        package scala {
            object Utils {
                def isNotEmpty(str: String): Boolean = str != null && str != ""
            }
            
            class Test
        
            package service {
                class MyService {
                    def sayHello(name: String) {
                        if(Utils.isNotEmpty(name)) {
                            println("Hello, " + name)
                        } else {
                            println("Who are you?")  
                        }
                    }
                }
            }
        }
    }
}

object MainClass {
  def main(args: Array[String]): Unit = {
    val service = new com.zj.scala.service.MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

特性三: 相對包名與絕對包名

package com {
    package zj {
        package scala {
            object Utils {
                def isNotEmpty(str: String): Boolean = str != null && str != ""
            }
            
            class Test
            
            package collection {}
            
            package service {
                class MyService {
                    // 這會報錯,默認(rèn)使用相對報名馆截,從com.zj.scala.collection包中充活,尋找mutable包下的ArrayBuffer類
                    // 但是找不到,所以會報錯
                    // val names = new scala.collection.mutable.ArrayBuffer[String]
                    
                    // 正確的做法是使用_root_蜡娶,引用絕對包名
                    val names = new _root_.scala.collection.mutable.ArrayBuffer[String]
                    
                    def sayHello(name: String) {
                        if(Utils.isNotEmpty(name)) {
                            println("Hello, " + name)
                        } else {
                            println("Who are you?")  
                        }
                    }
                }
            }
        }
    }
}

特性四: 定義package對象(比較少)

package內(nèi)的成員混卵,可以直接訪問package對象內(nèi)的成員

package com.zj.scala

package object service {
    val defaultName = "Somebody"
}

package service {
    class MyService {
        def sayHello(name: String) {
            if(name != null && name != "") {
                println("Hello, " + name)
            } else {
                println("Hello, " + defaultName) 
            }
        }
    }
}

特性五: package可見性

package com.zj.scala

class Person {
    private[scala] val name = "leo"
    private[zj] val age = 25
}

import

如果沒有import,那么窖张。幕随。。你每次創(chuàng)建某個包下的類的對象宿接,都得用new com.zj.scala.service.MyService這種冗長的格式赘淮。。睦霎。
所以如果用了import梢卸,那么。副女。低剔。你只要先import com.zj.scala.service.MyService,然后再new MyService肮塞,即可。姻锁。枕赵。

import com.zj.scala.service.MyService;

object MainClass {
  def main(args: Array[String]): Unit = {
    val service = new MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

import特性

特性一: 用import com.zj.scala.service._這種格式,可以導(dǎo)入包下所有的成員

特性二: scala與java不同之處在于位隶,任何地方都可以使用import拷窜,比如類內(nèi)、方法內(nèi)涧黄,這種方式的好處在于篮昧,可以在一定作用域范圍內(nèi)使用導(dǎo)入

object MainClass {
  def main(args: Array[String]): Unit = {
    import com.zj.scala.service._
    
    val service = new MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

特性三: 選擇器、重命名笋妥、隱藏

import com.zj.scala.service.{ MyService }懊昨,僅僅導(dǎo)入java.awt包下的Color和Font類
import com.zj.scala.service.{ MyService => MyServiceImpl },將導(dǎo)入的類進(jìn)行重命名
import java.util.{ HashMap => _, _ }春宣,導(dǎo)入java.util包下所有的類酵颁,但是隱藏掉HashMap類

特性四: 隱式導(dǎo)入

每個scala程序默認(rèn)都會隱式導(dǎo)入以下幾個包下所有的成員

import java.lang._
import scala._
import Predef._
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫉你,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躏惋,更是在濱河造成了極大的恐慌幽污,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿姨,死亡現(xiàn)場離奇詭異距误,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扁位,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門准潭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贤牛,你說我怎么就攤上這事惋鹅。” “怎么了殉簸?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵闰集,是天一觀的道長。 經(jīng)常有香客問我般卑,道長武鲁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蝠检,我火速辦了婚禮沐鼠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叹谁。我一直安慰自己饲梭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布焰檩。 她就那樣靜靜地躺著憔涉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪析苫。 梳的紋絲不亂的頭發(fā)上兜叨,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音衩侥,去河邊找鬼国旷。 笑死,一個胖子當(dāng)著我的面吹牛茫死,可吹牛的內(nèi)容都是我干的跪但。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼璧榄,長吁一口氣:“原來是場噩夢啊……” “哼特漩!你這毒婦竟也來了吧雹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涂身,失蹤者是張志新(化名)和其女友劉穎雄卷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛤售,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡丁鹉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悴能。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揣钦。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漠酿,靈堂內(nèi)的尸體忽然破棺而出冯凹,到底是詐尸還是另有隱情,我是刑警寧澤炒嘲,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布宇姚,位于F島的核電站,受9級特大地震影響夫凸,放射性物質(zhì)發(fā)生泄漏浑劳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一夭拌、第九天 我趴在偏房一處隱蔽的房頂上張望魔熏。 院中可真熱鬧,春花似錦鸽扁、人聲如沸蒜绽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滓窍。三九已至,卻和暖如春巩那,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背此蜈。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工即横, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裆赵。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓东囚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親战授。 傳聞我的和親對象是個殘疾皇子页藻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容