Scala OOP

前序

1、Scala 为纯粹OOP1.1、不支持基本类型:一切皆为对象 Byte,Int,... 1.2、不支持静态关键字:static1.3、支持类型推断,和类型预定,动静结合

/*关键字:class创建对象:new内含:成员变量和方法区别:1、默认访问修饰符为 public,也支持 private 和 protected2、没有构造方法,通过构造参数列表实现对象创建
*/
// 主构造器
class Point(x:Int,y:Int) {var _x:Int = xvar _y:Int = ydef move(offsetX:Int,offsetY:Int): Unit = {_x += offsetX_y += offsetY}override def toString: String = s"Point{x=${_x},y=${_y}}"
}val p = new Point(0,0)
p.move(15,32)
p.x
p.y
修饰符类(class)伴生对象(object)子类(subclass)同包(package)全局(world)
default(public)YYYYY
protectedYYYNN
privateYYNNN
// 辅助构造器:基于主构造器的重载
class Student(name:String,age:Int) {private var _name:String = nameprivate var _age:Int = age// 辅助构造器def this() = this("Unknown",0)def this(name:String) = this(name,18)def getName:String = _namedef getAge:Int = _agedef setName(name:String):Unit = _name = namedef setAge(age:Int):Unit = _age = ageoverride def toString(): String = s"Student{name=${_name},age=${_age}}"
}val stu1 = new Student("张三", 20)
val stu2 = new Student()
val stu3 = new Student("henry")

继承

/*extends & override
*/
class ColorPoint(x:Int,y:Int,color:Boolean) extends Point(x:Int,y:Int) {var _color:Boolean = colorprivate def getColor = if(_color) "red" else "black"override def move(offsetX: Int, offsetY: Int): Unit = {_x += offsetX*2_y += offsetY*2println(s"$getColor point moved to {${_x},${_y}}")}override def toString: String = s"$getColor point ${super.toString}"
}val cp = new ColorPoint(0,0,true)
println(cp)
cp.move(12,25)
/*red point now at {0,0}red point moved to {24,50}
*/

抽象类

/*abstract & extends & override抽象类中可以有抽象方法(没有方法体的方法即抽象方法)无法实例化使用 abstract 关键字修饰子类重写父类【抽象】方法可以省略 override 关键字,但不推荐省略子类重写父类【非抽象】方法必须写 override 关键字
*/
abstract class Shape {def draw():Unit // 抽象方法
}class Circle extends Shape{override def draw(): Unit = {println("drawing a circle")}
}val shape = new Circle
shape.draw()

单例对象

/*代替 Java 中的 static 关键字1、关键字:object2、可以包含属性和方法,且可以通过单例对象名直接调用3、采取惰性模式,第一次被访问时创建4、无构造器,且不能 new5、程序入口方法必须定义在单例对象中6、同一个文件中同名的类和单例对象形成绑定关系,并称之为伴生类和伴生对象
*/
// 文件名:Student.scala
// 伴生类
class Student(name:String,age:Int) {private var _name:String = nameprivate var _age:Int = agedef this() = this("Unknown",0)def this(name:String) = this(name,18)def getName:String = _namedef getAge:Int = _agedef setName(name:String):Unit = _name = namedef setAge(age:Int):Unit = _age = ageoverride def toString(): String = s"Student{name=${_name},age=${_age}}"
}
// 伴生对象
object Student{var products:Array[String] = Array("BigData","Cloud")def apply(name: String, age: Int): Student = new Student(name, age)def add(a:Int,b:Int) = a+b
}Student.products.foreach(println)
val rst: Int = Student.add(2, 3)
val stu1 = new Student("张三", 20)
// 自动调用 apply 完成 Student 对象构造 
val stu2 = Student("ariel",22)/*
【 练习一 】需求说明假设类Book有属性title和author(多个),books是Book的列表实现Book类,同时使用主构造器与辅助构造器实现Book的伴生对象,使用伴生对象创建Book实例创建books,使用List[Book]初始化5个以上Book实例找出books中书名包含“xxx”的书,并打印书名找出books中作者名以“xxx”打头的书,并打印书名
*/
val list = List(Book("武侠:最强小保安",Array("张三","李四","王五")),Book("都市:上门赘婿",Array("阿强","洞冥福","花花")),Book("武侠:翔龙会",Array("阿庆嫂","黄世仁")),Book("都市:缘起",Array("徐世明","张丘月")),Book("武侠:小李飞刀",Array("王栋","李宏","张明")),
)

