Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建

46.函数作为值三


package cn . itbaizhan . chapter03
// 函数作为值,函数也是个对象
object FunctionToTypeValue {
def main ( args : Array [ String ]): Unit = {
//Student stu = new Student()
/*val a = ()=>{"GTJin"}
// 输出对象的地址
//cn.itbaizhan.chapter03.FunctionToTypeValue$$
Lambda1/495053715@3f0ee7cb
println(a)*/
// 完整写法
def funcA (): String = {
println ( "funcA 被执行了。。。 " )
"GTJin"
}
73
/*println("--------before val x = funcA()--
--------")
// 执行下一行代码,输出: funcA 被执行了。。。 表示将
函数 funcA 的结果赋值给了 x ,并不是将 funcA 作为对象赋值给 x
val x = funcA()
println(x)
println("--------after val x = funcA()-----
-----")*/
// 如果想将 funcA 函数作为对象赋值给 x ,那么该如何实
现?
// 使用 " 函数名 + 空格 + _", 将函数作为对象赋值给
x ,在赋值的过程中不会函数体中的代码
val x = funcA _
// 写下 x 后提示框显示 "x ()=>String", 表示 x 是一
个无参返回值类型为 String 的函数
// 万物皆对象,是对象就应该有对应的类型,所以函数也
有对象的类型
//Function0[String] Function0 表示 0 个参数的函
数对象 [String] 表示函数的返回值类型为 String
//Function1[-T1,+R] 表示 1 个参数的函数对象 [] 里
面最后的 +R 表示返回值类型为, -T1 参数类型
//Function2[-T1,-T2,+R] 表示 2 个参数的函数对象

\] 里面最后的 +R 表示返回值类型, -T1 第一参数类型 -T2 第二 个参数类型 //... Function22 将函数作为对象赋值时,参数声明 的个数最多 22 个,对应 Function22 // 函数独立定义和使用时,声明参数的个数时没有限制 的。、 //22 在 Scala 语言中是一个神奇的数字,官方没有明确说 明,后续还会在其它地方见到 Tuple22 val f1 : Function0 \[ String \] = funcA _ println ( x == f1 ) //false 相当于创建了两个函数对象 74 def funcB ( name : String ): String = { "funcB....name=" + name } // 函数类型还有另外一种表示方式: ( 参数类型 )=\> 返回值 类型 ,多个参数之间使用逗号隔开 //val f2:Function1\[String,String\] = funcB _ val f2 :( String ) =\> String = funcB _ // 如果函数只有一个参数小括号可以省略 val f2_1 : String =\> String = funcB _ def funcC ( name : String , age : Int ): String = { s "name=${name},age=${age}" } // 两个或两个以上参数时,小括号不能省略 val f3 :( String , Int ) =\> String = funcC _ //val f3_1:String,Int=\>String = funcC _ // 错误的 /\*\*val x = funcA _ 为什么在函数名后 使用下滑线让 函数作为对象使用,因为代码中没有明确的变量 \* 类型,所以需要通过取值类型进行推断。 \* 如果变量声明时的类型为函数类型,那么可以不适用下 划线让函数作为对象 \* \*/ val f4 :( String ) =\> String = funcB val f5 :( String , Int ) =\> String = funcC } } ### 47.函数作为值四 ![](https://i-blog.csdnimg.cn/direct/2c88980a27c3488897996cec452d052b.png) **实时效果反馈** **1.** **关于** **Scala** **函数作为值的描述,错误的是:** A 函数类型表示方式: ( 参数类型 ) =\> 返回类型 注:多个参数 的话之间逗号隔开。 B 如果在声明时并没有指定具体的函数类型,那么下划线不能 省略。 C 如果变量声明的类型为函数类型,那么可以不使用下划线让 函数作为对象。 D 将函数作为对象赋值时,参数声明的个数没有限制。 **答案:** 1=\>D 将函数作为对象赋值时,参数声明的个数最多 22 个,对 应 Function22 。 ### 48.函数作为参数_无参无返回值 ![](https://i-blog.csdnimg.cn/direct/319004187b3740fb98657a78d932444e.png) object FunctionToTypeArgXx { def main ( args : Array \[ String \]): Unit = { def funcA ( x : Int , y : Int , 函数 ): Unit = { val result = 函数 ( x , y ) println ( result ) } funcA ( 1 , 2 , 求和函数 ) funcA ( 1 , 2 , 求差函数 ) } } 76 代码拆解分析演示: package com . itbaizhan . chapter03 // 函数作为参数 object FunctionToTypeArg1 { def main ( args : Array \[ String \]): Unit = { //TODO 1 无参无返回值 /\*\*public void method(Student stu){} \* public void method( 参数类型 参数名称 ){} \* Scala 同理,让函数作为参数 \* fun:()=\>Unit 表示参数是一个函数对象,这个函数 是一个无参无返回值的函数 \* () 表示是一个无参的函数 \* Unit 表示是一个无返回值的函数 \*/ def funcA ( fun :() =\> Unit ): Unit = { // 调用传递过来的函数 fun () } def funcObjA (): Unit = { println ( "funcObjA 被调用 " ) } //funcA(funcObjA _) // 下划线可以省略 应该在函数 funcA 声明的时候定义了 参数的函数类型 无参无返回值的类型 //funcA(funcObjA) // TODO 2 有参数以后返回值 /\*\*fun:(Int,Int)=\>Int) 表示 funcB 的参数为一个函 数 \* (Int,Int) 这个函数是一个有两个参数的函数,这两 个参数都是 Int 类型 \* Int 表示这个函数的返回值是一个 Int 类型 77 \* @param fun \*/ def funcB ( fun :( Int , Int ) =\> Int ): Unit = { // 该设计缺陷是 fun(2,1) 写死的参数值 val result = fun ( 2 , 1 ) println ( result ) } // 定义一个函数 def funcObjB1 ( x : Int , y : Int ): Int = { x + y } //funcB(funcObjA) // 错误的,因为 funcObjA 参数和 返回值类型 与 funcB 要求的参数类型不匹配 funcB ( funcObjB1 ) //3 def funcObjB2 ( x : Int , y : Int ): Int = { x - y } funcB ( funcObjB2 ) //1 def funcObjB3 ( x : Int , y : Int ): Int = { x / y } funcB ( funcObjB3 ) //2 //TODO 3. 省略 作为参数的函数 // 省略关键字、函数名、返回值类型 ; 在将 ": =" 改为 "=\>" funcB (( x : Int , y : Int ) =\> { x / y }) // 继续简化: 函数体只有一行,函数体外的 {} 可以省略 funcB (( x : Int , y : Int ) =\> x / y ) // 参数的类型如果能够推断出来,参数的类型可以省略 78 参数函数简化案例一,一个参数无返回值: funcB (( x , y ) =\> x / y ) // 如果参数只有一个的话,参数列表的小括号可以省略 //funcB(x,y=\> x/y) 错误的 参数 \>=2 话,参数列表的 小括号不可以省略 // 如果参数在使用时,按照声明的顺序只使用一次时,那 么可以使用下划线代替 println ( "------------funcObjBn 不需要定义 ----- ------------" ) funcB (( _ / _ )) //2 继续省略 funcB ( _ / _ ) //2 funcB ( _ - _ ) //1 funcB ( _ \* _ ) //2 funcB ( _ + _ ) //3 } } ### 49.函数作为参数_有参有返回值 一个参数无返回值: funcB (( x , y ) =\> x / y ) // 如果参数只有一个的话,参数列表的小括号可以省略 //funcB(x,y=\> x/y) 错误的 参数 \>=2 话,参数列表的 小括号不可以省略 // 如果参数在使用时,按照声明的顺序只使用一次时,那 么可以使用下划线代替 println ( "------------funcObjBn 不需要定义 ----- ------------" ) funcB (( _ / _ )) //2 继续省略 funcB ( _ / _ ) //2 funcB ( _ - _ ) //1 funcB ( _ \* _ ) //2 funcB ( _ + _ ) //3 } } package com . itbaizhan . chapter03 object FunctionToTypeArg2 { def main ( args : Array \[ String \]): Unit = { def funcA ( fun :( String ) =\> Unit ): Unit = { fun ( "GTJin" ) } def funArg ( name : String ): Unit = { println ( name ) } funcA ( funArg ) // 如果函数 funArg 只是被调用一次,可以进行简化 // 首先省略 def 、函数名、返回值类型 funcA ( ( name : String ) =\> { println ( name ) 79 参数函数简化案例二,两个参数有返回值: }) // 函数体只有一行省略大括号 funcA ( ( name : String ) =\> println ( name ) ) // 参数类型可以推导出来,也可以省略 funcA ( ( name ) =\> println ( name ) ) // 只有一个参数,小括号也可以省略 funcA ( name =\> println ( name ) ) // 还可以继续省略,以后在 spark 的代码中会遇到类似的 用法 funcA ( println ( _ )) // 匿名函数的至简原则的最简化版 本 funcA ( println ) // 该方式调用的不再是匿名函数的简化 版了,而是调用 println 函数 //funcA(funArg) } } ### 50.函数作为参数_有参有返回值简化演示 ![](https://i-blog.csdnimg.cn/direct/678563a3361a405ba237f10f95c0c762.png) package com . itbaizhan . chapter03 object FunctionToTypeArg3 { def main ( args : Array \[ String \]): Unit = { def funcA ( fun :( Double , Double ) =\> Double ): Double = { fun ( 1.0 , 2.0 ) } 80 参数函数简化案例三: def funcB ( x : Double , y : Double ): Double = { x / y } funcA ( funcB ) // 简化函数 funcA ( ( x : Double , y : Double ) =\> { x / y } ) funcA ( ( x , y ) =\> { x / y } ) funcA ( ( x , y ) =\> x / y ) // 顺序使用且只用一次可以简化为下划线 println ( funcA ( _ / _ )) //0.5 // 但是如果不是顺序使用,无法使用下划线简化,比如: 结果为 2 不是 0.5 println ( funcA ( ( x , y ) =\> y / x ) ) } } ![](https://i-blog.csdnimg.cn/direct/240d322251e84e8b8a70f843e81fe699.png) ### 51.函数作为参数_一参无返回值简化演示 package com . itbaizhan . chapter03 81 **3.6.3** **函数作为返回值** // 函数作为参数的常见场景 object FunctionToTypeArg4 { def main ( args : Array \[ String \]): Unit = { def funcA ( x : Int , y : Int , fun :( Int , Int ) =\> Int ): Unit = { val result = fun ( x , y ) println ( result ) } funcA ( 1 , 2 , ( x : Int , y : Int ) =\> x + y ) funcA ( 1 , 2 , ( x , y ) =\> x + y ) funcA ( 1 , 2 , _ + _ ) funcA ( 1 , 2 , _ - _ ) funcA ( 1 , 2 , _ \* _ ) funcA ( 1 , 2 , _ / _ ) } } ### 52.函数作为参数_两参有返回值简化演示 **3.6.3** **函数作为返回值** // 函数作为参数的常见场景 object FunctionToTypeArg4 { def main ( args : Array \[ String \]): Unit = { def funcA ( x : Int , y : Int , fun :( Int , Int ) =\> Int ): Unit = { val result = fun ( x , y ) println ( result ) } funcA ( 1 , 2 , ( x : Int , y : Int ) =\> x + y ) funcA ( 1 , 2 , ( x , y ) =\> x + y ) funcA ( 1 , 2 , _ + _ ) funcA ( 1 , 2 , _ - _ ) funcA ( 1 , 2 , _ \* _ ) funcA ( 1 , 2 , _ / _ ) } } package com . itbaizhan . chapter03 // 函数作为函数的返回值 object FunctionToFunResult { def main ( args : Array \[ String \]): Unit = { //TODO 1. 对比 Java 代码 /\*\*public Student getStudent(){ \* return new Student(); \* } \* 返回的是一个对象,而在 Scala 中函数也是一个对象, 82 为何不直接调用 resultFun()? \* 所以也可以使用一个函数作为另外一个函数的返回值 \*/ def resultFun (): Unit = { println ( "resultFun...." ) } def funcA (): () =\> Unit = { // 写上函数的类型 ()=\>Unit resultFun _ // 返回的是函数对象 } val f1 = funcA _ //f2 就是 resultFun val f2 = f1 () // 调用 f2 f2 () // 简化以上调用 以后的代码中经常遇到 funcA ()() // 上行代码等价于 resultFun(), 那么为何不直接调用 呢? } } ![](https://i-blog.csdnimg.cn/direct/b85a8c01d86c47daa8febd925ee14157.png) ### 53.函数作为参数_案例三 ![](https://i-blog.csdnimg.cn/direct/0927fd6b1ff34b81b0beb2118af54f98.png) ### 54.函数作为返回值一 ![](https://i-blog.csdnimg.cn/direct/665fb6479ecf4453b6f609723f334798.png) ### 55.函数作为返回值二 ![](https://i-blog.csdnimg.cn/direct/777c677adb404cf2b37a5cff9bf9936c.png) package com . itbaizhan . chapter03 object FunctionToFunResult2 { def main ( args : Array \[ String \]): Unit = { //TODO 2. 将函数作为返回值返回,一般应用在将内部的 函数在外部使用 /\*def outer(): ()=\>Unit ={ def inner():Unit={ println("inner.....") } inner _ } outer()()\*/ //TODO 3. 如果层次多了,就比较麻烦了,这种方式不推 荐自定义开发中使用 def outer (): () =\> () =\> Unit = { def mid (): () =\> Unit = { def inner (): Unit = { println ( "inner....." ) } inner _ } mid _ } outer ()()() } } ### 56.闭包 package com . itbaizhan . chapter03 // 闭包 object FunctionClosure { def main ( args : Array \[ String \]): Unit = { def outer ( x : Int ): ( Int ) =\> Int = { def inner ( y : Int ): Int = { x + y } inner _ } //println(outer(2)(3)) val fun = outer ( 2 ) 84 由于在执行 inner 的时候, outer 已经出栈了,所以变量 x 已经不 存在,那么在 inner 中该如何进行计算呢,底层又是如何实现的呢? 反编译:选择 target/classes/com/itbaizhan/chapter03/FunctionClosure-\> 右 键 -\>Decompile Scala to Java val fun2 = fun ( 3 ) println ( fun2 ) } } ![](https://i-blog.csdnimg.cn/direct/59f1f65711b6477d8f13b542fae1515e.png) ![](https://i-blog.csdnimg.cn/direct/b66fa40ebcc6416691302d9d44d6ced6.png) ![](https://i-blog.csdnimg.cn/direct/2eed4a1a1d4b47cd84ad981e564d28bf.png) ### 57.匿名函数 ![](https://i-blog.csdnimg.cn/direct/d23b65ff646c4d2699bd424162f78e33.png) package com . itbaizhan . chapter03 // 匿名函数 object FunctionNoName { def main ( args : Array \[ String \]): Unit = { def funcA ( fun : Int =\> Int ): Int = { fun ( 3 ) } // 使用匿名函数作为参数 println ( funcA (( x : Int ) =\> { x \* 5 })) // 类型可以推导出来所以可以省略 println ( funcA (( x ) =\> { x \* 5 })) // 只有一个参数小括号可以省略 println ( funcA ( x =\> { x \* 5 })) // 函数体只有一行, {} 可以省略 println ( funcA ( x =\> x \* 5 )) // 使用 _ 进行简化 println ( funcA ( _ \* 5 )) // 在 funcA 内部使用 fun(3) 不够灵活,再次进行完善 def funcB ( x : Int , fun : Int =\> Int ): Int = { fun ( x ) } println ( funcB ( 4 , _ \* 2 )) //8 println ( funcB ( 4 , _ + 2 )) //6 } } ### 58.控制抽象 ![](https://i-blog.csdnimg.cn/direct/82c1764768da4916927be9d424306296.png) package com . itbaizhan . chapter03 import scala . util . control . Breaks // 函数控制抽象 object FunctionControlAbstract { def main ( args : Array \[ String \]): Unit = { //TODO 1. 对比匿名函数方式 // 函数类型: ()=\>Unit def funcA ( opt : () =\> Unit ): Unit = { opt () } funcA { () =\> { println ( " 函数控制抽象入门 " ) } } //TODO 2. 函数控制抽象 // 参数类型不完整,在传递参数时也是不完整的;只传递 代码就可以了,不需要完整的声明。 def funcB ( opt : =\> Unit ): Unit = { opt } funcB { println ( " 函数控制抽象入门 " ) } //TODO 3. 可以通过控制抽象设计语法 Breaks . breakable { for ( index \<- 1 to 5 ){ if ( index == 3 ){ Breaks . break () 89 **3.10** **柯里化函数** 柯里化是一个数学家 Curry 的音译。 将无关的参数分离开,提高函数效率。 } println ( "index=" + index ) } } } } ### 59.柯里化函数 ![](https://i-blog.csdnimg.cn/direct/6bb1bdb9b1f24bbeb8618d661cbbecfd.png) 柯里化是一个数学家 Curry 的音译。 将无关的参数分离开,提高函数效率。 } println ( "index=" + index ) } } } } package com . itbaizhan . chapter03 // 柯里化函数 object FunctionCurry { def main ( args : Array \[ String \]): Unit = { def funcA (): Int = { var result : Int = 1 for ( i \<- 1 to 10 ){ result = i Thread . sleep ( 10 ) } result } def funcB (): Int = { var result : Int = 1 for ( i \<- 1 to 20 ){ result = i Thread . sleep ( 10 ) } result 90 运行输出: 用时几乎缩减百分之五十。 } def funcC ( a : Int , b : Int ): Int = { a + b } def funcD ( a : Int )( b : Int ): Int = { a + b } val start1 : Long = System . currentTimeMillis () println ( funcC ( funcA (), funcB ())) val end1 : Long = System . currentTimeMillis () println ( "------------ 未使用柯里化用时 :" + ( end1 - start1 )) val start2 : Long = System . currentTimeMillis () println ( funcD ( funcA ())( funcB ())) val end2 : Long = System . currentTimeMillis () println ( "------------ 使用柯里化用时 :" + ( end2 - start2 )) } } 30 ------------ 未使用柯里化用时 :695 30 ------------ 使用柯里化用时 :328 ### 60.递归函数 ![](https://i-blog.csdnimg.cn/direct/53a907ad3d12455cbd3fcf4b44463ce1.png) package com . itbaizhan . chapter03 // 递归函数 object FunctionRecursion { def main ( args : Array \[ String \]): Unit = { //TODO 1. 递归函数 /\*\* 递归函数:在函数内部调用函数本身 \* 注意: \* 1.scala 中要求递归函数必须明确声明返回值类型 \* 2. 递归函数一定要有跳出的出口 \* 3. 传递的参数之间存在某种关系时才可以设计成递归函 数 \* @param num \* @return \*/ def funcA ( num : Int ): Int = { if ( num == 1 ) // 跳出的出口 num else num \* funcA ( num - 1 ) } print ( funcA ( 5 )) } } ![](https://i-blog.csdnimg.cn/direct/b41aca41f88b4e248acb7cbf807330e3.png) ### 61.尾递归函数(选修) ![](https://i-blog.csdnimg.cn/direct/b88daca8af0a4c949a555266c2c55d7d.png) tail recursion 义译为尾递归,或伪递归。 package com . itbaizhan . chapter03 import scala . annotation . tailrec // 尾 ( 伪 ) 递归函数 object FunctionRecursion2 { def main ( args : Array \[ String \]): Unit = { /\*def funcA(): Unit = {// funcA() println("funcA....") } funcA()\*/ def funcB (): Unit = { println ( "funcB...." ) funcB () } funcB () 93 Scala 中的尾递归被编译器优化为了 while 循环,所以应该理解 成为伪递归。 **3.12** **惰性函数** **(** **选学** **)** 当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我 们首次对此取值,该函数才会执行。这种函数我们称之为惰性函 数。 } } public void main ( final String \[\] args ) { this . funcB$1 (); } private final void funcB$1 () { while ( true ) { . MODULE$ . println ( "funcB...." ); } } ### 62.惰性函数(选修) ![](https://i-blog.csdnimg.cn/direct/ce6c3bd178ac42b1b02e44907b4ea0c2.png) 当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我 们首次对此取值,该函数才会执行。这种函数我们称之为惰性函 数。 } } public void main ( final String \[\] args ) { this . funcB$1 (); } private final void funcB$1 () { while ( true ) { . MODULE$ . println ( "funcB...." ); } } package com . itbaizhan . chapter03 // 惰性函数 object FunctionLazy { def main ( args : Array \[ String \]): Unit = { // 函数结果没有使用,则函数不执行;直到使用结果才执 行。 def funcA (): String = { println ( "funcA 被执行了 ......" ) " 天王盖地虎 " } // 当函数返回值被声明为 lazy 时,函数的执行将被推迟, 直到我们首次对此取值 , 该函数才会被执行。 94 输出结果如下: lazy val password = funcA () println ( "----------------" ) println ( password ) // 首次对此取值 println ( "================" ) } } ---------------- funcA 被执行了 ...... 天王盖地虎 ## 章节4面向对象基础 ### 63.面向对象基础概述 Scala 是一门完全面向对象的语言,摒弃了 Java 中很多不是面向 对象的语法。虽然如此,但其面向对象思想和 Java 的面向对象思想 还是一致的。 // 包声明 package com . itbaizhan . chapter04 // 类定义 class Point ( xc : Int , yc : Int ) { // 属性 var x : Int = xc var y : Int = yc // 方法 def move ( dx : Int , dy : Int ) { x = x + dx y = y + dy 95 面向对象基础包含:包 package 、导入 import 、类、属性、访 问权限、方法、对象、构造方法等。 ![](https://i-blog.csdnimg.cn/direct/f89bcf2a344c431e995345afe640feb2.png) ![](https://i-blog.csdnimg.cn/direct/f82da91991ed46fa8ae0db1d1c0f5e3e.png) ### 64.面向对象基础_包package ![](https://i-blog.csdnimg.cn/direct/d3a11c219576466f8c14510496d67145.png) Scala 中基本的 package 包语法和 Java 完全一致,就是在代码的 最后不加 ";" 。 println ( "x 的坐标点 : " + x ); println ( "y 的坐标点 : " + y ); } } object ObjectAndClass { def main ( args : Array \[ String \]): Unit = { // 实例化对象 val point = new Point ( 10 , 20 ); // 移到一个新的位置 point . move ( 10 , 10 ); } } package com . itbaizhan . chapter04 object PackageDemo { } 96 Java 中 package 包的语法比较单一, Scala 对此进行如下扩展: 1 Scala 中的包和类的物理路径没有关系 2 package 关键字可以嵌套声明使用 3 同一个源码文件中子包可以直接访问父包中的内容,而无需 import //package com.itbaizhan.chapter04 package com package itbaizhan //package chapter04 package chapter05 object PackageDemo { def main ( args : Array \[ String \]): Unit = { println ( "package.." ) } } //package com.itbaizhan.chapter04 package com package itbaizhan { class Person { def showInfo (): Unit = { println ( "showInfo..." ) } } package chapter04 { object PackageDemo { def main ( args : Array \[ String \]): Unit = { new Person (). showInfo () } 97 4 Scala 中 package 也可以看作对象,并声明属性和函数 在 PackageDemo 的 main 方法中可以直接调用 showMe() **实时效果反馈** **1.** **关于** **Scala** **包的描述,错误的是:** A Scala 中基本的 package 包语法和 Java 完全一致,就是在代码 的最后不加 ";" 。 B package 关键字不可以嵌套声明使用。 C Scala 中 package 也可以看作对象,并声明属性和函数。 D 同一个源码文件中子包可以直接访问父包中的内容,而无需 import 。 **答案:** 1=\>B package 关键字可以嵌套声明使用。 ### 65.面向对象基础_类 ![](https://i-blog.csdnimg.cn/direct/dbfe5185a7a14e2ca66bda1324e4f996.png) ![](https://i-blog.csdnimg.cn/direct/adfc2c9c087246f5bd99d021efefa39d.png) ### 66.面向对象基础_java中的导入 ![](https://i-blog.csdnimg.cn/direct/eb6d2f84917d4e2393d68c0ff53a553d.png) ![](https://i-blog.csdnimg.cn/direct/a7ceb02489c245fc9c7505a7b2e82fe6.png) ![](https://i-blog.csdnimg.cn/direct/2af9091136ec4a1a943ba9447177196c.png) ### 67.面向对象基础_Scala中的导入Import一 ![](https://i-blog.csdnimg.cn/direct/cf4faba843554bd88c5de57a26344c03.png) ### 68.面向对象基础_Scala中的导入Import二 //TODO 6.scala 导入类的操作,是以相对路径 ( 当前所在 包的路径 ) 的方式导入的 // 如果想使用绝对路径的方式,需要在包名前添加: _root_. /\* val hashMap = new java.util.HashMap\[Int, String\]() hashMap.put(1,"tuhao") hashMap.put(2,"baifumei") println(hashMap)//{1=tuhao, 2=baifumei}\*/ //println(new java.util.HashMap())//com.itbaizhan.chapter04.j ava.util.HashMap@2ff4f00f //println(new _root_.java.util.HashMap())//{} 表示使用了 jdk 的 HashMap //TODO 7.Scala 中可以给导入的类起别名,简化使用 import java . util .{ ArrayList =\> AList } println ( new AList ()) } } /\*package java{ package util{ class HashMap{ } } }\*/ 103 B **实时效果反馈** **1.** **关于** **Scala Import** **使用的描述,错误的是:** A 星号在 scala 中有特殊的用途,不能使用在 import 语句中, 需要使用 _ 来代替 \* 。 import 导入语句只能用在 package 语句和 class 定义之间。 C Scala 中可以给导入的类起别名,简化使用。 D 可以在一行中导入一个包中的多个类 , 简化代码。 **答案:** 1=\>B import 导入语句可以在任意地方使用 ![](https://i-blog.csdnimg.cn/direct/9b46993f87ab4d1489450334d8a5e6bf.png) ### 69.面向对象基础_属性一 package com . itbaizhan . chapter04 import scala . beans . BeanProperty class Animal { // 属性声明, java 中可以不赋值, scala 中属性必须显示地 初始化 //var name:String // 抛错 // 可以直接赋予一个默认值 //var name:String = " 华南虎 " // 如果希望像 java 一样可以由系统进行初始化,后续手动调 用 setter 赋值,声明时使用 _ 赋值 var name : String = _ // 使用 val 声明的属性,编译器将之编译为私有的属性,并使 用 final 修饰,不可修改, // 所以只提供的 get 方法,而没有提供 set 方法 val age : Int = 30 // 属性声明时如果使用 private 修饰,编译器将该属性对应 的 get 和 set 方法也是编译为私有化的方法 104 **实时效果反馈** **1.** **关于** **Scala** **属性的描述,错误的是:** A var 声明的属性编译器将之编译为类的私有属性,通过提供 getter 和 seter 方法。 B 使用 val 声明的属性,编译器将之编译为私有的属性,并使 用 final 修饰,不可修改。 private var color : String = _ // 通过查看 Animal 类的源码,属性的 get 和 set 方法不符合 bean 规范 // 如果想符合 bean 规范 (id=\>getId,setId) ,需要在属性 声明前加上 @BeanProperty @BeanProperty var kind : String = _ } object ClassField { def main ( args : Array \[ String \]): Unit = { val animal = new Animal () //var 声明的属性编译器将之编译为类的私有属性,通过提 供 getter 和 seter 方法 // 如下方式赋值相当于调用的 animal.setName(" 东北 虎 ") animal . name = " 东北虎 " // 访问类的属性时相当于调用了对象的 get 方法 println ( animal . name ) //val 声明的属性被 final 修饰,并未提供 set 方法,所以 不可改变 //animal.age = 10 } } **实时效果反馈** **1.** **关于** **Scala** **属性的描述,错误的是:** A var 声明的属性编译器将之编译为类的私有属性,通过提供 getter 和 seter 方法。 B 使用 val 声明的属性,编译器将之编译为私有的属性,并使 用 final 修饰,不可修改。 private var color : String = _ // 通过查看 Animal 类的源码,属性的 get 和 set 方法不符合 bean 规范 // 如果想符合 bean 规范 (id=\>getId,setId) ,需要在属性 声明前加上 @BeanProperty @BeanProperty var kind : String = _ } object ClassField { def main ( args : Array \[ String \]): Unit = { val animal = new Animal () //var 声明的属性编译器将之编译为类的私有属性,通过提 供 getter 和 seter 方法 // 如下方式赋值相当于调用的 animal.setName(" 东北 虎 ") animal . name = " 东北虎 " // 访问类的属性时相当于调用了对象的 get 方法 println ( animal . name ) //val 声明的属性被 final 修饰,并未提供 set 方法,所以 不可改变 //animal.age = 10 } } 105 **访问权限** **有效范围** private 当前类中 默认缺省 当前类中、本包 ( 以及当前类所在的当前包中 ) 。 protected 当前类中、本包、当前类的子类中 public 任意位置 **访问权限** **有效范围** private 当前类中 private 【包名】 当前类中、本包的类中(包私有) protected 当前类中、子类中 默认缺省 表示公共的, scala 中没有 public 关键字 C 如果想属性的 set 和 get 方法符合 bean 规范 (id=\>getId,setId) ,需要在属性声明前加上 @BeanProperty 。 D 属性声明时是否使用 private 修饰,编译器对属性编译时都 是做一样的处理 **答案:** 1=\>D 不一样处理,使用 private 修饰的属性的 get 和 set 方法也 会被私有化;不使用 private 修饰的属性的 get 和 set 方法是公共的。 ![](https://i-blog.csdnimg.cn/direct/23e6aecdc2e84613b3b2460ef23b7f86.png) ### 70.面向对象基础_属性二 ![](https://i-blog.csdnimg.cn/direct/7f81e8247ada4fddb73c519b1e95b335.png) ### 71.面向对象基础_访问权限 ![](https://i-blog.csdnimg.cn/direct/c77cda9df0764bfcbc99532fc8cd60e2.png) ![](https://i-blog.csdnimg.cn/direct/fc4596b77e6f443aa50166f84426fce7.png) ![](https://i-blog.csdnimg.cn/direct/9109472e740b43ce900bb392c45b03e6.png) ### 72.面向对象基础_方法 ![](https://i-blog.csdnimg.cn/direct/41db6afc31d84265ad17ec17cb87325f.png) ![](https://i-blog.csdnimg.cn/direct/516e7649148a44789e7bef119cc3f59c.png) ### 73.面向对象基础_对象 ![](https://i-blog.csdnimg.cn/direct/ce86456efb7142dab942c5d428b83c53.png) ### 74.面向对象基础_构造方法 ![](https://i-blog.csdnimg.cn/direct/35217af756304392a0a8bbc4df7edcb2.png) ![](https://i-blog.csdnimg.cn/direct/aa8908290f2747f78bded0290e3ecff8.png) ![](https://i-blog.csdnimg.cn/direct/c9e4226355124383940b451b6ee4f0c6.png) ## 章节5面向对象高级 ### 75.伴生类和伴生对象一 ![](https://i-blog.csdnimg.cn/direct/9810c69b04ac4ba2ba09528832191057.png) ### 76.伴生类和伴生对象二 ![](https://i-blog.csdnimg.cn/direct/1a584ce69ba34f7b8f09fd8899100adc.png) ### 77.伴生类和伴生对象三 ![](https://i-blog.csdnimg.cn/direct/d1364441a1d44faebd00fccc1344a2ca.png) ![](https://i-blog.csdnimg.cn/direct/3871f17541264d22bad64c602d7dc8ce.png) ![](https://i-blog.csdnimg.cn/direct/b6c22ef387ec4a1e8d9b7b29ccf199bd.png) ### 78.抽象类和抽象方法一 ![](https://i-blog.csdnimg.cn/direct/62c64f982c17499899573f017b92db9f.png) ### 79.抽象类和抽象方法二 ![](https://i-blog.csdnimg.cn/direct/dae0a0f983e541ddb5f1a62c6e3383d4.png) ![](https://i-blog.csdnimg.cn/direct/2a8f8c81b90341d694f5ac0b38ed9e67.png) ### 80.抽象属性一 ![](https://i-blog.csdnimg.cn/direct/b8a11c1d71f4400ba5a137e76c9bdfb6.png) ![](https://i-blog.csdnimg.cn/direct/ec74018c16df4cbb9c885dc5f9ed54ef.png) ### 81.抽象属性二 ![](https://i-blog.csdnimg.cn/direct/4c4ed1c3f12349d4906de638039b8950.png) ![](https://i-blog.csdnimg.cn/direct/c0c3607ee21d4a818a739aa22ef252e2.png) ![](https://i-blog.csdnimg.cn/direct/32651ba72fd54bf9bae2a5e3946bdc56.png) ### 82.Trait_Java中的接口 ![](https://i-blog.csdnimg.cn/direct/4c4a6c6b0189480da36d8b6360228183.png) ### ![](https://i-blog.csdnimg.cn/direct/80a3d58ca0934861bce08d55f1517827.png) ### 83.Trait_基本使用一 ![](https://i-blog.csdnimg.cn/direct/56c96fde5a3f45a4a40fcb5b5f0f2b57.png) ![](https://i-blog.csdnimg.cn/direct/63017edc625e47c283f7fb0227fb08b9.png) ### 84.Trait_基本使用二 ![](https://i-blog.csdnimg.cn/direct/8c6456811d02472faef2c97cb880e677.png) ![](https://i-blog.csdnimg.cn/direct/21e6f779cc0340b195dbeb958aaa0bc6.png) ### 85.Trait_作用解耦合 ![](https://i-blog.csdnimg.cn/direct/618a26d20d9c4f0f90cd707ebd87fbe6.png) ![](https://i-blog.csdnimg.cn/direct/2485b0418e9e49118ddd93701faf74ab.png) ### 86.Trait_原理 ![](https://i-blog.csdnimg.cn/direct/8116c25506dc4d85b6b19b45ec46f653.png) ![](https://i-blog.csdnimg.cn/direct/ee5a5cfa9d73460fb959a166bcad3322.png) ![](https://i-blog.csdnimg.cn/direct/b01c6606d94348709893143f5421f314.png) ### 87.Trait_初始化叠加一 ![](https://i-blog.csdnimg.cn/direct/af7ea4d0afec46979f060310f76f88fb.png) ![](https://i-blog.csdnimg.cn/direct/c19dc2deeed7425dba6cd2cf50467d01.png) ### 88.Trait_初始化叠加二 ![](https://i-blog.csdnimg.cn/direct/3f9eb355a2bf4c0aa7df2e0851228819.png) ![](https://i-blog.csdnimg.cn/direct/2eb0bd84e80441b095248a11c700b787.png) ### 89.Trait_功能叠加 ![](https://i-blog.csdnimg.cn/direct/4f059a960c0e47aaa87d579d1926e14c.png) ![](https://i-blog.csdnimg.cn/direct/7ab30208b3e04af880bbb64f2a536589.png) ### 90.Trait_反射一 ![](https://i-blog.csdnimg.cn/direct/a924bce195f84bc2b82c35c38d92015e.png) ![](https://i-blog.csdnimg.cn/direct/162e2bb8176147118eaa333080560aab.png) ### 91.Trait_反射二 ![](https://i-blog.csdnimg.cn/direct/792cd287286c4599b9542d9b40a62866.png) ### 92.多学三招_枚举类 ![](https://i-blog.csdnimg.cn/direct/14e49952f3424435a18e13f08c37f5d8.png) ### 93.多学三招_应用类 ![](https://i-blog.csdnimg.cn/direct/f08e131184444d97a5e603aa31d1afd3.png) ![](https://i-blog.csdnimg.cn/direct/977c19fe092949899c7dd8ed9e2b481e.png) ### 94.多学三招_type定义新类型 package com . itbaizhan . chapter05 object TypeDemo extends App { //TODO 1.scala 源码 // 将 java.lang.String 定义为 String 类 //type String = java.lang.String // 将 java.lang.Class\[T\] 定义为 Class\[T\] 类 //type Class\[T\] = java.lang.Class\[T

// 使用 type 关键字可以定义新的数据数据类型名称,本质上
就是类型的一个别名
type KIntVStrMap = java . util . HashMap [ Int ,
String ]
private val map = new KIntVStrMap ()
map . put ( 1 , "java" ) // 提示 key 为 Int 类型, value 为
String 类型
map . put ( 2 , "scala" )
}

