Scala之OOP講解

Scala OOP

前序

Scala 為純粹OOP1、不支持基本類型:一切皆為對象 Byte,Int,...2、不支持靜態關鍵字:static	3、支持類型推斷【通過判斷泛型的父子關系來確定泛型類的父子關系=>協變,逆變,不變】和類型預定,	   動靜結合

java不是純粹的OOP的主要原因支持基本類型,支持靜態關鍵字。

1、類

1.1:類【主構造器】的基本構成

/*關鍵字:class創建對象:new內含:屬性(成員變量)和方法(函數=>解決問題,方法=>用于設計。因此在類中推薦寫方法)與java區別:1、默認訪問修飾符為 public,也支持 private 和 protected2、沒有構造方法,通過構造參數列表實現對象創建。因為scala類本身就是【主】構造器
*/// 主構造器
class Point(x:Int,y:Int) {// 【屬性】: 構造參數名和屬性不能同名private var _x:Int = xprivate var _y:Int = y// 【方法】def move(offsetX:Int,offsetY:Int): Unit = {_x += offsetX_y += offsetY}//【獲取屬性值】def getX = _xdef getY = _y//【修改屬性值】def setX(x:Int) = {_x=x}def setY(y:Int) = {_y=y}// 【重寫】override def toString: String = s"Point{x=${_x},y=${_y}}"
}object ScalaOOP {def main(args: Array[String]): Unit = {//創建對象val point = new Point(1, 2)//方法調用point.move(2,4)println(point)//獲取屬性值println(point.getX)//修改屬性值point.setX(21)println(point)}
}
------------------------
Point{x=3,y=6}
2
Point{x=21,y=10}
------------------------

訪問修飾符

修飾符類(class)伴生對象(object)子類(subclass)同包(package)全局(world)
default(public)YYYYY
protectedYYYNN
privateYYNNN

1.2:輔助構造器

輔助構造器:基于主構造器的重載

class Point(x:Int,y:Int) {// 屬性: 構造參數名和屬性不能同名private var _x:Int = xprivate var _y:Int = y//輔助構造器【必須調用主構造器,名字只能是this】def this(x:Int) = this(x,10)// 重寫方法override def toString: String = s"Point{x=${_x},y=${_y}}"
}object ScalaOOP {def main(args: Array[String]): Unit = {//創建對象val point = new Point(2)println(point)}
}
------------------------
Point{x=2,y=10}
------------------------

2、繼承

class Point(x:Int,y:Int) {// 屬性: 構造參數名和屬性不能同名private var _x:Int = xprivate var _y:Int = y// 方法def move(offsetX:Int,offsetY:Int): Unit = {_x += offsetX_y += offsetY}//獲取屬性值def getX = _xdef getY = _y//修改屬性值def setX(x:Int) = {_x=x}def setY(y:Int) = {_y=y}//輔助構造器def this(x:Int) = this(x,10)// 重寫方法override def toString: String = s"Point{x=${_x},y=${_y}}"
}/*** 繼承: extends & override*	  目的:擴展【繼承父類的主構造器】*    	ColorPoint中的x,y會調用Point的x,y*    	colorPoint會繼承父類Point的所有內容*	  注意:私有屬性無法被繼承*/
class ColorPoint(var x:Int,var y:Int,color:String) extends Point(x, y){//擴展屬性private var _color:String = color//重寫move方法:將x與y變為var變量【默認傳入的是常量val】override def move(offsetX: Int, offsetY: Int): Unit = {x += offsetX*2y += offsetY*2println(s"point moved to {${x},${y}}")}//多態override def toString: String = s"{POINT: ${super.toString},COLOR: ${_color}}"
}object ScalaOOP {def main(args: Array[String]): Unit = {val colorPoint = new ColorPoint(10, 20, "red")colorPoint.move(2,4)println(colorPoint)}
}
----------------------------------------
point moved to {14,28}
{POINT: Point{x=10,y=20},COLOR: red}
----------------------------------------

3、抽象類

3.1:抽象類基本知識點

抽象類: <=> 相當于java接口1.關鍵字:abstract & extends & override2.抽象類中可以有抽象方法(沒有方法體的方法即抽象方法),也可以存在普通方法3.無法實例化,需要在子類實體化后才可被使用【可以有構造器】4.使用 abstract 關鍵字修飾5.override5.1:子類重寫父類【抽象】方法可以省略 override 關鍵字,但不推薦省略5.2:子類重寫父類【非抽象】方法必須寫 override 關鍵字

3.2:抽象類詳細案列講解

//抽象類:必須用 abstract 修飾
abstract class Shape {// 抽象類中的抽象方法無需 abstract 修飾,因為【沒有方法體的方法】默認為【抽象方法】def draw():Unit // 抽象方法// 可以包含普通方法def show = println("this is shape")//普通方法(非抽象方法)
}class Circle(radius:Float) extends Shape{private var _radius:Float = radius//重寫抽象類中的【抽象方法】【必須】,可以并推薦添加 override 關鍵字override def draw(): Unit = println("you are drawing Circle...")//重寫抽象類中的【非抽象方法】【可選】,必須添加 override 關鍵字override def show: Unit = println(s"it is a Circle with radius of ${_radius} CM")}object ScalaOOP {def main(args: Array[String]): Unit = {val circle = new Circle(12.56f)circle.showcircle.draw()}
}
-------------------------------------------
this is a Circle with radius of 12.56 CM
you are drawing Circle...
-------------------------------------------

4、單例對象

4.1:基本知識點

單列對象:代替 Java 中的 static 關鍵字,作為【工具方法】來調用1、關鍵字:object2、可以包含【屬性】和【方法】,且可以通過單例對象名直接調用3、采取【惰性模式】,第一次被訪問時創建4、【無構造器,且不能 new5、程序入口方法main必須定義在單例對象中6、【同一個文件】中【同名的類和單例對象】形成【綁定關系】,并稱之為【伴生類和伴生對象】

4.2:單列對象

//單列對象
object Util{//屬性val PI:Float = 3.14fvar count:Int = 0//方法def resume = println("it is a utility object")
}object ScalaOOP {def main(args: Array[String]): Unit = {println(Util.PI)Util.count += 5println(Util.count)Util.resume}
}
------------------------
3.14
5
it is a utility object
------------------------

4.3:為什么要用單列對象?

單列對象是唯一的,具有資源共享特性【資源對于所有類的對象是共享的】。因此,類中共性的內容寫在單列對象中,實現資源共享,避免重復創建問題。差異化的內容寫在類中

4.4:伴生類與伴生對象【引申】

伴生對象是一種特殊的單列對象伴生對象屬于單列對象的一種。伴生對象與伴生類之間可以自由訪問。

4.4.1:【伴生對象】中可以自由訪問【伴生類】中所有資源

apply和unapply講解

package scala.cha06
// 伴生類
class Commodity(sku:String,price:Float) {private var _sku:String = skuprivate var _price:Float = pricedef getSku = _skudef getPrice = _price
}
// 伴生對象
object Commodity{//apply【包裹】:實現new的簡化操作【參數傳入,返回對象】def apply(sku: String, price: Float): Commodity = new Commodity(sku, price)//unapply【拆解】:【伴生對象】中可以自由訪問【伴生類】中所有資源def unapply(arg: Commodity):(String, Float) = (arg._sku,arg._price)
}
===================================================================================
package scala.cha06
object ScalaOOP {def main(args: Array[String]): Unit = {//不new返回單列對象apply;new返回伴生類 => 效果一致// 自動調用 apply 完成 Commodity 對象構造 val commodity: Commodity = Commodity("草莓", 5.8f)println(commodity.getSku)println(commodity.getPrice)//unapplyval t2: (String, Float) = Commodity.unapply(commodity)println(t2._1)println(t2._2)}
}
-----------------
草莓
5.8
草莓
5.8
-----------------
4.4.2:【伴生類】自由訪問【伴生對象】內的資源
package scala.cha06
// 伴生類
class Commodity(sku:String,price:Float) {private var _sku:String = skuprivate var _price:Float = price //原價def getSku = _skudef getPrice = _price //原價//伴生類中自由訪問伴生對象的所有資源def getSalePrice = discount(_price) //折扣價
}
// 伴生對象
object Commodity{private var _discount:Float = 1 //商品折扣//apply:實現new的簡化操作【參數傳入,返回對象】def apply(sku: String, price: Float): Commodity = new Commodity(sku, price)//自定義方法def setDiscount(discount:Float) = {_discount = discount} //設定折扣def discount(price:Float) = price * _discount
}
===================================================================================
package scala.cha06object ScalaOOP {def main(args: Array[String]): Unit = {Commodity.setDiscount(0.88f)val commodity: Commodity = Commodity("草莓", 5.8f)//單列對象println(commodity.getSalePrice)}
}
--------------
5.104
--------------

4.5:小練習

4.5.1:題目要求
1、準備工作假設類Book有屬性title和author(多個),books是Book的列表實現Book類,同時使用主構造器與輔助構造器實現Book的伴生對象,使用伴生對象創建Book實例創建books,使用List[Book]初始化5個以上Book實例
2、功能實現:1.找出books中書名包含“xxx”的書,并打印書名2.找出books中作者名以“xxx”打頭的書,并打印書名
4.5.2:Book類與對象的構建
package scala.cha06
// 伴生類
class Book(title:String,author:Array[String]) {private var _title:String = titleprivate var _authors:Array[String] = author//輔助構造器:實現類型轉換def this(title:String,author:String) = this(title,Array(author))// 設計業務:解決問題前置化(在源頭解決問題)//1.判斷書名是否包含“xxx”的方法def titleContains(sub:String) = _title.contains(sub)//2.判斷作者名是否以“xxx”打頭的方法def authorContains(name:String) = { _authors.count(_.startsWith(name))>0 }def getTitle = _titleoverride def toString: String = s"$title\t${_authors.mkString(",")}"
}
// 伴生對象
object Book{//主構造器def apply(title: String, author: Array[String]): Book = new Book(title, author)//輔助構造器def apply(title: String, author: String): Book = new Book(title, author)
}
4.5.3:功能實現
package scala.cha06object ScalaOOP {def main(args: Array[String]): Unit = {val list = List(// 書名,作者名Book("武俠:最強小保安",Array("張三","李四","王五")),Book("都市:上門贅婿",Array("阿強","洞冥福","花花")),Book("武俠:翔龍會",Array("阿慶嫂","黃世仁")),Book("都市:緣起",Array("徐世明","張丘月")),Book("武俠:小李飛刀",Array("王棟","李宏","張明")),)//1.找出books中書名包含“xxx”的書,并打印書名list.collect({case book if book.titleContains("武俠") => book.getTitle}).foreach(println)println("===============")//2.找出books中作者名以“xxx”打頭的書,并打印書名list.collect({case book if book.authorContains("李") => book.getTitle}).foreach(println)}
}
------------------------
武俠:最強小保安
武俠:翔龍會
武俠:小李飛刀
===============
武俠:最強小保安
武俠:小李飛刀
------------------------

5、特質

5.1:特質基本知識點

特質: <=> 【相當于java中接口】1、關鍵字:trait & extends & with & override2、包含字段、方法,亦可包含字段和方法的實現3、類、單例對象、普通對象【都可以擴展】特質4、不能實例化,【沒有構造器】5、單根繼承extends,借助 with 實現多混入5.1extendswith區分:is a : extends 繼承性擴展【只能用一次】has a : implements|with 功能性擴展【可使用多次】

5.2:特質詳細案例講解

trait Animal{//抽象屬性var name:String//普通屬性val TYPE:String = "動物"//抽象方法def roar:Unit//普通方法def me = s"$TYPE:$name"
}//功能性trait
trait BySwing{def fly():Unit // 飛行
}
trait ByFoot{def walk():Unit // 走路def run():Unit // 跑步
}
trait ByTail{def swim():Unit // 游泳
}/*** 1.單根繼承(Animal與Cat之間是is a的關系【Animal是主要特質trait】)* 2.with實現多混入(ByFoot,ByTail與Cat之間是has a的關系【ByFoot,ByTail額外特質trait】)*/
//貓
class Cat(nickName:String) extends Animal with ByFoot with ByTail {override var name: String = nickNameoverride def roar: Unit = println(s"貓${name}喵喵...")override def walk(): Unit = println(s"貓${name}悠閑地漫步...")override def run(): Unit = println(s"貓${name}瘋狂的奔跑...")override def swim(): Unit = println(s"貓${name}水里游泳...")
}object TraitTest {def main(args: Array[String]): Unit = {val animal = new Cat("Tom")println(animal.name)animal.roaranimal.run()animal.walk()animal.swim()}
}
---------------------
Tom
貓Tom喵喵...
貓Tom瘋狂的奔跑...
貓Tom悠閑地漫步...
---------------------

5.2:優化特質案列

package scala.cha06//特質trait無法使用構造器,因此用abstract來代替
abstract class Animal(brand:String){//抽象屬性var name:String//普通屬性var _type:String = brand//抽象方法def roar:Unit//普通方法def me = s"${_type}:$name"
}//功能性trait
trait BySwing{def fly():Unit // 飛行
}
trait ByFoot{def walk():Unit // 走路def run():Unit // 跑步
}
trait ByTail{def swim():Unit // 游泳
}/*** 1.單根繼承(Animal與Cat之間是is a的關系【Animal是主要特質trait】)* 2.with實現多混入(ByFoot與Cat之間是has a的關系【額外特質trait】)*/
//貓
class Cat(nickName:String) extends Animal("貓") with ByFoot with ByTail {override var name: String = nickNameoverride def roar: Unit = println(s"${_type}${name}喵喵...")override def walk(): Unit = println(s"${_type}${name}悠閑地漫步...")override def run(): Unit = println(s"${_type}${name}瘋狂的奔跑...")override def swim(): Unit = println(s"${_type}${name}水里游泳...")
}
//鳥
class Bird(nickName:String) extends Animal("鳥") with BySwing with ByFoot{override var name: String = nickNameoverride def roar: Unit = println(s"${_type}${name}嘰嘰喳喳的叫...")override def fly(): Unit = println(s"${_type}${name}天空翱翔...")override def walk(): Unit = println(s"${_type}${name}閑庭信步...")override def run(): Unit = println(s"${_type}${name}蹦蹦跳跳...")
}object TraitTest {def main(args: Array[String]): Unit = {val cat = new Cat("Tom")cat.roarcat.run()cat.walk()cat.swim()val bird = new Bird("Angela")bird.fly()bird.walk()bird.roar}
}
------------------------
貓Tom喵喵...
貓Tom瘋狂的奔跑...
貓Tom悠閑地漫步...
貓Tom水里游泳...
鳥Angela天空翱翔...
鳥Angela閑庭信步...
鳥Angela嘰嘰喳喳的叫...
------------------------

6、動態混入

6.1:動態混入的解讀

動態混入:未來創建對象時,將特質加進去。

通俗來講:有些行為同一種動物會有不同表現。我們會在創建對象時,添加相對應的行為。

6.2:動態混入詳細案例講解

//特質trait無法使用構造器,因此用abstract來代替
abstract class Animal(brand:String){//抽象屬性var name:String//普通屬性var _type:String = brand//抽象方法def roar:Unit//普通方法def me = s"${_type}:$name"
}//功能性trait
trait BySwing{def fly():Unit // 飛行
}
trait ByFoot{def walk():Unit // 走路def run():Unit // 跑步
}
trait ByTail{def swim():Unit // 游泳
}// 1、動態強制混入特質:只能定義一個強制混入特質,且必須位于類內首行
// self 是 this 的別名
class Fish extends Animal("魚"){self:ByTail=>						// 強制混入特質語法override var name: String = _override def roar: Unit = println(s"魚正在咕嚕咕嚕吐泡泡") //魚統一相同行為
}// 同一個魚,對于游泳這一行為有不同的表現
object TraitTest {def main(args: Array[String]): Unit = {// 1、動態強制混入特性  => ByTail行為在創建對象時是強制需要添加的// 2、動態非強制混入特質 with,支持多混入 => 其余行為可以自行添加,此處添加了ByFoot行為val fish1 = new Fish() with ByTail with ByFoot {// 1、動態強制混入特性override def swim(): Unit = println(s"${_type}1快速穿梭...")// 2、動態非強制混入特質override def walk(): Unit = println(s"${_type}1岸上散步...")override def run(): Unit = println(s"${_type}1加速追趕...")}// 3、復合類型 Fish with ByTail【可省略,如:fish1】val fish2:Fish with ByTail = new Fish() with ByTail {// 1、動態強制混入特性override def swim(): Unit = println(s"${_type}2水中漫游...")}fish1.swim()fish1.run()fish1.walk()fish2.swim()}
}
------------------1快速穿梭...1加速追趕...1岸上散步...2水中漫游...
------------------

7、抽象類 VS 特質

7.1:抽象類與特質的對比

一般【優先使用特質】:1、抽象類在于多類公共屬性和行為的抽象,重點在于【封裝思想】,本質為類,【單繼承,不支持多混入】。2、特質(接口)在于一類事物的屬性和行為標準定義,重點在于【多態思想,支持多混入】,【動態混入若需		要帶參構造.只能使用抽象類】。

7.2:小練習

7.2.1:題目要求
需求說明1.現在Book擁有電子版本,可以在多終端上播放屬性:作者author:String,書名bookName:String,類型bookType:String內容chapters:Array[String]方法:簡介resume():Unit2.定義Ebook特質方法:play()3.使Book動態混入Ebook特質,實現play()方法
7.2.2:準備工作——小說文章+書名+作者
val chapters = Array("“春游浩蕩,是年年寒食,梨花時節。白錦無紋香爛漫,玉樹瓊苞堆雪。靜夜沉沉,浮光靄靄,冷浸溶溶月。人間天上,爛銀霞照通徹。渾似姑射真人,天姿靈秀,意氣殊高潔。萬蕊參差誰信道,不與群芳同列。浩氣清英,仙才卓犖,下土難分別。瑤臺歸去,洞天方看清絕。”\n\n  作這一首《無俗念》詞的,乃南宋末年一位武學名家,有道之士。此人姓丘,名處機,道號長春子,名列全真七子之一,是全真教中出類拔萃的人物。《詞品》評論此詞道:“長春,世之所謂仙人也,而詞之清拔如此”。這首詞誦的似是梨花,其實詞中真意卻是贊譽一位身穿白衣的美貌少女,說她“渾似姑射真人,天姿靈秀,意氣殊高潔”,又說她“浩氣清英,仙才卓犖”,“不與群芳同列”。詞中所頌這美女,乃古墓派傳人小龍女。她一生愛穿白衣,當真如風拂玉樹,雪裹瓊苞,兼之生性清冷,實當得起“冷浸溶溶月”的形容,以“無俗念”三字贈之,可說十分貼切。長春子丘處機和她在終南山上比鄰而居,當年一見,便寫下這首詞來。\n\n  這時丘處機逝世已久,小龍女也已嫁與神雕大俠楊過為妻。在河南少室山山道之上,卻另有一個少女,正在低低念誦此詞。這少女十**歲年紀,身穿淡黃衣衫,騎著一頭青驢,正沿山道緩緩而上,心中默想:“也只有龍姊姊這樣的人物,才配得上他。”這一個“他”字,指的自然是神雕大俠楊過了。她也不拉韁繩,任由那青驢信步而行,一路上山。過了良久,她又低聲吟道:“歡樂趣,離別苦,就中更有癡兒女。君應有語,渺萬里層云,千山暮雪,只影向誰去?”","她腰懸短劍,臉上頗有風塵之色,顯是遠游已久;韶華如花,正當喜樂無憂之年,可是容色間卻隱隱有懊悶意,似是愁思襲人,眉間心上,無計回避。\n\n  這少女姓郭,單名一個襄字,乃大俠郭靖和女俠黃蓉的次女,有個外號叫做“小東邪”。她一驢一劍,只身漫游,原想排遣心中愁悶,豈知酒入愁腸固然愁上加愁,而名山獨游,一般的也是愁悶徒增。河南少室山山勢頗陡,山道卻是一長列寬大的石級,規模宏偉,工程著實不小,那是唐朝高宗為臨幸少林寺而開鑿,共長八里。郭襄騎著青驢委折而上,只見對面山上五道瀑布飛珠濺玉,奔瀉而下,再俯視群山,已如蟻蛭。順著山道轉過一個彎,遙見黃墻碧瓦,好大一座寺院。\n\n  她望著連綿屋宇出了一會神,心想:“少林寺向為天下武學之源,但華山兩次論劍,怎地五絕之中并無少林寺高僧?難道寺中和尚自忖沒有把握,生怕墮了威名,索性便不去與會?又難道眾僧侶修為精湛,名心盡去,武功雖高,卻不去和旁人爭強賭勝?”她下了青驢,緩步走向寺前,只見樹木森森,蔭著一片碑林。石碑大半已經毀破,字跡模糊,不知寫著些甚么。心想:“便是刻鑿在石碑上的字,年深月久之后也須磨滅,如何刻在我心上的,卻是時日越久反而越加清晰?”瞥眼只見一塊大碑上刻著唐太宗賜少林寺寺僧的御札,嘉許少林寺僧立功平亂。碑文中說唐太宗為秦王時,帶兵討伐王世充,少林寺和尚投軍立功,最著者共一十三人。其中只曇宗一僧受封為大將軍,其余十二僧不愿為官,唐太宗各賜紫羅袈裟一襲。她神馳想象:“當隋唐之際,少林寺武功便已名馳天下,數百年來精益求精,這寺中臥虎藏龍,不知有多少好手。”郭襄自和楊過、小龍女夫婦在華山絕頂分手后,三年來沒得到他二人半點音訊。她心中長自記掛,于是稟明父母,說要出來游山玩水,實則是打聽楊過的消息,她倒也不一定要和他夫婦會面,只須聽到一些楊過如何在江湖上行俠的訊息,也便心滿意足了。偏生一別之后,他夫婦從此便不在江湖上露面,不知到了何處隱居,郭襄自北而南,又從東至西,幾乎踏遍了大半個中原,始終沒聽到有人說起神雕大俠楊過的近訊。這一日她到了河南,想起少林寺中有一位僧人無色禪師是楊過的好友,自己十六歲生日之時,無色瞧在楊過的面上,曾托人送來一件禮物,雖然從未和他見過面,但不妨去問他一問,說不定他會知道楊過的蹤跡,這才上少林寺來。正出神間,忽聽得碑林旁樹叢后傳出一陣鐵鏈當啷之聲,一人誦念佛經:“是時藥叉共王立要,即于無量百千萬億大眾之中,說勝妙伽他曰:由愛故生憂,由愛故生怖;若離于愛者,無憂亦無怖……”郭襄聽了這四句偈言,不由得癡了,心中默默念道:“由愛故生憂,由愛故生怖;若離于愛者,無憂亦無怖。”只聽得鐵鏈拖地和念佛之聲漸漸遠去。郭襄低聲道:“我要問他,如何才能離于愛,如何能無憂無怖?”隨手將驢韁在樹上一繞,撥開樹叢,追了過去。只見樹后是一條上山的小徑,一個僧人挑了一對大桶,正緩緩往山上走去。郭襄快步跟上,奔到距那僧人七八丈處,不由得吃了一驚,只見那僧人挑的是一對大鐵桶,比之尋常水桶大了兩倍有余,那僧人頸中、手上、腳上,更繞滿了粗大的鐵鏈,行走時鐵鏈拖地,不停發出聲響。這對大鐵桶本身只怕便有二百來斤,桶中裝滿了水,重量更是驚人。郭襄叫道:“大和尚,請留步,小女子有句話請教。”","那僧人回過頭來,兩人相對,都是一愕。原來這僧人便是覺遠,三年以前,兩人在華山絕頂曾有一面之緣。郭襄知他雖然生性迂腐,但內功深湛,不在當世任何高手之下,便道:“我道是誰,原來是覺遠大師。你如何變成了這等模樣?”覺遠點了點頭,微微一笑,合十行禮,并不答話,轉身便走。郭襄叫道:“覺遠大師,你不認得我了么?我是郭襄啊。”覺遠又是回首一笑,點了點頭,這次更不停步。郭襄又道:“是誰用鐵鏈綁住了你?如何這般虐待你?”覺遠左掌伸到腦后搖了幾搖,示意她不必再問。\n\n  郭襄見了這等怪事,如何肯不弄個明白?當下飛步追趕,想搶在他面前攔住,豈知覺遠雖然全身帶了鐵鏈,又挑著一對大鐵桶,但郭襄快步追趕,始終搶不到他身前。郭襄童心大起,展開家傳輕功,雙足一點,身子飛起,伸手往鐵桶邊上抓去,眼見這一下必能抓中。不料落手時終究還是差了兩寸。郭襄叫道:“大和尚,這般好本事,我非追上你不可。”但見覺遠不疾不徐的邁步而行,鐵鏈聲當啷當啷有如樂音,越走越高,直至后山。郭襄直奔得氣喘漸急,但仍和他相距丈余,不由得心中佩服:“爹爹媽媽在華山之上,便說這位大和尚武功極高,當時我還不大相信,今日一試,才知爹媽的話果然不錯。”只見覺遠轉身走到一間小屋之后,將鐵桶中的兩桶水都倒進了一口井中。郭襄大奇,叫道:“大和尚,你莫非瘋了,挑水倒在井中干么?”覺遠神色平和,只搖了搖頭。郭襄忽有所悟,笑道:“啊,你是在練一門高深的武功。”覺遠又搖了搖頭。郭襄心中著惱,說道:“我剛才明明聽得你在念經,又不是啞了,怎地不答我的話?”覺遠合十行禮,臉上似有歉意,一言不發,挑了鐵桶便下山去。郭襄探頭井口向下望去,只見井水清澈,也無特異之處,怔怔望著覺遠的背影,心中滿是疑竇。她適才一陣追趕,微感心浮氣躁,于是坐在井欄圈上,觀看四下風景,這時置身處已高于少林寺所有屋宇,但見少室山層崖刺天,橫若列屏,崖下風煙飄渺,寺中鐘聲隨風送上,令人一洗煩俗之氣。郭襄心想:“這和尚的弟子不知在哪里,和尚既不肯說,我去問那個少年便了。”當下信步落山,想去找覺遠的弟子張君寶來問。走了一程,忽聽得鐵鏈聲響,覺遠又挑了水上來。郭襄閃身躲在樹后,心想:“我暗中瞧瞧他到底在搗甚么鬼。”鐵鏈聲漸近,只見覺遠仍是挑著那對鐵桶,手中卻拿著一本書,全神貫注的輕聲誦讀。郭襄待他走到身邊,猛地里躍出,叫道:“大和尚,你看甚么書?”\n\n  覺遠失聲叫道:“啊喲,嚇了我一跳,原來是你。”郭襄笑道:“你裝啞巴裝不成了罷,怎么說話了?”覺遠微有驚色,向左右一望,搖了搖手。郭襄道:“你怕甚么?”覺遠還未回答,突然樹林中轉出兩個灰衣僧人,一高一矮。那瘦長僧人喝道:“覺遠,不守戒法,擅自開口說話,何況又和廟外生人對答,更何況又和年輕女子說話?這便見戒律堂首座去。”覺遠垂頭喪氣,點了點頭,跟在那兩個僧人之后。郭襄大為驚怒,喝道:“天下還有不許人說話的規矩么?我識得這位大師,我自跟他說話,干你們何事?”那瘦長僧人白眼一翻,說道:“千年以來,少林寺向不許女流擅入。姑娘請下山去罷,免得自討沒趣。”郭襄心中更怒,說道:“女流便怎樣?難道女子便不是人?你們干么難為這位覺遠大師?既用鐵鏈捆綁他,又不許他說話?”那僧人冷冷的道:“本寺之事,便是皇帝也管不著。何勞姑娘多問?”","郭襄怒道:“這位大師是忠厚老實的好人,你們欺他仁善,便這般折磨于他,哼哼,天鳴禪師呢?無色和尚、無相和尚在哪里?你去叫他們出來,我倒要問問這個道理。”兩個僧人聽了都是一驚。天鳴禪師是少林寺方丈,無色禪師是本寺羅漢堂首座,無相禪師是達摩堂首座,三人位望尊崇,寺中僧侶向來只稱“老方丈”、“羅漢堂座師”、“達摩堂座師”,從來不敢提及法名,豈知一個年輕女子竟敢上山來大呼小叫,直斥其名。那兩名僧人都是戒律堂首座的弟子,奉了座師之命,監視覺遠,這時聽郭襄言語莽撞,那瘦長僧人喝道:“女施主再在佛門清凈之地滋擾,莫怪小僧無禮。”\n\n  郭襄道:“難道我還怕了你這和尚?你快快把覺遠大師身上的鐵鏈除去,那便算了,否則我找天鳴老和尚算帳去。”那矮僧聽郭襄出言無狀,又見她腰懸短劍,沉著嗓子道:“你把兵刃留下,我們也不來跟你一般見識,快下山去罷。”郭襄摘下短劍,雙手托起,冷笑道:“好罷,謹遵臺命。”那矮僧自幼在少林寺出家,一向聽師伯、師叔、師兄們說少林寺是天下武學的總源,又聽說不論名望多大、本領多強的武林高手,從不敢攜帶兵刃走進少林寺出門。這年輕姑娘雖然未入寺門,但已在少林寺范圍之內,只道她真是怕了,乖乖交出短劍,于是伸手便去接劍。他手指剛碰到劍鞘,突然間手臂劇震,如中電掣,但覺一股強力從短劍上傳了過來,推得他向后急仰,立足不定,登時摔倒。他身在斜坡之上,一經摔倒,便骨碌碌的向下滾了數丈,好容易硬生生的撐住,這才不再滾動。那瘦長僧人又驚又怒,喝道:“你吃了獅子心豹子膽,竟到少林寺撒野來啦!”轉過身來,踏上一步,右手一拳擊出,左掌跟著在右拳上一搭,變成雙掌下劈,正是“闖少林”第二十八勢“翻身劈擊”。郭襄握住劍柄,連劍帶鞘向他肩頭砸去。那僧人沉肩回掌,來抓劍鞘。覺遠在旁瞧得惶急,大叫:“別動手,別動手!有話好說。”便在此時,那僧人右手已抓住劍鞘,正卻運勁里奪,猛覺手心一震,雙臂隱隱酸麻,只叫得一聲:“不好!”郭襄左腿橫掃,已將他踢下坡去。他所受的這一招比那矮僧重得多,一路翻滾,頭臉上擦出不少鮮血,這才停住。郭襄心道:“我上少林寺來是打聽大哥哥的訊息,平白無端的跟他們動手,當真好沒來由。”眼見覺遠愁眉苦臉的站在一旁,當即抽出短劍,便往他手腳上的鐵鏈削去。這短劍雖非稀世奇珍,卻也是極鋒銳的利器,只聽得當啷啷幾聲響,鐵鏈斷了三條。覺遠連呼:“使不得,使不得!”郭襄道:“甚么使不得?”指著正向寺內奔去的高矮二僧說道:“這兩個惡和尚定是奔去報訊,咱們快走。你那個姓張的小徒兒呢?帶了他一起走罷!”覺遠只是搖手。忽聽得身后一人說道:“多謝姑娘關懷,小的在這兒。”\n\n  郭襄回過頭來,只見身后站著個十六七歲的少年,粗眉大眼,身材魁偉,臉上卻猶帶稚氣,正是三年前曾在華山之巔會過的張君寶。比之當日,他身形已高了許多,但容貌無甚改變。郭襄大喜,說道:“這里的惡和尚欺侮你師父,咱們走罷。”張君寶搖頭道:“沒有誰欺侮我師父啊。”郭襄指著覺遠道:“那兩個惡和尚用鐵鏈鎖著你師父,連一句話也不許他說,還不是欺侮?”覺遠苦笑搖頭,指了指山下,示意郭襄及早脫身,免惹事端。郭襄明知少林寺中武功勝過她的人不計其數,但既見了眼前的不平之事,決不能便此撒手不顧;可是卻又擔心寺中好手出來截攔,當下一手拉了覺遠,一手拉了張君寶,頓足道:“快走快走,有甚么事,下山去慢慢說不好么?”兩人只是不動。忽見山坡下寺院邊門中沖出七八名僧人,手提齊眉木棍,吆喝道:“哪里來的野姑娘,膽敢來少林寺撒野?”張君寶提起嗓子叫道:“各位師兄不得無禮,這位是……”郭襄忙道:“別說我名字。”她想今日的禍事看來闖得不小,說不定鬧下去會不可收拾,可別牽累到爹爹媽媽,又補上一句:“咱們翻山走罷!千萬別提我爹爹媽媽和朋友的姓名。”只聽得背后山頂上吆喝聲響,又涌出七八名僧人來。郭襄見前后都出現了僧人,秀眉深蹙,急道:“你們兩個婆婆媽媽,沒點男子漢氣概!到底走不走?”張君寶道:“師父,郭姑娘一片好意……”","便在此時,下面邊門中又竄出四名黃衣僧人,颼颼颼的奔上坡來,手中都沒兵器,但身法迅捷,衣襟帶風,武功頗為了得。郭襄見這般情勢,便想單獨脫身亦已不能,索性凝氣卓立,靜觀其變。當先一名僧人奔到離她四丈之處,朗聲說道:“羅漢堂首座尊師傳諭:著來人放下兵刃,在山下一葦亭中陳明詳情,聽由法諭。”\n\n  郭襄冷笑道:“少林寺的大和尚官派十足,官腔打得倒好聽。請問各位大和尚做的是大宋皇帝的官兒呢,還是做蒙古皇帝的官?”這時淮水以北,大宋國土均已淪陷,少林寺所在之地自也早該歸蒙古管,只是蒙古大軍連年進攻襄陽不克,忙于調兵遣將,也無余力來理會叢林寺觀的事,因此少林寺一如其舊,與前并無不同。那僧人聽郭襄譏刺之言甚是厲害,不由得臉上一紅,心中也覺對外人下令傳諭有些不妥,合十說道:“不知女施主何事光臨敝寺,且請放下兵刃,赴山下一葦亭中奉茶說話。”郭襄聽他語轉和緩,便想乘此收蓬,說道:“你們不讓我進寺,我便希罕了?哼,難道少林寺中有寶,我見一見便沾了光么?”向張君寶使個眼色,低聲道:“到底走不走?”張君寶搖搖頭,嘴角向覺遠一努,意思說是要服侍師父。郭襄朗聲道:“好,那我不管啦,我走了。”拔步便下坡去。第一名黃衣僧側身讓開。第二名和第三名黃衣僧卻同時伸手一攔,齊聲道:“且慢,放下了兵刃。”郭襄眉毛一揚,手按劍柄。第一名僧人道:“我們也不敢留著女施主的兵刃。女施主一到山下,我們立即將寶劍送上,這是少林寺千年來的規矩,還請包涵。”郭襄聽他言語有禮,心下躊躇:“倘若不留短劍,勢必有場爭斗,我孤身一人,如何是闔寺僧眾的敵手?但若留下短劍,豈不將外公、爹爹、媽媽、大哥哥、龍姊姊的面子一古腦兒都丟得干凈?”她一時沉吟未決,驀地里眼前黃影晃動,一人喝道:“到少林寺來既帶劍,又傷人,世上焉有是理?”跟著勁風颯然,五只手指往劍鞘上抓下來。這僧人若不貿然出手,郭襄一番遲疑之后,多半便會將短劍留下。她和乃姊郭芙的性子大不相同,雖然豪爽,卻不魯莽,眼前處境既極度不利,便會暫忍一時之氣,日后再去和外公、爹媽商量,回頭找這場子,但對方突然逞強,豈能眼睜睜的讓他將劍奪去?那僧人的擒拿手法既狠且巧,一抓住劍鞘,心想郭襄定會向里回奪,一個和尚跟一個年輕女子拉拉扯扯,大是不雅,當下運勁向左斜推,跟著抓而向右。郭襄被他這么一推一抓,果然已拿不牢劍鞘,當即握住劍柄,刷的一聲,寒光出匣。那僧人右手將劍鞘奪了過去,左手卻有兩根手指被短劍順勢割斷,劇痛之下,拋下劍鞘,往旁退開。\n\n  眾僧人見同門受傷,無不驚怒,揮杖舞棍,一齊攻來。郭襄心想:“一不做二不休,反正今日已不能善罷。”當下使出家傳的“落英劍法”,便往山下沖去。眾僧人排成三列,仰面擋住。那“落英劍法”乃黃藥師從“落英掌法”的路子中演化來,雖不若“玉簫劍法”的精妙,卻也是桃花島的一絕,但見青光激蕩,劍花點點,便似落英繽紛,四散而下,霎時間僧人中又有兩人受傷。但背后數名僧人跟著搶到,居高臨下的夾攻。按理郭襄早已抵擋不住,只是少林僧眾慈悲為本,不愿傷她性命,所出招數都非殺手,只求將她打倒,訓誡一番,扣下兵刃,將她逐下山去。可是郭襄劍光錯落,卻也不易攻近身去。眾僧初時只道一個妙齡女郎,還不輕易打發?待見她劍法精奇,始知她若非名門之女,便是名師之徒,多半得罪不得,出招時更有分寸,一面急報羅漢堂首座無色禪師。正斗之間,一個身材高瘦老年僧人緩步走近,雙手籠在袖中,微笑觀斗。兩名僧人走到他身前,低聲稟告了幾句。郭襄已斗得氣喘吁吁,劍法凌亂,大聲喝道:“說甚么天下武學之源,原來是十多個和尚一擁而上,倚多為勝。”那老僧便是羅漢堂首座無色禪師,聽她這么說,便道:“各人住手!”眾僧人立時罷手躍開。無色禪師道:“姑娘貴姓,令尊和令師是誰?光臨少林寺,不知有何貴干?”郭襄心道:“我爹娘的姓名不能告訴你。我到少林寺來是為了打聽大哥哥的訊息,那也不能當眾述說。眼下已鬧成這等模樣,日后爹娘和大哥哥知道了定要怪我,不如悄悄的溜了罷。”說道:“我的姓名不能跟你說,我不過見山上風景優美,這便上來游覽玩耍。原來少林寺比皇宮內院還要厲害,動不動便要扣人家兵刃。請問大師,我進了貴寺的山門沒有?當日達摩祖師傳下武藝,想來也不過教眾僧侶強身健體,便于精進修為,想不到少林寺名頭越大,武功越高,恃眾逞強的名頭也越來越響。好,你們要扣我兵刃,這便留下,除非將我殺了,否則今日之事江湖上不會無人知曉。”她本來伶牙俐齒,這件事也并非全是她的過錯,一席話只將無色禪師說得啞口無言。郭襄鑒貌辨色,心想:“這番胡鬧我固怕人知曉,看來少林寺更加不愿張揚。十多個和尚圍斗一個年輕姑娘,說出去有甚么好聽?”當下哼的一聲,將短劍往地下一擲,舉步便行。"
)
val book = EBook("倚天屠龍記","張天愛","武俠小說")
7.2.3:具體展示

EBook

package scala.cha06import java.util.regex.{Matcher, Pattern}
import scala.collection.mutable.ArrayBufferclass Book(title:String,author:Array[String]) {val _title:String = titleval _authors:Array[String] = author//輔助構造器:實現類型轉換def this(title:String,author:String) = this(title,Array(author))// 設計業務:解決問題前置化(在源頭解決問題)//1.判斷書名是否包含“xxx”的方法def titleContains(sub:String) = _title.contains(sub)//2.判斷作者名是否以“xxx”打頭的方法def authorContains(name:String) = { _authors.count(_.startsWith(name))>0 }def getTitle = _titleoverride def toString: String = s"$title\t${_authors.mkString(",")}"
}object Book{//主構造器def apply(title: String, author: Array[String]): Book = new Book(title, author)//輔助構造器def apply(title: String, author: String): Book = new Book(title, author)
}//=================================================
trait EAction{//看某一個章節def play(chapterNo:Int):Unit//判斷是否繼續觀看并展示章節內容def play()
}class EBook(title:String,author:Array[String],bookType:String)extends Book(title,author) with EAction {val _bookType:String = bookType //書類型val _chapters:ArrayBuffer[String] = ArrayBuffer() //章節數def this(title:String,author:String,bookType:String) = this(title,Array(author),bookType)def chapterCount = _chapters.sizedef resume:Unit = println(s"類型:${_bookType} ,標題:${_title},作者:${_authors.mkString("、")},章節數:${_chapters.size}")//將章節加進來def addChapter(chapter:String):Unit = {_chapters.append(chapter)}//輸出文章內容(本質是java,可在java中運行驗證再復制于此)private def showChapter(chapter:String): Unit ={val patLine: Pattern = Pattern.compile("([^\n]{1,30})")//一行30個val matcher: Matcher = patLine.matcher(chapter)while (matcher.find){System.out.println(matcher.group(1))}}override def play(chapterNo: Int): Unit = {if(chapterNo>=1 && chapterNo<=_chapters.size){showChapter(_chapters(chapterNo-1))}else{println("無此章節")}}override def play(): Unit = {import scala.util.control.Breaks._ //控制import scala.io.StdIn._ //控制臺輸入//給個選擇,跳出循環breakable({var chapterNo = 1 //當前讀取的章節數while (chapterNo<=chapterCount){play(chapterNo) //跳轉至第chapterNo章節,展示當前章節內容print("是否繼續讀取:")//readLine():讀取控制臺輸入內容,用于判斷是否繼續讀取if(!readLine().matches("y|Y")){break() //跳出breakable結構}chapterNo += 1}})}
}object EBook{//簡化構造方式def apply(title: String, author: String, bookType: String): EBook = new EBook(title, author, bookType)
}

測試結果

package scala.cha06object ScalaOOP {def main(args: Array[String]): Unit = {val chapters = Array("“春游浩蕩,是年年寒食,梨花時節。白錦無紋香爛漫,玉樹瓊苞堆雪。靜夜沉沉,浮光靄靄,冷浸溶溶月。人間天上,爛銀霞照通徹。渾似姑射真人,天姿靈秀,意氣殊高潔。萬蕊參差誰信道,不與群芳同列。浩氣清英,仙才卓犖,下土難分別。瑤臺歸去,洞天方看清絕。”\n\n  作這一首《無俗念》詞的,乃南宋末年一位武學名家,有道之士。此人姓丘,名處機,道號長春子,名列全真七子之一,是全真教中出類拔萃的人物。《詞品》評論此詞道:“長春,世之所謂仙人也,而詞之清拔如此”。這首詞誦的似是梨花,其實詞中真意卻是贊譽一位身穿白衣的美貌少女,說她“渾似姑射真人,天姿靈秀,意氣殊高潔”,又說她“浩氣清英,仙才卓犖”,“不與群芳同列”。詞中所頌這美女,乃古墓派傳人小龍女。她一生愛穿白衣,當真如風拂玉樹,雪裹瓊苞,兼之生性清冷,實當得起“冷浸溶溶月”的形容,以“無俗念”三字贈之,可說十分貼切。長春子丘處機和她在終南山上比鄰而居,當年一見,便寫下這首詞來。\n\n  這時丘處機逝世已久,小龍女也已嫁與神雕大俠楊過為妻。在河南少室山山道之上,卻另有一個少女,正在低低念誦此詞。這少女十**歲年紀,身穿淡黃衣衫,騎著一頭青驢,正沿山道緩緩而上,心中默想:“也只有龍姊姊這樣的人物,才配得上他。”這一個“他”字,指的自然是神雕大俠楊過了。她也不拉韁繩,任由那青驢信步而行,一路上山。過了良久,她又低聲吟道:“歡樂趣,離別苦,就中更有癡兒女。君應有語,渺萬里層云,千山暮雪,只影向誰去?”","她腰懸短劍,臉上頗有風塵之色,顯是遠游已久;韶華如花,正當喜樂無憂之年,可是容色間卻隱隱有懊悶意,似是愁思襲人,眉間心上,無計回避。\n\n  這少女姓郭,單名一個襄字,乃大俠郭靖和女俠黃蓉的次女,有個外號叫做“小東邪”。她一驢一劍,只身漫游,原想排遣心中愁悶,豈知酒入愁腸固然愁上加愁,而名山獨游,一般的也是愁悶徒增。河南少室山山勢頗陡,山道卻是一長列寬大的石級,規模宏偉,工程著實不小,那是唐朝高宗為臨幸少林寺而開鑿,共長八里。郭襄騎著青驢委折而上,只見對面山上五道瀑布飛珠濺玉,奔瀉而下,再俯視群山,已如蟻蛭。順著山道轉過一個彎,遙見黃墻碧瓦,好大一座寺院。\n\n  她望著連綿屋宇出了一會神,心想:“少林寺向為天下武學之源,但華山兩次論劍,怎地五絕之中并無少林寺高僧?難道寺中和尚自忖沒有把握,生怕墮了威名,索性便不去與會?又難道眾僧侶修為精湛,名心盡去,武功雖高,卻不去和旁人爭強賭勝?”她下了青驢,緩步走向寺前,只見樹木森森,蔭著一片碑林。石碑大半已經毀破,字跡模糊,不知寫著些甚么。心想:“便是刻鑿在石碑上的字,年深月久之后也須磨滅,如何刻在我心上的,卻是時日越久反而越加清晰?”瞥眼只見一塊大碑上刻著唐太宗賜少林寺寺僧的御札,嘉許少林寺僧立功平亂。碑文中說唐太宗為秦王時,帶兵討伐王世充,少林寺和尚投軍立功,最著者共一十三人。其中只曇宗一僧受封為大將軍,其余十二僧不愿為官,唐太宗各賜紫羅袈裟一襲。她神馳想象:“當隋唐之際,少林寺武功便已名馳天下,數百年來精益求精,這寺中臥虎藏龍,不知有多少好手。”郭襄自和楊過、小龍女夫婦在華山絕頂分手后,三年來沒得到他二人半點音訊。她心中長自記掛,于是稟明父母,說要出來游山玩水,實則是打聽楊過的消息,她倒也不一定要和他夫婦會面,只須聽到一些楊過如何在江湖上行俠的訊息,也便心滿意足了。偏生一別之后,他夫婦從此便不在江湖上露面,不知到了何處隱居,郭襄自北而南,又從東至西,幾乎踏遍了大半個中原,始終沒聽到有人說起神雕大俠楊過的近訊。這一日她到了河南,想起少林寺中有一位僧人無色禪師是楊過的好友,自己十六歲生日之時,無色瞧在楊過的面上,曾托人送來一件禮物,雖然從未和他見過面,但不妨去問他一問,說不定他會知道楊過的蹤跡,這才上少林寺來。正出神間,忽聽得碑林旁樹叢后傳出一陣鐵鏈當啷之聲,一人誦念佛經:“是時藥叉共王立要,即于無量百千萬億大眾之中,說勝妙伽他曰:由愛故生憂,由愛故生怖;若離于愛者,無憂亦無怖……”郭襄聽了這四句偈言,不由得癡了,心中默默念道:“由愛故生憂,由愛故生怖;若離于愛者,無憂亦無怖。”只聽得鐵鏈拖地和念佛之聲漸漸遠去。郭襄低聲道:“我要問他,如何才能離于愛,如何能無憂無怖?”隨手將驢韁在樹上一繞,撥開樹叢,追了過去。只見樹后是一條上山的小徑,一個僧人挑了一對大桶,正緩緩往山上走去。郭襄快步跟上,奔到距那僧人七八丈處,不由得吃了一驚,只見那僧人挑的是一對大鐵桶,比之尋常水桶大了兩倍有余,那僧人頸中、手上、腳上,更繞滿了粗大的鐵鏈,行走時鐵鏈拖地,不停發出聲響。這對大鐵桶本身只怕便有二百來斤,桶中裝滿了水,重量更是驚人。郭襄叫道:“大和尚,請留步,小女子有句話請教。”","那僧人回過頭來,兩人相對,都是一愕。原來這僧人便是覺遠,三年以前,兩人在華山絕頂曾有一面之緣。郭襄知他雖然生性迂腐,但內功深湛,不在當世任何高手之下,便道:“我道是誰,原來是覺遠大師。你如何變成了這等模樣?”覺遠點了點頭,微微一笑,合十行禮,并不答話,轉身便走。郭襄叫道:“覺遠大師,你不認得我了么?我是郭襄啊。”覺遠又是回首一笑,點了點頭,這次更不停步。郭襄又道:“是誰用鐵鏈綁住了你?如何這般虐待你?”覺遠左掌伸到腦后搖了幾搖,示意她不必再問。\n\n  郭襄見了這等怪事,如何肯不弄個明白?當下飛步追趕,想搶在他面前攔住,豈知覺遠雖然全身帶了鐵鏈,又挑著一對大鐵桶,但郭襄快步追趕,始終搶不到他身前。郭襄童心大起,展開家傳輕功,雙足一點,身子飛起,伸手往鐵桶邊上抓去,眼見這一下必能抓中。不料落手時終究還是差了兩寸。郭襄叫道:“大和尚,這般好本事,我非追上你不可。”但見覺遠不疾不徐的邁步而行,鐵鏈聲當啷當啷有如樂音,越走越高,直至后山。郭襄直奔得氣喘漸急,但仍和他相距丈余,不由得心中佩服:“爹爹媽媽在華山之上,便說這位大和尚武功極高,當時我還不大相信,今日一試,才知爹媽的話果然不錯。”只見覺遠轉身走到一間小屋之后,將鐵桶中的兩桶水都倒進了一口井中。郭襄大奇,叫道:“大和尚,你莫非瘋了,挑水倒在井中干么?”覺遠神色平和,只搖了搖頭。郭襄忽有所悟,笑道:“啊,你是在練一門高深的武功。”覺遠又搖了搖頭。郭襄心中著惱,說道:“我剛才明明聽得你在念經,又不是啞了,怎地不答我的話?”覺遠合十行禮,臉上似有歉意,一言不發,挑了鐵桶便下山去。郭襄探頭井口向下望去,只見井水清澈,也無特異之處,怔怔望著覺遠的背影,心中滿是疑竇。她適才一陣追趕,微感心浮氣躁,于是坐在井欄圈上,觀看四下風景,這時置身處已高于少林寺所有屋宇,但見少室山層崖刺天,橫若列屏,崖下風煙飄渺,寺中鐘聲隨風送上,令人一洗煩俗之氣。郭襄心想:“這和尚的弟子不知在哪里,和尚既不肯說,我去問那個少年便了。”當下信步落山,想去找覺遠的弟子張君寶來問。走了一程,忽聽得鐵鏈聲響,覺遠又挑了水上來。郭襄閃身躲在樹后,心想:“我暗中瞧瞧他到底在搗甚么鬼。”鐵鏈聲漸近,只見覺遠仍是挑著那對鐵桶,手中卻拿著一本書,全神貫注的輕聲誦讀。郭襄待他走到身邊,猛地里躍出,叫道:“大和尚,你看甚么書?”\n\n  覺遠失聲叫道:“啊喲,嚇了我一跳,原來是你。”郭襄笑道:“你裝啞巴裝不成了罷,怎么說話了?”覺遠微有驚色,向左右一望,搖了搖手。郭襄道:“你怕甚么?”覺遠還未回答,突然樹林中轉出兩個灰衣僧人,一高一矮。那瘦長僧人喝道:“覺遠,不守戒法,擅自開口說話,何況又和廟外生人對答,更何況又和年輕女子說話?這便見戒律堂首座去。”覺遠垂頭喪氣,點了點頭,跟在那兩個僧人之后。郭襄大為驚怒,喝道:“天下還有不許人說話的規矩么?我識得這位大師,我自跟他說話,干你們何事?”那瘦長僧人白眼一翻,說道:“千年以來,少林寺向不許女流擅入。姑娘請下山去罷,免得自討沒趣。”郭襄心中更怒,說道:“女流便怎樣?難道女子便不是人?你們干么難為這位覺遠大師?既用鐵鏈捆綁他,又不許他說話?”那僧人冷冷的道:“本寺之事,便是皇帝也管不著。何勞姑娘多問?”","郭襄怒道:“這位大師是忠厚老實的好人,你們欺他仁善,便這般折磨于他,哼哼,天鳴禪師呢?無色和尚、無相和尚在哪里?你去叫他們出來,我倒要問問這個道理。”兩個僧人聽了都是一驚。天鳴禪師是少林寺方丈,無色禪師是本寺羅漢堂首座,無相禪師是達摩堂首座,三人位望尊崇,寺中僧侶向來只稱“老方丈”、“羅漢堂座師”、“達摩堂座師”,從來不敢提及法名,豈知一個年輕女子竟敢上山來大呼小叫,直斥其名。那兩名僧人都是戒律堂首座的弟子,奉了座師之命,監視覺遠,這時聽郭襄言語莽撞,那瘦長僧人喝道:“女施主再在佛門清凈之地滋擾,莫怪小僧無禮。”\n\n  郭襄道:“難道我還怕了你這和尚?你快快把覺遠大師身上的鐵鏈除去,那便算了,否則我找天鳴老和尚算帳去。”那矮僧聽郭襄出言無狀,又見她腰懸短劍,沉著嗓子道:“你把兵刃留下,我們也不來跟你一般見識,快下山去罷。”郭襄摘下短劍,雙手托起,冷笑道:“好罷,謹遵臺命。”那矮僧自幼在少林寺出家,一向聽師伯、師叔、師兄們說少林寺是天下武學的總源,又聽說不論名望多大、本領多強的武林高手,從不敢攜帶兵刃走進少林寺出門。這年輕姑娘雖然未入寺門,但已在少林寺范圍之內,只道她真是怕了,乖乖交出短劍,于是伸手便去接劍。他手指剛碰到劍鞘,突然間手臂劇震,如中電掣,但覺一股強力從短劍上傳了過來,推得他向后急仰,立足不定,登時摔倒。他身在斜坡之上,一經摔倒,便骨碌碌的向下滾了數丈,好容易硬生生的撐住,這才不再滾動。那瘦長僧人又驚又怒,喝道:“你吃了獅子心豹子膽,竟到少林寺撒野來啦!”轉過身來,踏上一步,右手一拳擊出,左掌跟著在右拳上一搭,變成雙掌下劈,正是“闖少林”第二十八勢“翻身劈擊”。郭襄握住劍柄,連劍帶鞘向他肩頭砸去。那僧人沉肩回掌,來抓劍鞘。覺遠在旁瞧得惶急,大叫:“別動手,別動手!有話好說。”便在此時,那僧人右手已抓住劍鞘,正卻運勁里奪,猛覺手心一震,雙臂隱隱酸麻,只叫得一聲:“不好!”郭襄左腿橫掃,已將他踢下坡去。他所受的這一招比那矮僧重得多,一路翻滾,頭臉上擦出不少鮮血,這才停住。郭襄心道:“我上少林寺來是打聽大哥哥的訊息,平白無端的跟他們動手,當真好沒來由。”眼見覺遠愁眉苦臉的站在一旁,當即抽出短劍,便往他手腳上的鐵鏈削去。這短劍雖非稀世奇珍,卻也是極鋒銳的利器,只聽得當啷啷幾聲響,鐵鏈斷了三條。覺遠連呼:“使不得,使不得!”郭襄道:“甚么使不得?”指著正向寺內奔去的高矮二僧說道:“這兩個惡和尚定是奔去報訊,咱們快走。你那個姓張的小徒兒呢?帶了他一起走罷!”覺遠只是搖手。忽聽得身后一人說道:“多謝姑娘關懷,小的在這兒。”\n\n  郭襄回過頭來,只見身后站著個十六七歲的少年,粗眉大眼,身材魁偉,臉上卻猶帶稚氣,正是三年前曾在華山之巔會過的張君寶。比之當日,他身形已高了許多,但容貌無甚改變。郭襄大喜,說道:“這里的惡和尚欺侮你師父,咱們走罷。”張君寶搖頭道:“沒有誰欺侮我師父啊。”郭襄指著覺遠道:“那兩個惡和尚用鐵鏈鎖著你師父,連一句話也不許他說,還不是欺侮?”覺遠苦笑搖頭,指了指山下,示意郭襄及早脫身,免惹事端。郭襄明知少林寺中武功勝過她的人不計其數,但既見了眼前的不平之事,決不能便此撒手不顧;可是卻又擔心寺中好手出來截攔,當下一手拉了覺遠,一手拉了張君寶,頓足道:“快走快走,有甚么事,下山去慢慢說不好么?”兩人只是不動。忽見山坡下寺院邊門中沖出七八名僧人,手提齊眉木棍,吆喝道:“哪里來的野姑娘,膽敢來少林寺撒野?”張君寶提起嗓子叫道:“各位師兄不得無禮,這位是……”郭襄忙道:“別說我名字。”她想今日的禍事看來闖得不小,說不定鬧下去會不可收拾,可別牽累到爹爹媽媽,又補上一句:“咱們翻山走罷!千萬別提我爹爹媽媽和朋友的姓名。”只聽得背后山頂上吆喝聲響,又涌出七八名僧人來。郭襄見前后都出現了僧人,秀眉深蹙,急道:“你們兩個婆婆媽媽,沒點男子漢氣概!到底走不走?”張君寶道:“師父,郭姑娘一片好意……”","便在此時,下面邊門中又竄出四名黃衣僧人,颼颼颼的奔上坡來,手中都沒兵器,但身法迅捷,衣襟帶風,武功頗為了得。郭襄見這般情勢,便想單獨脫身亦已不能,索性凝氣卓立,靜觀其變。當先一名僧人奔到離她四丈之處,朗聲說道:“羅漢堂首座尊師傳諭:著來人放下兵刃,在山下一葦亭中陳明詳情,聽由法諭。”\n\n  郭襄冷笑道:“少林寺的大和尚官派十足,官腔打得倒好聽。請問各位大和尚做的是大宋皇帝的官兒呢,還是做蒙古皇帝的官?”這時淮水以北,大宋國土均已淪陷,少林寺所在之地自也早該歸蒙古管,只是蒙古大軍連年進攻襄陽不克,忙于調兵遣將,也無余力來理會叢林寺觀的事,因此少林寺一如其舊,與前并無不同。那僧人聽郭襄譏刺之言甚是厲害,不由得臉上一紅,心中也覺對外人下令傳諭有些不妥,合十說道:“不知女施主何事光臨敝寺,且請放下兵刃,赴山下一葦亭中奉茶說話。”郭襄聽他語轉和緩,便想乘此收蓬,說道:“你們不讓我進寺,我便希罕了?哼,難道少林寺中有寶,我見一見便沾了光么?”向張君寶使個眼色,低聲道:“到底走不走?”張君寶搖搖頭,嘴角向覺遠一努,意思說是要服侍師父。郭襄朗聲道:“好,那我不管啦,我走了。”拔步便下坡去。第一名黃衣僧側身讓開。第二名和第三名黃衣僧卻同時伸手一攔,齊聲道:“且慢,放下了兵刃。”郭襄眉毛一揚,手按劍柄。第一名僧人道:“我們也不敢留著女施主的兵刃。女施主一到山下,我們立即將寶劍送上,這是少林寺千年來的規矩,還請包涵。”郭襄聽他言語有禮,心下躊躇:“倘若不留短劍,勢必有場爭斗,我孤身一人,如何是闔寺僧眾的敵手?但若留下短劍,豈不將外公、爹爹、媽媽、大哥哥、龍姊姊的面子一古腦兒都丟得干凈?”她一時沉吟未決,驀地里眼前黃影晃動,一人喝道:“到少林寺來既帶劍,又傷人,世上焉有是理?”跟著勁風颯然,五只手指往劍鞘上抓下來。這僧人若不貿然出手,郭襄一番遲疑之后,多半便會將短劍留下。她和乃姊郭芙的性子大不相同,雖然豪爽,卻不魯莽,眼前處境既極度不利,便會暫忍一時之氣,日后再去和外公、爹媽商量,回頭找這場子,但對方突然逞強,豈能眼睜睜的讓他將劍奪去?那僧人的擒拿手法既狠且巧,一抓住劍鞘,心想郭襄定會向里回奪,一個和尚跟一個年輕女子拉拉扯扯,大是不雅,當下運勁向左斜推,跟著抓而向右。郭襄被他這么一推一抓,果然已拿不牢劍鞘,當即握住劍柄,刷的一聲,寒光出匣。那僧人右手將劍鞘奪了過去,左手卻有兩根手指被短劍順勢割斷,劇痛之下,拋下劍鞘,往旁退開。\n\n  眾僧人見同門受傷,無不驚怒,揮杖舞棍,一齊攻來。郭襄心想:“一不做二不休,反正今日已不能善罷。”當下使出家傳的“落英劍法”,便往山下沖去。眾僧人排成三列,仰面擋住。那“落英劍法”乃黃藥師從“落英掌法”的路子中演化來,雖不若“玉簫劍法”的精妙,卻也是桃花島的一絕,但見青光激蕩,劍花點點,便似落英繽紛,四散而下,霎時間僧人中又有兩人受傷。但背后數名僧人跟著搶到,居高臨下的夾攻。按理郭襄早已抵擋不住,只是少林僧眾慈悲為本,不愿傷她性命,所出招數都非殺手,只求將她打倒,訓誡一番,扣下兵刃,將她逐下山去。可是郭襄劍光錯落,卻也不易攻近身去。眾僧初時只道一個妙齡女郎,還不輕易打發?待見她劍法精奇,始知她若非名門之女,便是名師之徒,多半得罪不得,出招時更有分寸,一面急報羅漢堂首座無色禪師。正斗之間,一個身材高瘦老年僧人緩步走近,雙手籠在袖中,微笑觀斗。兩名僧人走到他身前,低聲稟告了幾句。郭襄已斗得氣喘吁吁,劍法凌亂,大聲喝道:“說甚么天下武學之源,原來是十多個和尚一擁而上,倚多為勝。”那老僧便是羅漢堂首座無色禪師,聽她這么說,便道:“各人住手!”眾僧人立時罷手躍開。無色禪師道:“姑娘貴姓,令尊和令師是誰?光臨少林寺,不知有何貴干?”郭襄心道:“我爹娘的姓名不能告訴你。我到少林寺來是為了打聽大哥哥的訊息,那也不能當眾述說。眼下已鬧成這等模樣,日后爹娘和大哥哥知道了定要怪我,不如悄悄的溜了罷。”說道:“我的姓名不能跟你說,我不過見山上風景優美,這便上來游覽玩耍。原來少林寺比皇宮內院還要厲害,動不動便要扣人家兵刃。請問大師,我進了貴寺的山門沒有?當日達摩祖師傳下武藝,想來也不過教眾僧侶強身健體,便于精進修為,想不到少林寺名頭越大,武功越高,恃眾逞強的名頭也越來越響。好,你們要扣我兵刃,這便留下,除非將我殺了,否則今日之事江湖上不會無人知曉。”她本來伶牙俐齒,這件事也并非全是她的過錯,一席話只將無色禪師說得啞口無言。郭襄鑒貌辨色,心想:“這番胡鬧我固怕人知曉,看來少林寺更加不愿張揚。十多個和尚圍斗一個年輕姑娘,說出去有甚么好聽?”當下哼的一聲,將短劍往地下一擲,舉步便行。")val book = EBook("倚天屠龍記","張天愛","武俠小說")chapters.foreach(chapter=>book.addChapter(chapter))book.play()}
}

效果展示

“春游浩蕩,是年年寒食,梨花時節。白錦無紋香爛漫,玉樹瓊苞堆
雪。靜夜沉沉,浮光靄靄,冷浸溶溶月。人間天上,爛銀霞照通徹。
渾似姑射真人,天姿靈秀,意氣殊高潔。萬蕊參差誰信道,不與群芳
同列。浩氣清英,仙才卓犖,下土難分別。瑤臺歸去,洞天方看清絕
。”作這一首《無俗念》詞的,乃南宋末年一位武學名家,有道之士
。此人姓丘,名處機,道號長春子,名列全真七子之一,是全真教中
出類拔萃的人物。《詞品》評論此詞道:“長春,世之所謂仙人也,
而詞之清拔如此”。這首詞誦的似是梨花,其實詞中真意卻是贊譽一
位身穿白衣的美貌少女,說她“渾似姑射真人,天姿靈秀,意氣殊高
潔”,又說她“浩氣清英,仙才卓犖”,“不與群芳同列”。詞中所
頌這美女,乃古墓派傳人小龍女。她一生愛穿白衣,當真如風拂玉樹
,雪裹瓊苞,兼之生性清冷,實當得起“冷浸溶溶月”的形容,以“
無俗念”三字贈之,可說十分貼切。長春子丘處機和她在終南山上比
鄰而居,當年一見,便寫下這首詞來。這時丘處機逝世已久,小龍女也已嫁與神雕大俠楊過為妻。在河
南少室山山道之上,卻另有一個少女,正在低低念誦此詞。這少女十
**歲年紀,身穿淡黃衣衫,騎著一頭青驢,正沿山道緩緩而上,心
中默想:“也只有龍姊姊這樣的人物,才配得上他。”這一個“他”
字,指的自然是神雕大俠楊過了。她也不拉韁繩,任由那青驢信步而
行,一路上山。過了良久,她又低聲吟道:“歡樂趣,離別苦,就中
更有癡兒女。君應有語,渺萬里層云,千山暮雪,只影向誰去?”
是否繼續讀取:y
她腰懸短劍,臉上頗有風塵之色,顯是遠游已久;韶華如花,正當喜
樂無憂之年,可是容色間卻隱隱有懊悶意,似是愁思襲人,眉間心上
,無計回避。這少女姓郭,單名一個襄字,乃大俠郭靖和女俠黃蓉的次女,有
個外號叫做“小東邪”。她一驢一劍,只身漫游,原想排遣心中愁悶
,豈知酒入愁腸固然愁上加愁,而名山獨游,一般的也是愁悶徒增。
河南少室山山勢頗陡,山道卻是一長列寬大的石級,規模宏偉,工程
著實不小,那是唐朝高宗為臨幸少林寺而開鑿,共長八里。郭襄騎著
青驢委折而上,只見對面山上五道瀑布飛珠濺玉,奔瀉而下,再俯視
群山,已如蟻蛭。順著山道轉過一個彎,遙見黃墻碧瓦,好大一座寺
院。她望著連綿屋宇出了一會神,心想:“少林寺向為天下武學之源
,但華山兩次論劍,怎地五絕之中并無少林寺高僧?難道寺中和尚自
忖沒有把握,生怕墮了威名,索性便不去與會?又難道眾僧侶修為精
湛,名心盡去,武功雖高,卻不去和旁人爭強賭勝?”她下了青驢,
緩步走向寺前,只見樹木森森,蔭著一片碑林。石碑大半已經毀破,
字跡模糊,不知寫著些甚么。心想:“便是刻鑿在石碑上的字,年深
月久之后也須磨滅,如何刻在我心上的,卻是時日越久反而越加清晰
?”瞥眼只見一塊大碑上刻著唐太宗賜少林寺寺僧的御札,嘉許少林
寺僧立功平亂。碑文中說唐太宗為秦王時,帶兵討伐王世充,少林寺
和尚投軍立功,最著者共一十三人。其中只曇宗一僧受封為大將軍,
其余十二僧不愿為官,唐太宗各賜紫羅袈裟一襲。她神馳想象:“當
隋唐之際,少林寺武功便已名馳天下,數百年來精益求精,這寺中臥
虎藏龍,不知有多少好手。”郭襄自和楊過、小龍女夫婦在華山絕頂
分手后,三年來沒得到他二人半點音訊。她心中長自記掛,于是稟明
父母,說要出來游山玩水,實則是打聽楊過的消息,她倒也不一定要
和他夫婦會面,只須聽到一些楊過如何在江湖上行俠的訊息,也便心
滿意足了。偏生一別之后,他夫婦從此便不在江湖上露面,不知到了
何處隱居,郭襄自北而南,又從東至西,幾乎踏遍了大半個中原,始
終沒聽到有人說起神雕大俠楊過的近訊。這一日她到了河南,想起少
林寺中有一位僧人無色禪師是楊過的好友,自己十六歲生日之時,無
色瞧在楊過的面上,曾托人送來一件禮物,雖然從未和他見過面,但
不妨去問他一問,說不定他會知道楊過的蹤跡,這才上少林寺來。正
出神間,忽聽得碑林旁樹叢后傳出一陣鐵鏈當啷之聲,一人誦念佛經
:“是時藥叉共王立要,即于無量百千萬億大眾之中,說勝妙伽他曰
:由愛故生憂,由愛故生怖;若離于愛者,無憂亦無怖……”郭襄聽
了這四句偈言,不由得癡了,心中默默念道:“由愛故生憂,由愛故
生怖;若離于愛者,無憂亦無怖。”只聽得鐵鏈拖地和念佛之聲漸漸
遠去。郭襄低聲道:“我要問他,如何才能離于愛,如何能無憂無怖
?”隨手將驢韁在樹上一繞,撥開樹叢,追了過去。只見樹后是一條
上山的小徑,一個僧人挑了一對大桶,正緩緩往山上走去。郭襄快步
跟上,奔到距那僧人七八丈處,不由得吃了一驚,只見那僧人挑的是
一對大鐵桶,比之尋常水桶大了兩倍有余,那僧人頸中、手上、腳上
,更繞滿了粗大的鐵鏈,行走時鐵鏈拖地,不停發出聲響。這對大鐵
桶本身只怕便有二百來斤,桶中裝滿了水,重量更是驚人。郭襄叫道
:“大和尚,請留步,小女子有句話請教。”
是否繼續讀取:nProcess finished with exit code 0

8、內部類

8.1:使用內部類的目的

1.封裝代碼:將代碼進行封裝,達到重用的效果。

2.隱藏實現:在內部類中通過【訪問控制修飾符】來決定是否對外開放。

????????若定義了一個【私有的內部類(private)】,那么【這個內部類就只能在外部類的內部使用,外部類的客戶端無法直接訪問或實例化這個內部類,從而實現了隱藏實現】。這種方式可以有效地封裝類的實現細節,提高代碼的安全性和可維護性。

3.易維護易擴展

8.2:具體講解

知識點一:Scala中內部類是外部類對象的成員
/*Java中內部類是【外部類的成員】:InClass ic = new OutClass.InClass()Scala中內部類是【外部類對象的成員】:val out = new OutClass();val in = new out.InClass();
*///外部類
class OutClass {//內部類:隱藏實現class InClass{override def toString: String = "InClass"}private val in:InClass = new InClass()override def toString: String = s"OutClass{${in}}"
}object ScalaOOP {def main(args: Array[String]): Unit = {//創建外部類對象val out = new OutClassprintln(out)//外部訪問內部類 => 內部類是外部類對象的資源val in = new out.InClassprintln(in)}
}
--------------------------
OutClass{InClass}
InClass
--------------------------
知識點二:內部類推薦寫入伴生對象中
import scala.cha06.OutClass.InClass
//外部類
class OutClass {private val in:InClass = new InClass()override def toString: String = s"OutClass{${in}}"
}
//內部類:【推薦】寫到【伴生對象】中
object OutClass{class InClass{override def toString: String = "InClass"}
}object ScalaOOP {def main(args: Array[String]): Unit = {//創建外部類對象val out = new OutClassprintln(out)//外部訪問內部類 => 內部類是外部類對象的資源val in = new OutClass.InClassprintln(in)}
}
--------------------------
OutClass{InClass}
InClass
--------------------------

9、樣例類

9.1:樣例類基本知識

樣例類:1.默認狀態下:【不可變值】的對象樣例類構造參數【默認聲明】為 val,自動生成 getter【不可變值】樣例類的構造參數若聲明為 var,自動生成 getter & setter【可變值】2.自動生成:樣例類自動生成伴生對象樣例類自動實現的其他方法:toString,copy,equals,hashCode3.【樣例類伴生對象實現】的方法:apply, unapply(用于模式匹配)4.【注意點】:父類可以是樣例類或普通類,但其葉子節點[最底層節點]不能是樣例類。

9.2:樣例類詳細案例講解

一:模式匹配案例
// 普通類的模式匹配案例
case class Student(name:String, age:Int)	// 構造參數默認 val
case class Point(var x:Int,var y:Int)		// var 需要顯式聲明// 追加伴生對象并實現 apply & unapply 之后,不再報錯
object Point{//形成對象def apply(x: Int, y: Int): Point = new Point(x, y)//拆解,提取對象中內容def unapply(arg: Point): Option[(Int, Int)] = Some((arg.x,arg.y)) 
}val obj:Any = Student("張三",18)
val info = obj match {case Student(_,22) => "22"case Student(name,_) if name.startsWith("張") => "姓張"case Point(a,_) => s"$a" // 報錯 cannot resolve symbol
}
-------------------
姓張
-------------------
二:驗證可變值與不可變值案例
// 默認情況下val:【不可變值】的對象
object ScalaOOP {def main(args: Array[String]): Unit = {case class Point(x:Int,y:Int)val point: Point = Point(10, 20)println(point.x)//獲取信息}
}
------------
10
------------// var:可變值
object ScalaOOP {def main(args: Array[String]): Unit = {case class Point(var x:Int,var y:Int)val point: Point = Point(10, 20)point.x = 21println(point.x)}
}
------------
21
------------

10、枚舉【了解】

/*單例對象通過繼承 Enumeration 實現枚舉創建,簡單易用,但不可擴展通常用于定義一個有限取值范圍的常量
*/
class Choice extends Enumeration {val FIRST_CHOICE = Value(0)val FIRST_SECOND = Value(1)val FIRST_THIRD = Value(2)
}object ScalaOOP {def main(args: Array[String]): Unit = {val choice: Choice.Value = Choice.FIRST_CHOICEval num: Int = choice match {case Choice.FIRST_CHOICE => 11case Choice.SECOND_CHOICE => 12case Choice.THIRD_CHOICE => 13}println(num)}
}
------------
11
------------

11、泛型

11.1:泛型定義

泛型的定義類型參數化,主要用于【集合】。不同于 Java ,scala中泛型被定義在 [] 中

11.2:泛型簡單體驗

//泛型體驗
class Many[T](t:T){val _t:T = toverride def toString: String = _t.toString
}object ScalaOOP {def main(args: Array[String]): Unit = {val many:Many[String] = new Many[String]("123")println(many)}
}
-------------
123
-------------

11.3:泛型的邊界定義

class GrandFather(name:String) {val _name:String = nameoverride def toString: String = _name
}
object GrandFather{def apply(name: String): GrandFather = new GrandFather(name)
}class Father(name:String) extends GrandFather(name:String) {}
object Father{def apply(name: String): Father = new Father(name)
}class Son(name:String) extends Father(name:String) {}
object Son{def apply(name: String): Son = new Son(name)
}class GrandSon(name:String) extends Son(name:String){}
object GrandSon{def apply(name: String): GrandSon = new GrandSon(name)
}/*泛型邊界定義上邊界:T<:A	泛型為某個類型的子類下邊界:T>:A	泛型為某個類型的父類
*/
// 1.只能是比Father小的類型
class MyArray[T <: Father](items:T*) {def join(sep:String) = items.mkString(sep)
}
// Type GrandFather does not conform to 【 upper bound 】 Father of type parameter T
val arr:MyArray[GrandFather] = ...=================================================================================// 2.只能是比Son大的類型
class MyArray[T >: Son](items:T*) {def join(sep:String) = items.mkString(sep)
}
// Type GrandSon does not conform to 【 lower bound 】 Son of type parameter T
val arr:MyArray[GrandSon] = ...

11.4:泛型的多態

class GrandFather(name:String) {val _name:String = nameoverride def toString: String = _name
}
object GrandFather{def apply(name: String): GrandFather = new GrandFather(name)
}class Father(name:String) extends GrandFather(name:String) {}
object Father{def apply(name: String): Father = new Father(name)
}class Son(name:String) extends Father(name:String) {}
object Son{def apply(name: String): Son = new Son(name)
}class GrandSon(name:String) extends Son(name:String){}
object GrandSon{def apply(name: String): GrandSon = new GrandSon(name)
}/*泛型的變化 => 影響泛型類的變化型變:多態協變:[+T]		若A是B的子類,則 C[A]為C[B]的子類 ?【推薦】逆變:[-T]		若A是B的子類,則 C[B]為C[A]的子類不變:[T]		默認
*/
class MyArray[+T](items:T*) {def join(sep:String) = items.mkString(sep)
}
// Father 是 Son 的父類,則 MyArray[Father] 就是 MyArray[Son] 的父類
val arr:MyArray[Father] = new MyArray[Son](Son("henry"),Son("ariel"))=================================================================================class MyArray[-T](items:T*) {def join(sep:String) = items.mkString(sep)
}
// Father 是 Son 的子類,則 MyArray[Son] 就是 MyArray[Father] 的子類
val arr:MyArray[Son] = new MyArray[Father](Son("henry"),Son("ariel"))=================================================================================class MyArray[T](items:T*) {def join(sep:String) = items.mkString(sep)
}
// 所有泛型都必須為 Son
val arr:MyArray[Son] = new MyArray[Son](Son("henry"),Son("ariel"))

12、包與包對象

/*【包】包命名規則:字母、數字、下劃線、點,不能以數字開頭,在【一個類文件中可以定義多個并列的包】導包的不同方式import com.kgc.Person				方便使用類 Personimport com.kgc._					方便使用 com.kgc 包中的所有類import com.kgc.Person._				方便使用類 Person 中的所有屬性和方法import com.kgc.{Person=>PS,Book}	只導入包中 Person和Book,并將Person重命名為PS不同于Javaimport 導包語句可以出現在任意地方可以導入包、類、類成員
*/// 單個文件多包結構:【資源】按【包名】語義【分類存放】,方便管理和使用
----------------------- Test.scala START ----------------------------
package cha03{import cha03.util.Sortsobject PackageTest {def main(args: Array[String]): Unit = {val array: Array[Int] = Array(3, 1, 5, 4, 2)Sorts.insertSort(array)array.foreach(println)}}
}package cha03.util{object Sorts{def insertSort(array: Array[Int]): Unit ={import scala.util.control.Breaks._for(i<- 1 until array.length){val t = array(i)var j = i-1breakable({while (j>=0){if(array(j)>t){array(j+1) = array(j)}else{break()}j-=1}})array(j+1) = t}}}
}
----------------------- Test.scala END ----------------------------/*【包對象】包中可以包含:類、對象、特質...包對象可以包含:除了類、對象、特質外,還可以包含變量和方法
*/
package cha03{import cha03.util.Constants._import cha03.util.Constants.{DataFormat=>DF}object PackageTest {def main(args: Array[String]): Unit = {println(PI*2*2)println(getQuarter(5))val format: DF = DF(2024, 3, 29)println(format.stdYMD())println(format.stdFull())println(format.timestamp())}}
}
package cha03.util{import java.util.Calendar// 包對象package object Constants{// 變量val PI:Float = 3.14f// 方法def getQuarter(month:Int)=(month-1)/3+1// 類class DataFormat(year:Int,month:Int,day:Int,hour:Int,minute:Int,second:Int,millis:Int){private var _year:Int = yearprivate var _month:Int = monthprivate var _day:Int = dayprivate var _hour:Int = hourprivate var _minute:Int = minuteprivate var _second:Int = secondprivate var _millis:Int = millisdef this(year:Int,month:Int,day:Int){this(year,month,day,0,0,0,0)}def stdYMD():String = s"${_year}-${_month}-${_day}"def stdFull():String = s"${_year}-${_month}-${_day} ${_hour}:${_minute}:${_second}.${_millis}"def timestamp():Long = {val cld = Calendar.getInstance()cld.set(_year,_month,_day,_hour,_minute,_second)cld.set(Calendar.MILLISECOND,555)cld.getTimeInMillis}}}object DataFormat{def apply(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int, millis: Int): DataFormat = new DataFormat(year, month, day, hour, minute, second, millis)def apply(year: Int, month: Int, day: Int): DataFormat = new DataFormat(year, month, day)}
}// 導包的形式
import pack_name						包本身
import pack_name._						包下面的所有資源
import pack_name.{A=>AS,B}				包下面部分資源
import pack_name.Class					類本身
import pack_name.Class.{PI,show}		類中的方法屬性等
import pack_name.Class._				類下面的所有資源

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46231.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46231.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46231.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【iOS】類對象的結構分析

目錄 對象的分類object_getClass和class方法isa流程和繼承鏈分析isa流程實例驗證類的繼承鏈實例驗證 類的結構cache_t結構bits分析實例驗證屬性properties方法methods協議protocolsro類方法 類結構流程圖解 對象的分類 OC中的對象主要可以分為3種&#xff1a;實例對象&#xf…

【React】JSX基礎

一、簡介 JSX是JavaScript XML的縮寫&#xff0c;它是一種在JavaScript代碼中編寫類似HTML模板的結構的方法。JSX是React框架中構建用戶界面&#xff08;UI&#xff09;的核心方式之一。 1.什么是JSX JSX允許開發者使用類似HTML的聲明式模板來構建組件。它結合了HTML的直觀性…

TDesign組件庫日常應用的一些注意事項

【前言】Element&#xff08;餓了么開源組件庫&#xff09;在國內使用的普及率和覆蓋率高于TDesign-vue&#xff08;騰訊開源組件庫&#xff09;&#xff0c;這也導致日常開發遇到組件使用上的疑惑時&#xff0c;網上幾乎搜索不到其文章解決方案&#xff0c;只能深挖官方文檔或…

2024.7.17 ABAP面試題目總結

2024.7.17 用的SAP什么平臺&#xff0c;S4/HANA嗎&#xff0c;有用過ECC嗎 S4/HANA&#xff0c;沒用過ECC 會不會CDS VIEW 不會 會不會FIORI 不會 銀企直連里面的邏輯了解不 不了解&#xff0c;做過&#xff0c;但是只能算很簡單的修改 SAP做增強&#xff0c;如何創建…

網絡安全-網絡安全及其防護措施7

31.防病毒和惡意軟件保護 防病毒和惡意軟件防護的定義和作用 防病毒和惡意軟件防護是一種保護計算機和網絡免受病毒、木馬、間諜軟件等惡意軟件侵害的安全措施。通過防護措施&#xff0c;可以檢測、阻止和清除惡意軟件&#xff0c;確保系統和數據的安全。其主要作用包括&…

C++右值引用和移動語義

目錄 概念&#xff1a; 左值引用和右值引用 概念&#xff1a; 注意&#xff1a; 左值引用的意義 作函數參數 函數引用返回 右值引用的意義 誕生背景 移動構造 移動賦值 其他應用 萬能引用和完美轉發 默認的移動構造和移動賦值 概念&#xff1a; 左值&#xff1a;顧…

List數據的幾種數據輸出方式

一、問題引入 在Java中&#xff0c;查詢List集合是一項常見的任務&#xff0c;它可以通過多種方式實現&#xff0c;以滿足不同的需求。下面&#xff0c;List數據的幾種數據輸出方式。 二、實例 /*** 查詢所有用戶信息* return*/ List<User> getAllUser(); <select…

Git【撤銷遠程提交記錄】

在實際開發中&#xff0c;你是否遇到過錯誤的提交了代碼&#xff0c;想要刪掉本次提交記錄的情況&#xff0c;你可以按照如下方法實現。 1、使用 git revert 如果你想要保留歷史記錄&#xff0c;并且對遠程倉庫其他使用者的影響最小&#xff0c;你可以使用 git revert 命令。這…

conda 使用

首先要安裝Miniconda的環境 下面是一下命令關于如何使用conda 查看當前環境列表&#xff1a; conda env list 創建環境不指定路徑&#xff1a; conda create --name p38 python3.8 創建新環境并指定路徑&#xff1a; conda create --prefix /data/p38 python3.8激活新環境&a…

VulnHub:CK00

靶場搭建 靶機下載地址&#xff1a;CK: 00 ~ VulnHub 下載后&#xff0c;在vmware中打開靶機。 修改網絡配置為NAT 處理器修改為2 啟動靶機 靶機ip掃描不到的解決辦法 靶機開機時一直按shift或者esc直到進入GRUB界面。 按e進入編輯模式&#xff0c;找到ro&#xff0c;修…

Kubernetes網絡性能測試-calico插件環境

Kubernetes 網絡性能測試-calico插件環境 本次主要針對calico網絡插件k8s集群的網絡性能進行摸底及測試方法探索實踐。 1. 測試準備 1.1 測試環境 測試環境為VMware Workstation虛擬機搭建的一套K8S環境&#xff0c;版本為1.28.2&#xff0c;網絡插件使用calico&#xff0c…

6Python的Pandas:數據讀取與輸出

Pandas是一個強大的Python數據分析庫&#xff0c;提供了讀取和輸出數據的多種功能。以下是一些常見的數據讀取與輸出方法&#xff1a; 1. 讀取CSV 讀取數據 從CSV文件讀取數據 import pandas as pd# 讀取CSV文件 df pd.read_csv(file_path.csv) print(df.head())從Excel文…

Flutter 狀態管理調研總結

一, 候選狀態管理組件簡介 0. flutter_hooks 一個 React 鉤子在 Flutter 上的實現&#xff1a;Making Sense of React Hooks 鉤子是一種用來管理 Widget 生命周期的新對象&#xff0c;以減少重復代碼、增加組件間復用性&#xff0c;允許將視圖邏輯提取到通用的用例中并重用&…

思路|如何利用oneNote釣魚?

本文僅用于技術研究學習&#xff0c;請遵守相關法律&#xff0c;禁止使用本文所提及的相關技術開展非法攻擊行為&#xff0c;由于傳播、利用本文所提供的信息而造成任何不良后果及損失&#xff0c;與本賬號及作者無關。 本文來源無問社區&#xff0c;更多實戰內容&#xff0c;…

[python]pycharm設置清華源

國內鏡像源有以下幾個&#xff0c;因為都是國內的&#xff0c;基本速度差不了太多。 清華&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣&…

針對【module_or_function】的單元測試,全面覆蓋可能的【edge_cases】

針對【module_or_function】的單元測試&#xff0c;全面覆蓋可能的【edge_cases】 編寫單元測試是為了驗證代碼模塊或函數的正確性和魯棒性。對于module_or_function&#xff0c;首先需要確定這個模塊或函數的具體功能和預期輸入范圍。一個好的單元測試應該包括以下幾個步驟&a…

高并發服務器-使用多線程(Multi-Thread)實現【C語言】

在上期的socket套接字的使用詳解中&#xff08;socket套接字的使用詳解&#xff09;最后實現的TCP服務器只能處理一個客戶端的請求發送&#xff0c;當有其他客戶端請求連接時會被阻塞。為了能同時處理多個客戶端的連接請求&#xff0c;本期使用多線程的方式來解決。 程序流程 …

爬蟲案例(讀書網)(下)

上篇鏈接&#xff1a; CSDN-讀書網https://mp.csdn.net/mp_blog/creation/editor/139306808 可以看見基本的全部信息&#xff1a;如(author、bookname、link.....) 寫下代碼如下&#xff1a; import requests from bs4 import BeautifulSoup from lxml import etreeheaders{…

scottplot5 中 使用signalXY圖,如何更新數據?

&#x1f3c6;本文收錄于《CSDN問答解答》專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&…

總部下達任務時,如何保證員工的執行力?

執行力是個體基于戰略目標&#xff0c;有效整合利用資源&#xff0c;保質保量完成預定目標的操作能力&#xff0c;員工執行力的高低是企業完成效益、成果轉化的關鍵。執行力包含完成任務的意愿、完成能力、完成程度三個維度&#xff0c;其中意愿是基礎和出發點&#xff0c;能力…