特质

/*is a : extendshas a : implements|with关键字:trait & extends & with & override1、包含字段、方法,亦可包含字段和方法的实现2、类、单例对象、普通对象都可以扩展特质3、没有构造器,不能实例化4、单根继承,借助 with 实现多混入
*/
abstract class Animal {val info:String = "动物描述类"val name:Stringdef showMe:Unit = println(s"This is dog $name")def cry():Unit
}trait ByFoot {def jog():Unitdef run():Unit
}class Dog(dogName:String) extends Animal {override val name: String = dogNameoverride def cry(): Unit = println(s"Dog $name is crying...")
}
object Dog{def apply(dogName: String): Dog = new Dog(dogName)
}object Cat extends Animal with ByFoot {override val name: String = "加云"override def cry(): Unit = println(s"Cat $name is crying...")override def jog(): Unit = println(s"Cat $name is jogging...")override def run(): Unit = println(s"Cat $name is running...")
}val xq = Dog("小强")
xq.cry()val jy = Cat
jy.cry()
jy.jog()
jy.run()

动态混入

// 动态强制混入特质:只能定义一个强制混入特质,且必须位于类内首行
// self 是 this 的别名
class Penguin {self:Animal=>						// 强制混入特质语法val brand:String = "企鹅"
}
// 复合类型 Penguin with Animal
val penguin: Penguin with Animal = new Penguin() with Animal {override val name: String = "阿童木"override def cry(): Unit = println(s"$brand $name is crying")
}
penguin.cry()// 动态非强制混入特质 with,支持多混入
class Bear(nickName:String) {val _name:String = nickName
}
val bear: Bear = new Bear("熊大") with Animal with ByFoot {override val name: String = "狗熊"override def cry(): Unit = println(s"$name ${_name} is crying")override def jog(): Unit = println(s"$name ${_name} is jogging")override def run(): Unit = println(s"$name ${_name} is running")
}
bear.cry()
bear.jog()
bear.run()

抽象类 VS 特质

/*一般【优先使用特质】:1、抽象类在于多类公共属性和行为的抽象,重点在于封装思想,本质为类,单继承,不支持多混入2、接口在于一类事物的属性和行为标准定义,重点在于多态思想,支持多混入,动态混入若需要带参构造,只能使用抽象类
*//*
【 练习二 】需求说明现在Book拥有电子版本,可以在多终端上播放属性:作者author:String,书名bookName:String,类型bookType:String内容chapters:Array[String]方法:简介resume():Unit定义Ebook特质方法:play()使Book动态混入Ebook特质,实现play()方法
*/
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 = Book("张三","倚天屠龙记","武侠小说")

内部类

/*Java中内部类是【外部类的成员】:InClass ic = new OutClass.InClass()Scala中内部类是【外部类对象的成员】:val oc = new OutClass();val ic = new oc.InClass();
*/
class OutClass(name:String,age:Int,gender:String,school:String,major:String) {class InnerClass(age:Int,gender:String){private var _age:Int = ageprivate var _gender:String = genderdef getAge = _agedef getGender = _genderdef setAge(age:Int) = _age = agedef setGender(gender:String) = _gender = gender}private val _name:String = nameprivate var _in:InnerClass = new InnerClass(age, gender)var _in2:OutClass.Inner2Class = new OutClass.Inner2Class(school, major)def setAge(age:Int) = _in.setAge(age)def setGender(gender:String) = _in.setGender(gender)def setIn(in:InnerClass) = _in = indef setIn2(in2:OutClass.Inner2Class) = _in2 = in2override def toString: String = s"${_name},${_in.getAge},${_in.getGender},${_in2._school},${_in2._major}"
}
object OutClass{class Inner2Class(school:String,major:String){val _school:String = schoolval _major:String = major}
}val oc = new OutClass("henry",22,"male","南邮","通信")oc.setAge(33)
oc.setGender("female")val in = new oc.InnerClass(30, "female") // 外部类对象.内部类(...)
oc.setIn(in)
val in2 = new OutClass.Inner2Class("南信大","人工智能")
oc.setIn2(in2)

样例类

/*描述【不可变值】的对象样例类构造参数默认声明为 val,自动生成 getter样例类的构造参数若声明为 var,自动生成 getter & setter样例类自动生成伴生对象样例类自动实现的其他方法:toString,copy,equals,hashCode样例类伴生对象实现的方法:apply, unapply(用于模式匹配)
*/
// 普通类的模式匹配案例
case class Student(name:String, age:Int)	// 构造参数默认 val
case class Point(var x:Int,var y:Int)		// var 需要显式声明val obj:Any = Student("henry",18)
val info = obj match {case Student(_,22) => "22"case Student(name,_) if name.startsWith("张") => "姓张"case Point(a,_) => s"$a" // 报错 cannot resolve symbol
}// 追加伴生对象并实现 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))
}

枚举

/*单例对象通过继承 Enumeration 实现枚举创建,简单易用,但不可扩展通常用于定义一个有限取值范围的常量
*/
object WeekDay extends Enumeration {val MON = Value(0)val TUE = Value(1)val WEN = Value(2)val THU = Value(3)val FRI = Value(4)val SAT = Value(5)val SUN = Value(6)
}
val wd = WeekDay.WEN
val info = wd match {case WeekDay.MON => "星期一"case WeekDay.TUE => "星期二"case WeekDay.WEN => "星期三"case _ => "不需要"
}

泛型

/*类型参数化,主要用于集合不同于 Java 泛型被定义在 [] 中*/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	泛型为某个类型的父类
*/
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] = ...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] = .../*型变:多态协变:[+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"))

包与包对象

/*【包】包命名规则:字母、数字、下划线、点,不能以数字开头,在【一个类文件中可以定义多个并列的包】导包的不同方式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.mzph.cn/news/828373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理IP干货:如何正确使用防范风险?

在今天的数字时代&#xff0c;代理IP地址已成为互联网世界中不可或缺的一部分。无论您是寻求绕过地理限制、保护个人隐私还是执行网络任务&#xff0c;代理IP地址都发挥着关键作用。我们将为您探讨代理IP地址的重要性以及如何防范潜在的风险和威胁。 一、代理IP地址的潜在风险 …

STM32H7独立看门狗 (IWDG)的应用方法介绍

目录 概述 1 认识独立看门狗 (IWDG) 1.1 定义独立看门狗 (IWDG) 1.2 IWDG 主要特性 2 IWDG 功能说明 2.1 IWDG 框图 2.2 IWDG 内部信号 2.3 窗口选项 2.3.1 Enable WIN IWDG 2.3.2 Disable WIN IWDG 2.4 硬件看门狗 2.5 低功耗冻结 2.6 停止和待机模式下的行为 …

网工学习云计算HCIE感受如何?

作为一名网工&#xff0c;我经常会在各种网络论坛里查询搜索一些网络技术资料&#xff0c;以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障&#xff0c;因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号&#xff0c;自从关注了誉天的…

实现像 creat-astro 一样在终端中实现动态输出内容

新工具&#xff0c;可以动态输出一些文字&#xff0c;支持盒子输出、动物输出、emoji输出等&#xff0c;也可以完全自定义 可以参考地址&#xff1a;https://github.com/winchesHe/dynamic-log 演示&#xff1a;

谈谈对“数字化转型”的本质认知

我之前在多家咨询公司与软件公司做过多个大型企业数字化项目&#xff0c;也在甲方企业推动数字化转型&#xff0c;做出了数字化最佳实践案例。 下面我想从一个客观角度来真正意义上的描述数字化及数字化转型。 我相信这篇文章能给做数字化的你们带来极大的收获&#xff0c;我…

了解血糖对身体的危害,掌握三个关键数值,预防并发症。

糖尿病患者的血糖控制至关重要&#xff0c;因为长期的血糖异常会对身体造成各种损害&#xff0c;甚至引发严重的并发症。记住这三个数值。 第一个就是空腹血糖&#xff0c;大于13.9&#xff0c;就会有大量的脂肪分解成酮体&#xff0c;酮体在体内积累过多&#xff0c;可能引发酮…

第55篇:创建Nios II工程之Hello_World<一>

Q&#xff1a;本期我们开始介绍创建Platform Designer系统&#xff0c;并设计基于Nios II Processor的Hello_world工程。 A&#xff1a;设计流程和实验原理&#xff1a;需要用到的IP组件有Clock Source、Nios II Processor、On-Chip Memory、JTAG UART和System ID外设。Nios I…

内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题

内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题 内网穿透下的地址冲突https 登录管理后台总结 同步发布在个人笔记内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题 笔记记录解决两个 wordpress 相关问题 如果我们使用内网穿透把本地的 wordpre…

机器学习理论基础—支持向量机的推导(一)

机器学习理论基础—支持向量机的推导 算法原理 SVM:从几何角度&#xff0c;对于线性可分数据集&#xff0c;支持向量机就是找距离正负样本都最远的超平面&#xff0c;相比于感知机&#xff0c;其解是唯一的&#xff0c;且不偏不倚&#xff0c;泛化性能更好。 超平面 n维空间…

百篇博客 · 千里之行

时光荏苒流逝&#xff0c;白驹匆匆过隙&#xff0c;不知不觉间&#xff0c;Damon小智已经在CSDN上记录了第一百多篇文章。恰逢128天创作纪念日的此刻&#xff0c;我感慨良多&#xff0c;这百余篇博客不仅是我的创作历程&#xff0c;更见证了我在这五年技术生涯中走过心路历程。…

算法学习001-圆桌问题 中小学算法思维学习 信奥算法解析 c++实现

目录 算法学习001-圆桌问题 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 算法学习001-圆桌问题 一、题目要求 1、编程实现 圆桌边围坐着2n个人&#xff0c;其中n个人是好人&#xff0c…

启明云端新品WT99C262-SG LoRa开发板,搭配WT32-ETH0X实现LoRa/WiFi/蓝牙转以太网

WT99C262-SG系列开发板是启明云端推出的一款基于WTLRC262-SG系列模组的开发板。板上搭载的模组支持Wi-FiBLELoRa功能&#xff0c;且模组大部分管脚均已引出至两侧排针&#xff0c;开发人员可根据实际需求&#xff0c;通过跳线连接多种外围设备&#xff0c;也可将开发板插在面包…

第27天:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

第二十七天 一、TP框架-开发-路由访问&数据库&文件上传&MVC模型 1.TP框架-开发-配置架构&路由&MVC模型 参考&#xff1a;https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用路由访问-URL访问数据库操作-应用对象文件上传操作-应用对象前端页…

web-traffic-generator:一款功能强大的HTTP和HTTPs流量混淆工具

关于web-traffic-generator web-traffic-generator是一款功能强大的HTTP和HTTPs流量混淆工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员在HTTP或HTTPs网络流量中提添加噪声&#xff0c;以此来实现流量混淆的目的。 本质上来说&#xff0c;web-traff…

Linux编译和NXP官方系统移植

文章目录 一、Linux安装环境配置二、Linux编译流程三、单个.dtb文件编译方法1.修改顶层makefile2.编译设备树文件3.验证 四、NXP官方Linux系统移植1.将NXP官方Linux系统导入到Ubuntu系统中2.解压系统3.编译系统4.验证5.在NXP官方系统中添加自己的板子 五、 CPU 主频和网络驱动修…

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

对浅拷贝的理解

问题背景 我之前一直以为浅拷贝出来的新对象和旧对象的引用地址是相同的&#xff0c;但是通过Object和发现浅拷贝的新对象和旧对象的引用地址不同&#xff01;&#xff01; const obj1 { name: "Alice", test: { age: 12 } };const obj4 Object.assign({}, obj1);…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言 这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的&#xff0c;当然自己也是才开始学习的vue&#xff0c;在学到这个Vue的自定义事件的时候&#xff0c;虽然知识点很绕&#xff0c;但是在理解后又觉得很意思&#xff0c;觉得Vue真的很强大。这里博主将自己学习到的…

解释PostgreSQL中的MVCC(多版本并发控制)机制是如何工作的?

文章目录 MVCC的工作原理1. 数据行版本化2. 事务ID和可见性3. 清理旧版本 解决方案&#xff1a;MVCC的优势1. 高并发性2. 避免锁竞争3. 一致性视图 示例代码 PostgreSQL中的MVCC&#xff08;多版本并发控制&#xff09;机制是一种在数据库管理系统中实现事务隔离级别的方法&…