章节6异常

95.JAVA中的异常一

96.Java中的异常二

97.Scala中的异常

章节7集合类

98.集合类概述

99.队列Queue

100.元祖一

101.元祖二

102.Seq_不可变List一

103.Seq_不可变List二

104.Seq_不可变List三

105.Seq_不可变List四

106.Seq_可变ListBuffer一

107.Seq_可变ListBuffer二

108.Seq_可变ListBuffer三

109.Seq_可变List和不可变List转换

110.不可变Set

相关推荐
来自星星的坤2 分钟前
如何在 Postman(测试工具) 中实现 Cookie 持久化并保持同一会话
java·开发语言·spring boot·后端
佟格湾9 分钟前
聊透多线程编程-线程池-6.C# APM(异步编程模型)
开发语言·后端·c#·多线程
xrkhy17 分钟前
面向对象高级(1)
java·开发语言
小镇学者23 分钟前
【js】nvm1.2.2 无法下载 Node.js 15及以下版本
开发语言·javascript·node.js
五行星辰30 分钟前
Spring定时任务修仙指南:从@Scheduled到分布式调度的终极奥义
java·后端·spring
东方窅瞳38 分钟前
Bash语言的哈希表
开发语言·后端·golang
HarrisHaword1 小时前
JAVA 导出 word
java·开发语言·word
PingdiGuo_guo1 小时前
C++指针(四)万字图文详解!
开发语言·c++
s9123601011 小时前
Rust Command无法执行*拓展解决办法
开发语言·后端·rust
pk_xz1234561 小时前
MATLAB编写的机械臂控制仿真程序,它主要实现了对一个二连杆机械臂的运动控制仿真,比较了PID控制和非线性模型预测控制两种方法在机械臂轨迹跟踪任务中的性能
开发语言·matlab