当前位置: 首页 > news >正文

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$$
$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

相关文章:

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

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值&#xff0c;函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…...

Chromium 132 编译指南 Windows 篇 - 配置核心环境变量 (三)

1. 引言 在之前的 Chromium 编译指南系列文章中&#xff0c;我们已经完成了编译前的准备工作以及 depot_tools 工具的安装与配置。本篇我们将聚焦于 Chromium 编译过程中至关重要的环境变量设置&#xff0c;这些配置是您顺利进行 Chromium 构建的基石。 2. 启用本地编译&…...

开源文件存储分享平台Seafile部署与应用

Seafile 是一款开源的企业云盘,注重可靠性和性能,支持全平台客户端。Seafile 内置协同文档 SeaDoc ,让协作撰写、管理和发布文档更便捷。适用于团队协作、文件存储和同步的开源解决方案,它提供了可靠、安全和易用的云存储服务。主要有以下特点: 文件存储和同步:Seafile 允…...

MYSQL-创建数据库 CREATE DATABASE (十一)

13.1.11 CREATE DATABASE 语句 -- 创建 数据库的 CREATE 权限 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name[create_option] ...create_option: [DEFAULT] {CHARACTER SET [] charset_name| COLLATE [] collation_name } -- 删除 数据库具有 DROP 权限 DROP {DATABASE…...

Java高频面试之SE-11

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中是引用传递还是值传递&#xff1f; 在 Java 中&#xff0c;方法参数传递是通过 值传递 的方式实现的&#xff0c;但这可能会引起一…...

C#结构体,枚举,泛型,事件,委托--10

目录 一.结构体 二.特殊的结构体(ref struct): 三.枚举 四.泛型 泛型的使用: 1.泛型类:定义一个泛型类,使用类型参数T 2.泛型方法:在方法定义中使用类型参数 3.泛型接口 五.委托及泛型委托 委托 泛型委托 六.事件 事件: 泛型事件:使用泛型委托&#xff08;如Event…...

MapReduce完整工作流程

1、mapreduce工作流程(终极版) 0. 任务提交 1. 拆-split逻辑切片--任务切分。 FileInputFormat--split切片计算工具 FileSplit--单个计算任务的数据范围。 2. 获得split信息和个数。 MapTask阶段 1. 读取split范围内的数据。k(偏移量)-v(行数据) 关键API&#xff1a;TextI…...

网络编程(1)

网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&#…...

mysql中创建计算字段

目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 &#xff08;1&#xff09;去除空格 &#xff08;2&#xff09;使用别名&#xff1a;AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS&#xff0c;附上示例资料&#xff1a; 百度网盘链接: https://pan.baidu.co…...

【算法】判断一个链表是否为回文结构

问&#xff1a; 给定一个单链表的头节点head&#xff0c;请判断该链表是否为回文结构 例&#xff1a; 1 -> 2 -> 1返回true&#xff1b;1 -> 2 -> 2 -> 1返回true&#xff1b;15 -> 6 -> 15返回true 答&#xff1a; 笔试&#xff1a;初始化一个栈用来…...

计算机网络之---ICMP协议与Ping命令

ICMP 协议 ICMP (Internet Control Message Protocol) 是一种网络层协议&#xff0c;主要用于在 IP 网络中传递控制消息。ICMP 主要用于网络设备之间的故障报告和诊断&#xff0c;帮助设备检测网络连接问题。它是 IP 协议的核心部分之一&#xff0c;用于发送错误消息和操作信息…...

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

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

【Pandas】pandas Series rtruediv

Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...

项目开发版本控制Git流程规范

个人&测试&预发布&生产分支命名 1&#xff09;个人分支&#xff1a; 从sit或者master进行切出&#xff0c;姓名切出分支命名&#xff0c;或者日期切出分支命名 示例&#xff1a;liuys_sit、20250110_sit2&#xff09;测试分支&#xff1a; sit3&#xff09;用户验…...

STM32 : 波特率发生器

波特率发生器 1. 发送器和接收器的波特率 波特率寄存器 (BRR): 在串行通信中&#xff0c;发送器和接收器的波特率是由波特率寄存器&#xff08;BRR&#xff09;中的一个值 DIV 来确定的。 2. 计算公式 计算公式: 详细解释 1. 波特率寄存器 (BRR) BRR: 波特率寄存器是一…...

STM32 USB组合设备 MSC CDC

STM32 USB组合设备 MSC CDC实现 教程 教程请看大佬niu_88 手把手教你使用USB的CDCMSC复合设备&#xff08;基于stm32f407&#xff09; 大佬的教程很好&#xff0c;很详细&#xff0c;我调出来了&#xff0c;代码请见我绑定的资源 注意事项 值得注意的是&#xff1a; 1、 cu…...

继续以“实用”指导Pythonic编码(re通配表达式)(2024年终总结2)

弃现成工具手剥任务&#x1f9d0;&#xff0c;我哈哈滴就像笨笨的傻大个儿&#x1f60b;。 (笔记模板由python脚本于2025年01月12日 23:29:33创建&#xff0c;本篇笔记适合熟悉正则表达式的coder翻阅) 【学习的细节是欢悦的历程】 Python官网&#xff1a;https://www.python.or…...

Flutter使用BorderRadiusTween实现由矩形变成圆形的动画

BorderRadiusTween 是插值动画中&#xff0c;用于组件边框半径的类&#xff0c;专门作用于组件边框和半径动化过度。 这个类继承自Tween&#xff0c;用法相似。 下面是示例写法 class BorderRadiusTweenPage extends StatefulWidget {overrideState<StatefulWidget> c…...

VSCode 中的 launch.json 配置使用

VSCode 中的 launch.json 配置使用 在 VSCode 中&#xff0c;launch.json 文件用于配置调试设置&#xff0c;特别是用来定义如何启动和调试你的应用。它允许你配置不同的调试模式、运行参数和调试选项。 基本结构 launch.json 文件位于 .vscode 文件夹内&#xff0c;可以通过…...

深度学习张量的秩、轴和形状

深度学习张量的秩、轴和形状 秩、轴和形状是在深度学习中我们最关心的张量属性。 秩轴形状 秩、轴和形状是在深度学习中开始使用张量时我们最关心的三个属性。这些概念相互建立&#xff0c;从秩开始&#xff0c;然后是轴&#xff0c;最后构建到形状&#xff0c;所以请注意这…...

Redis有哪些常用应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Redis有哪些常用应用场景&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis有哪些常用应用场景&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 是一个高性能的开源键值对&#xff08;Key-Va…...

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…...

Ubuntu 磁盘修复

Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式&#xff0c;该处理呢&#xff1f; 文件系统内部的错误&#xff0c;如索引错误、元数据损坏等&#xff0c;也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误&#xff0c;可能…...

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…...

通过Apache、Nginx限制直接访问public下的静态文件

一、Apache 在public目录下的.htaccess文件中添加如下规则&#xff0c;来拒绝除了指定文件类型之外的所有请求 <FilesMatch "\.(?!(jpg|jpeg|png|gif|css|js|ico)$)[^.]$">Order Allow,DenyDeny from all </FilesMatch> 上述配置表示仅允许访问.jpg …...

uniapp小程序中隐藏顶部导航栏和指定某页面去掉顶部导航栏小程序

uniappvue3开发小程序过程中隐藏顶部导航栏和指定某页面去掉顶部导航栏方法 在page.json中 "globalStyle": {"navigationStyle":"custom",}, 如果是指定某个页面关闭顶部导航栏&#xff0c;在style中添加"navigationStyle": "cus…...

Agile Scrum 敏捷开发方法

Agile Scrum 是一种敏捷开发方法&#xff0c;广泛用于软件开发以及其他项目管理领域。它强调迭代式的工作流程、团队协作、灵活应对变化和持续改进&#xff0c;旨在通过快速交付和反馈来最大化项目价值。Scrum 是 Agile&#xff08;敏捷&#xff09;方法中的一种具体实践框架&a…...

【算法与数据结构】—— 回文问题

回文问题 目录 1、简介2、经典的回文问题(1) 判断一个字符串是否为回文(2) 给定字符集求构建的最长回文长度(3) 求最长回文子串方法一&#xff1a;中心拓展方法二&#xff1a;Manacher 算法 (4) 求回文子串的数目方法一&#xff1a;中心拓展方法二&#xff1a;Manacher 算法 1、…...

用vscode写latex-1

一般大伙使用 LaTeX 大体有两种方案&#xff0c; 一种是在本地配置环境或使用本地的软件&#xff0c;如 vscode LaTeX&#xff0c;texlive&#xff0c;lyx 等等&#xff1b; 另一种是线上 LaTeX 平台&#xff0c;其中用的最多的是 Overleaf&#xff0c;还有一部分高校也有自…...

爬虫基础之爬取歌曲宝歌曲批量下载

声明&#xff1a;本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…...

本地南京网站建设/交换友情链接的平台有哪些

文章目录1. 20亿个非负数的 int 型整数&#xff0c;确认指定的数 t 是否存在?Java bitSet 实现原理&#xff08;1&#xff09;set 源代码&#xff1a;&#xff08;2&#xff09;get 源码&#xff08;3&#xff09;运用2. 怎么实现 比数大 的 最小的 2 的 n 次方3. 10亿个整数找…...

电器网站建设目的/专业的网站建设公司

简单介绍这是一个精美的主题&#xff0c;正如作者所说&#xff0c;“书写你的篇章”代码书写规范&#xff0c;具体&#xff0c;基础扎实。有良好的书写习惯&#xff0c;注释&#xff0c;布局都不错。主题功能与特点Material Design 风格19 种主色 & 16 种强调色黑暗模式&am…...

建设旅游网站的价值/网站维护一般都是维护什么

近期项目发现&#xff0c;在使用release发布项目包&#xff0c;图片找不到了&#xff0c;而debug下面又有图片。 后来发现&#xff0c;原来图片被另外一个组件嵌入了。 下面例子展示了组件嵌入和不嵌入图片的区别 <?xml version”1.0″ encoding”utf-8″?> <s:Appl…...

娄底网站建设/湖南seo推广服务

首先&#xff0c;我不是刻意去学习Postmessage函数&#xff0c;也不愿意花费很多经历去研究API。但是为了完善自己的知识和体现域学式的学习方法&#xff0c;顺便研究了一下这个函数。 网上有很多关于Postmessage发送消息无效的问题&#xff0c;但是没有人回答。在此我肤浅的解…...

山西武汉网站建设/万物识别扫一扫

研究生考试题目描述欢迎大家参加奇虎360 2016校招在线招聘考试&#xff0c;首先预祝大家都有个好成绩! 我相信参加本次在线招聘考试的有不少研究生同学。我们知道&#xff0c;就计算机相关专业来说&#xff0c;考研有4门科目&#xff0c;分别是政治&#xff08;满分100分&#…...

手把手教你用动易做网站/微信运营工具

晚上调试修复了一个线上的小 BUG&#xff0c; 花了2个小时&#xff0c; 加上昨天花费的时间&#xff0c; 总共大概3个小时。 BUG 是这样的&#xff1a; 一个 API 返回的 JSON 串是一个对象数组 [{field1: xxx, field2: xxx, source_cidr_ip: xxx}, {field1: xxx, field2: xxx,…...