1.方法声明/定义:
首先,在Scala中 方法和函数 是有一定区别的,本文记录方法的一些学习, 区别详见https://blog.youkuaiyun.com/hzp666/article/details/114658510?spm=1001.2014.3001.5501
声明方法:
def methodName1 (p1:Int, p2:Int) : Int = {
val c = a+b
return c
}
ps: 花括号前边的 = 等号可以不用写,系统会自动带上,可以像写Java一样 写完 方法名称 参数 直接写花括号
如果方法没有返回值,则方法后边的 = 也可以省略
eg: //省略方法后边 =
var b =0
def add(c:Int){
b += c
}
add(666)
println(b)
输出:
2.简化版声明:
2.1 最简化版声明:def methodName1 = print("most Lite version method ") //most lite version to create a method
即:#方法中 参数列表可以省略(函数不能省略),
#如果没有设置返回值,则返回类型 也可省略
#如果返回值类型,可以被系统自动推断出来,则返回值类型可以省略
#如果方法没有返回值,则方法后边的 = 也可以省略
#如果只有一行,则方法体的花括号也可以省略 {}
#return 也可以省略,默认返回最后一行, 如果最后一行是 print() 那什么都不返回
可省略 | 不可省略 |
方法中 参数列表可以省略(函数不能省略) | 如果有参数,则参数的类型不可省略 |
如果没有设置返回值,则返回类型 也可省略 | |
如果只有一行,则方法体的花括号也可以省略 {} | |
return 也可以省略,默认返回最后一行, 如果最后一行是 print() 那什么都不返回 |
2.2 如果有 return 语句 则必须设置 返回类型 即:
def methodName1 :Int ={
return 3
}
2.3 如果 方法体中 没有写 return 字符,则默认返回最后一行
eg:
def methodName1 :Int ={
3
}
即:return 可以省略,默认返回最后一行 3
2.4 如果有参数列表,则参数类型 不能省略
def methodName1(a: Int, b:Int) :Int = a+b //返回 a+b 的和
1.2 声明方法时的参数小括号
参数的小括号 如果 方法不需要传参数 则参数小括号可以省掉, 如果省略掉的话,在调用该方法时 是不能带 () 的 ,直接写方法名 即可;
如果声明的方法 中 不需要传参,但是保留了 () , 则在调用时可以 带() ,也可以不带()
eg:
def add :Int={
return 3
}
println(add) //调用方法时候 不要写(), 写了会报错
输出:
ps: 如果声明的方法 中 不需要传参,但是保留了 () , 则在调用时可以 带() ,也可以不带
3.赋值给函数
4.方法转变为函数
使用神奇的下划线 _ ,将方法变为 函数
def changeMethod1 (a:Int, b:Int)={
println("test here")
a+b
}
val mVar = changeMethod1 _
println(mVar(1,2))
5.传名调用
即把方法作为参数,传入另一个方法中
eg:
def getTime()={
print("这是 getTime方法")
System.nanoTime
}
//设置 方法参数列表的一般格式: (参数名 : => 方法返回类型)
def test(f: => Long)={
print("time is "+f)
}
test(getTime())
6.scala中 类似Java的 get/set 方法
eg:
class classTest{
private var privateVar = 0;
def value=privateVar //like java's get method
//like java's set method
def value_=(newValue:Int): Unit ={
if(newValue>0){
privateVar = newValue
}
}
}
val myClassTest = new classTest
//set value
myClassTest.value=3
//get value
println(myClassTest.value)
输出:
7.中缀调用法 infix
当调用一个方法时候 可以直接写成 : 变量 方法名 变量
eg1:
class MyClass{
def add(b:Int): Int ={
var c = b +3;
return c
}}
val clazz = new MyClass
println(clazz add 3) //infix statement
输出:
eg2:
class MyClassTest{
private var age = 0
def increment(addAge :Int){
return age += addAge
}
def curent:Int={age}
def getAge():Int ={
return age
}
}
val classTest = new MyClassTest
classTest increment 5 //infix statement
println("this is current method :", classTest.curent)
println("this is getAge method :", classTest.getAge())
输出: