1、函数的形参列表可以是多个, 如果函数没有形参,调用时 可以不带()
2、形参列表和返回值列表的数据类型可以是值类型
和引用类型
object Details01{
def main(args:Array[String]):Unit={
//形参列表和返回值列表的数据类型可以是值类型和引用类型 val tiger = new Tiger
val tiger2=test01(10,tiger)
println(tiger2.name) // jack
println(tiger.name) // jack
println(tiger.hashCode()+" "+tiger2.hashCode())
}
def test01(n1:Int,tiger:Tiger):Tiger={
println("n1="+n1)
tiger.name="jack"
tiger
}}
class Tiger {
//一个名字属性
var name = ""
}
3、Scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型
,所以 return 关键字可以省略
。
def getSum(n1:Int,n2:Int):Int={
return n1+n2
}
def getSum(n1:Int,n2:Int):Int={
n1+n2 //return关键字可以省略
}
4、因为 Scala 可以自行推断,所以在省略 return 关键字的场合,返回值类型也可以省略
。
def getSum(n1:Int,n2:Int)={
n1+n2
}
5、如果函数明确使用 return 关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回类型 =
,当然如果你什么都不写,即使有 return 返回值仍为()
。
object Details02 {
def main(args: Array[String]): Unit = {
println(getSum2(10, 30)) // ()
}
//如果写了 return ,返回值类型就不能省略
def getSum(n1: Int, n2: Int): Int = {
return n1 + n2
}
//如果返回值这里什么什么都没有写,即表示该函数没有返回值
def getSum2(n1: Int, n2: Int) {
return n1 + n2 //这时 return 无效
}
}
6、如果函数明确声明无返回值(声明 Unit
),那么函数体中即使使用 return 关键字也不会有返回值。
/*
如果函数明确声明无返回值(声明 Unit),
那么函数体中即使使用 return 关键字也不会有返回值
*/
def getSum3(n1: Int, n2: Int): Unit = {
return n1 + n2
}
7、如果明确函数无返回值或不确定返回值类型,那么返回值类型可以省略(或声明为Any)
8、Scala语法中任何的语法结构都可以嵌套其他语法结构(灵活),即:函数中可以再声明/定义函数, 类中可以再声明类 ,方法中可以再声明/定义方法。
object Details03 {
def main(args: Array[String]): Unit = {
def f1(): Unit = {
//ok private final println("f1")
}
println("ok~~")
def sayOk(): Unit = {
// private final sayOk$1 ()
println("main sayOk")
def sayOk(): Unit = {
println("sayok sayok")
}
}
}
def sayOk(): Unit = {
//成员 println("main sayOk")
}
}
private final sayOk$2 ()
9、Scala函数的形参,在声明参数时,直接赋初始值(默认值),这时调用函数时,如果没有指定实参,则会使用默认值。如果指定了实参,则实参会覆盖默认值。
object Details04 {
def main(args: Array[String]): Unit = {
println(sayOk("mary"))
}
//name 形参的默认值 jack
def sayOk(name: String = "jack"): String = {
return name + " ok! "
}
}
10、如果函数存在多个参数,每一个参数都可以设定默认值,那么这个时候,传递的参数到底是覆 盖默认值,还是赋值给没有默认值的参数,就不确定了(默认按照声明顺序[从左到右
])。在这种情况下, 可以采用带名参数
。
object DetailParameter05 {
def main(args: Array[String]): Unit = {
// mysqlCon()
// mysqlCon("127.0.0.1", 7777) //从左到右覆盖
//如果我们希望指定覆盖某个默认值,则使用带名参数即可,比如修改用户名和密码 mysqlCon(user = "tom", pwd = "123")
//f6("v2") // (错误) f6(p2="v2") // (?)
}
def mysqlCon(add: String = "localhost", port: Int = 3306,
user: String = "root", pwd: String = "root"): Unit = {
println("add=" + add)
println("port=" + port)
println("user=" + user)
println("pwd=" + pwd)
}
def f6(p1: String = "v1", p2: String) {
println(p1 + p2);
}
}
11、递归函数未执行之前是无法推断出来结果类型,在使用时必须有明确的返回值类型
。
12、scala函数的形参默认是val的
,因此不能在函数中进行修改。
13、Scala函数支持可变参数
//支持 0 到多个参数
def sum(args: Int*) = {
}
//支持 1 到多个参数
def sum(n1: Int, args: Int*) = {
}
使用时的注意事项:
(1)args 是集合, 通过 for 循环 可以访问到各个值。
(2)案例演示: 编写一个函数 sum ,可以求出 1 到多个 int 的和。
(3)可变参数需要写在形参列表的最后。
object VarParameters {
def main(args: Array[String]): Unit = {
//编写一个函数 sum ,可以求出 1 到多个 int 的和
println(sum(10, 30, 10, 3, 45, 7))
}
def sum(n1: Int, args: Int*): Int = {
println("args.length" + args.length) //遍历
var sum = n1
for (item <- args) {
sum += item
}
sum
}
//可变参数需要放在最后
def sum2(args: Int*, n1: Int): Int = {
//
// 1 // }
}