目录
1.类定义
class MainActivity : AppCompatActivity() {
...
}
MainActivity是当前类的名称,AppCompatActivity是该类继承的父类。
我们可以看到,这就是我们新建的Activity类的写法。
2.方法定义
方法定义有如下几种定义方式,我们可以依据示例来看一下。
<1>常规写法定义方法
fun sum(a:Int,b:Int):Int{
return a+b;
}
a,b是Int类型的入参,方法的返回值也是Int类型。在方法体最后我们要编写return语句返回返回值。
<2>表达式作为函数体定义方法(其一)
fun sum(a:Int,b:Int) = a + b
与上面的方法含义是一致的,但并没有指明返回类型,由系统自动判断。
<3>表达式作为函数体定义方法(其二)
public fun sum(a:Int,b:Int):Int = a + b
同样是表达式作为函数体,但用public修饰符,则必须指明返回类型。
<4>定义无返回值的方法
fun printSum(a:Int,b:Int):Unit{
print(a + b)
}
当然,如果返回Unit类型,则可以省略,public方法也是一样,如下:
public fun printSum(a:Int,b:Int){
print(a + b)
}
<5>可变长参数函数
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
调用时
vars(1,2,3,4,5)
输出:12345
可变长参数这里用vararg进行了修饰,则可传入多个同类型入参。
使用for(vt in v)可进行可变长参数的循环。
<6>lambda表达式
val sumLambda:(Int,Int) -> Int = {x,y -> x+y}
当我们调用sumLambda(1,2)时,返回的结果为3。这里可以理解为,入参类型与形参对应,返回类型与表达式对应。
3.变量与常量
<1>可变变量定义
var <标识符> : <类型> = <初始化值>
<2>不可变变量定义
val <标识符> : <类型> = <初始化值>
不可变变量是只能赋值一次的变量,类似Java中final修饰的变量。
<3>自动类型判断
- 常规写法
val a : Int = 1
- 系统自动推断变量类型为Int
val b = 1
- 如果不在声明变量时赋值,则必须提供变量类型
val c:Int
之后再明确赋值
c = 1
- 声明变量,并由系统自动判断类型
var x = 5
由于是可变变量,所以之后可以修改
x+=1
4.注释
//单行注释
/*多行
注释*/
Kotlin注释允许块注释嵌套
5.字符串模板
$varname 表示一个变量值
${varName.fun()} 表示变量的方法返回值
示例
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a"
s2的值为:a was 1,but now is 2
6.NULL检查机制
<1>声明一个可为空的参数
var age : String? = "23"
此时表示age变量可为空
<2>在使用这种变量时我们要进行空判断处理,一种时像Java一样抛出空异常
val ages = age!!.toInt()
<3>另一种是字段后加?可不做处理返回值为null或配合?:做空判断处理
//不做处理返回null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt()?:-1
<4>如何使用一个返回值可为null的函数
fun parseInt(str:String):Int?{
return str.toIntOrNull()
}
fun printProduct(arg1:String,arg2:String){
val x = parseInt(arg1)
val y = parseInt(arg2)
//由于x,y可为null,所以要进行非空判断
if (x!=null && y != null){
Toast.makeText(this,(x*y).toString(),Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"'$arg1' or '$arg2' is not a number",Toast.LENGTH_SHORT).show();
}
}
当我们调用方法时
printProduct("2","3")
7.类型检测及自动类型转换
我们可以使用is运算符检测一个表达式是否是类型的一个实例,类似于Java中的instanceof关键字。
fun getStringLength(obj:Any):Int?{
if (obj is String){
return obj.length
}
return null
}
或
fun getStringLength(obj:Any):Int?{
if (obj !is String)
return null
return obj.length
}
或
fun getStringLength(obj:Any):Int?{
if (obj is String && obj.length > 0)
return obj.length
return null
}
8.区间
<1>
for (i in 1..4) print(i)
输出1234
<2>
for (i in 4..1) print(i)
什么都不输出
<3>
var i = 2
if(i in 1..10){
Toast.makeText(this,i.toString(),Toast.LENGTH_SHORT).show();
}
等同于1<=i && i<=10
<4>
for(i in 1..4 step 2) Log.i("aaaaaaa",i.toString())
输出13
<5>
for(i in 4 downTo 1 step 2) Log.i("aaaaaaa",i.toString())
输出42
<6>
for(i in 1 until 10){
Log.i("aaaaaa",i.toString())
}
这个其实是i in[1,10), 排除了10。
输出123456789