详解Kotlin中的变量和方法
详解Kotlin中的变量和方法
变量
Kotlin有两个关键字定义变量:var和val,变量的类型在后面。
var定义的是可变变量,变量可以被重复赋值。val定义的是只读变量,相当于java的final变量。
变量的类型,如果可以根据赋值推测,可以省略。
varname:String="jason" name="jame" valmax=10
常量
Java定义常量用关键字staticfinal,Kotlin没有static,可以在命名对象里面用constval定义
objectConfig{ constvalTAG="config" }
或者伴随对象
classConfig{ companionobject{ constvalTAG="config" } }
方法
方法通过fun定义,包含若干参数和返回值(可选)
funlog(msg:String):Unit{ println(msg) }
方法没有返回值用Unit,一般省略不写。
单表达式方法
如果方法只有一个表达式,可以采用“=”的简明写法
funsquare(x:Int)=x*x
顶层方法
Java的方法都在class里面,Kotlin支持顶层方法,这些方法定义在class的外面。
顶层方法一般是一些工具方法,和Java将这些方法勉强放到一个不关联的类不同,单独提供这些方法似乎更合理。
funmain(args:ArrayList){ // } classHello(){ // }
参数
Java不支持默认参数,只能通过重载定义多个方法,Kotlin支持,带默认值的参数放后面。
fundivide(divisor:BigDecimal,scale:Int=0):BigDecimal classStudent2(valname:String,valregistered:Boolean=false,credits:Int=0)
当调用方法时,Kotlin支持命名参数,这有助于提高代码的可读性,尤其是多参数的方法。带名字的参数放后面。
fundeleteFiles(filePattern:String,recursive:Boolean,ignoreCase:Boolean, deleteDirectories:Boolean):Unit { //dosomething } deleteFiles("*.jpg",true,true,false) deleteFiles("*.jpg",recursive=true,ignoreCase=true,deleteDirectories=false)
不定长度参数
例如javapublicvoidprintln(String..args){}可以这样定义不定个数参数的函数。
Kotlin通过关键字vararg实现这个功能,如示例:
funprints(varargstrings:String){ for(stringinstrings) println(string) } prints("a","b","c")
如果已经有一个数组,可以通过关键字*传递数组。
valstrings=arrayOf("a","b","c","d","e") prints(*strings)
返回多个值
要返回多个值,可以返回数组,或者自定义类型。Kotlin内置了Pair和Triple,返回2个值和3个值。
funroots(k:Int):Pair{ require(k>=0) valroot=Math.sqrt(k.toDouble()) returnPair(root,-root) } val(pos,neg)=roots(16)
尾递归函数(Tailrecursivefunction)
当一个函数标记为tailrec,并且满足要求的形式,编译器就会对代码进行优化,消除函数的递归调用,产生一段基于循环实现的,快速而且高效的代码。
tailrecfunfindFixPoint(x:Double=1.0):Double=if(x==Math.cos(x))x elsefindFixPoint(Math.cos(x))
上面的代码计算余弦函数的不动点(fixpoint),结果应该是一个数学上的常数。这个函数只是简单地从1.0开始不断重复地调用Math.cos函数,直到计算结果不再变化为止,计算结果将是0.7390851332151607。
要符合tailrec修饰符的要求,函数必须在它执行的所有操作的最后一步,递归调用它自身。不能将尾递归用在try/catch/finally结构内。尾递归目前只能用在JVM环境内。
函数引用
和C语言的函数指针类似,函数可以赋值给变量,也可以作为高阶函数的参数或者返回值,例如:
valprintMessage={message:String->println(message)} printMessage("hello") printMessage("world")
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!