网站需求建设关系书,网站开发技术流程,官方网站建设 在线磐石网络,疯狂影视前序
1、Scala 为纯粹OOP1.1、不支持基本类型#xff1a;一切皆为对象 Byte,Int,... 1.2、不支持静态关键字#xff1a;static1.3、支持类型推断#xff0c;和类型预定#xff0c;动静结合
类
/*关键字#xff1a;class创建对象#xff1a;new内含#xff1a;成员变量…前序
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 sPoint{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)YYYYYprotectedYYYNNprivateYYNNN
// 辅助构造器基于主构造器的重载
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 sStudent{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 blackoverride 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 sStudent{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) ab
}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(sThis 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(sDog $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(sCat $name is crying...)override def jog(): Unit println(sCat $name is jogging...)override def run(): Unit println(sCat $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) 22case 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.{PersonPS,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 (j0){if(array(j)t){array(j1) array(j)}else{break()}j-1}})array(j1) t}}}
}
----------------------- Test.scala END ----------------------------/*【包对象】包中可以包含类、对象、特质...包对象可以包含除了类、对象、特质外还可以包含变量和方法
*/
package cha03{import cha03.util.Constants._import cha03.util.Constants.{DataFormatDF}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)/31// 类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.{AAS,B}
import pack_name.Class
import pack_name.Class.{PI,show}
import pack_name.Class._