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

news2025/1/13 19:46:07

章节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$$
$Lambda$1/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.函数作为值四

实时效果反馈
1. 关于 Scala 函数作为值的描述,错误的是:
A
函数类型表示方式: ( 参数类型 ) => 返回类型 注:多个参数
的话之间逗号隔开。
B
如果在声明时并没有指定具体的函数类型,那么下划线不能
省略。
C
如果变量声明的类型为函数类型,那么可以不使用下划线让
函数作为对象。
D
将函数作为对象赋值时,参数声明的个数没有限制。
答案:
1=>D 将函数作为对象赋值时,参数声明的个数最多 22 个,对
Function22

48.函数作为参数_无参无返回值

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.函数作为参数_有参有返回值简化演示

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
    )
  )
}
}

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(), 那么为何不直接调用
呢?
}
}

53.函数作为参数_案例三

54.函数作为返回值一

55.函数作为返回值二

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 )
}
}

57.匿名函数

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.控制抽象

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.柯里化函数

柯里化是一个数学家 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.递归函数

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 ))
}
}

61.尾递归函数(选修)

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.惰性函数(选修)

当函数返回值被声明为 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 、类、属性、访
问权限、方法、对象、构造方法等。

64.面向对象基础_包package

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.面向对象基础_类

66.面向对象基础_java中的导入

67.面向对象基础_Scala中的导入Import一

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 导入语句可以在任意地方使用

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 方法是公共的。

70.面向对象基础_属性二

71.面向对象基础_访问权限

72.面向对象基础_方法

73.面向对象基础_对象

74.面向对象基础_构造方法

章节5面向对象高级

75.伴生类和伴生对象一

76.伴生类和伴生对象二

77.伴生类和伴生对象三

78.抽象类和抽象方法一

79.抽象类和抽象方法二

80.抽象属性一

81.抽象属性二

82.Trait_Java中的接口

83.Trait_基本使用一

84.Trait_基本使用二

85.Trait_作用解耦合

86.Trait_原理

87.Trait_初始化叠加一

88.Trait_初始化叠加二

89.Trait_功能叠加

90.Trait_反射一

91.Trait_反射二

92.多学三招_枚举类

93.多学三招_应用类

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276115.html

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

相关文章

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…

支付宝租赁小程序提升租赁行业效率与用户体验

内容概要 在当今数字化的世界里&#xff0c;支付宝租赁小程序的出现构建了一种新的租赁模式&#xff0c;使得用户在使用过程中体验更加流畅。想象一下&#xff0c;你在寻找租赁服务时&#xff0c;不再需要繁琐的流程和冗长的等待&#xff0c;只需通过手机轻松点击几下&#xf…

关于使用FastGPT 摸索的QA

近期在通过fastGPT&#xff0c;创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上&#xff0c;可以定义业务逻辑&#xff0c;满足输出对话之外的需求。 在最近3个月来的摸索和实践中&#xff0c;一些基于经验的小问题点&#xff08;自己也常常…

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…

【C语言系列】函数递归

函数递归 一、递归是什么&#xff1f;1.1尾递归 二、递归的限制条件三、递归举例3.1举例一&#xff1a;求n的阶乘3.2举例二&#xff1a;顺序打印一个整数的每一位 四、递归与迭代4.1举例三&#xff1a;求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么&#xff1f; …

springboot 默认的 mysql 驱动版本

本案例以 springboot 3.1.12 版本为例 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> </parent> 点击 spring-…

[QCustomPlot] 交互示例 Interaction Example

本文是官方例子的分析: Interaction Example 推荐笔记: qcustomplot使用教程–基本绘图 推荐笔记: 4.QCustomPlot使用-坐标轴常用属性 官方例子需要用到很多槽函数, 这里先一次性列举, 自行加入到qt的.h中.下面开始从简单的开始一个个分析. void qcustomplot_main_init(void); …

openMetaData docker方式安装部署记录

OpenMetadata一站式元数据管理平台&#xff0c;是一款功能强大的开源元数据管理平台&#xff0c;旨在帮助企业更好地发现、理解和管理其数据资产。它提供了一套全面的工具和功能&#xff0c;涵盖了数据发现、数据血缘、数据质量、数据探查、数据治理和团队协作等多个方面。 那…

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer&#xff08;WebGL渲染器&#xff09; THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…

本地视频进度加入笔记+根据进度快速锁定视频位置

本地视频进度记录快速回溯 引言 在学习的过程中, 如果我们想快速记录当前看视频的位置, 后续回溯查找就会非常方便了。 实现效果 进度记录 通过按下快捷键ctrlaltu&#xff0c; 快速记录当前视频的进度信息,然后复制到typora软件内 快速回溯 在typora软件内, 选中视频索引…

Spring Boot 支持哪些日志框架

Spring Boot 支持多种日志框架&#xff0c;主要包括以下几种&#xff1a; SLF4J (Simple Logging Facade for Java) Logback&#xff08;默认&#xff09;Log4j 2Java Util Logging (JUL) 其中&#xff0c;Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功

Golang的网络流量分配策略

## 1. Golang中的网络流量分配策略 简介 在Golang中&#xff0c;网络流量分配策略是指如何有效地管理和优化网络请求的分配&#xff0c;以提高系统的性能和稳定性。优秀的网络流量分配策略能够使系统更好地应对高并发和大流量的情况&#xff0c;同时有效地避免网络拥堵和性能瓶…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

Android车机DIY开发之软件篇(九)默认应用和服务修改

Android车机DIY开发之软件篇(九)默认应用和服务修改 默认应用位置 ~/packages/apps/Car 增加APP 1.增加 XXXX.app 和Android.mk 2. 修改~/build/make/target/product/handheld_system_ext.mk 默认服务位置 ~/frameworks/base/services/java/com/android/server 查看服务列…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴&#xff08;Event Storming&#xff09;事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

用HTML + CSS实现太极图

目录 一、效果图 二、实现思路 三、完整代码 四、总结 一、效果图 如图所示&#xff0c;太极图一半为黑色&#xff08;代表阴&#xff09;&#xff0c;另一半为白色&#xff08;代表阳&#xff09;。这两部分相互环绕&#xff0c;形成一种流动的、旋转的感觉。 二、实现思…

Apache Hadoop YARN框架概述

一、YARN产生和发展简史 1.1背景 数据、程序、运算资源&#xff08;内存、CPU&#xff09;三者组在一起&#xff0c;才能完成数据的计算处理过程。在单机环境下&#xff0c;三者之间协调配合不是太大问题。为了应对海量数据的处理场景&#xff0c;Hadoop软件出现并提供了分布…