函数
假设我们要写一个简单的函数,这个函数的作用主要是比较输入值的大小,然后返回其中的最大值。
Java:
public int max(int a,int b){
if (a > b) {
return a;
} else {
return b;
}
//或者使用三元运算符 return a > b ? a : b;
}
Kotlin:
//代码块体函数
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
//简化,表达式函数体,省略了函数的返回值类型,并且直接将表达式作为该函数的返回值
fun max(a: Int, b: Int) = if (a > b) a else b
小结:
- kotlin可以省略每行代码结尾的分号
- kotlin函数的声明是以关键字fun开始的
- kotlin语法中,先写参数名然后冒号,后面才是参数类型,这里跟Java的语法是相反的。例如 a:Int
- kotlin中函数还可以简写为表达式函数体,就是直接省略函数的返回类型,然后将函数体的表达式作为函数的返回值,也就是函数的返回值类型就是函数表达式的返回类型,可以这样写的原因是,编译器会分析函数体的表达式,并将它的类型作为函数的返回类型。注意,如果是有返回值的代码块函数,必须显式的写出返回类型和return类型
变量
Java:
String name= “Hello World”;
int age = 12;
double money = 7.5e6;
Kotlin:
//在kotlin中,可以省略变量的类型,编译器会分析初始化器表达式的值,并把它的类型作为变量的类型。
var name = "Hello World"
var age = 12
var money = 7.5e6
//在kotlin中声明的关键字有两个:
val(value):不可变引用,使用val声明的变量不能在初始化之后再次赋值,它对应的是Java的final变量,其实val和final还是有区别的,
val虽然不可变但他不是编译器常量,即编译器在编译期的时候不能确定他的值,如果在kotlin中想定义编译器常量的话则需要加上const关键字
var(variable)可变引用,这种变量的值是可以被改变。这种声明对应的是普通(非final)的Java变量
Java:
String name = "Hello World";
final String name = "Hello World"
Kotlin:
var name = "Hello World"
val name = "Hello World"
字符串模板
与Java相比,Kotlin有一个新特性,叫做字符串模板,Kotlin在字符串面值中想要引用局部变量的时候,只要在变量名称前面加上字符$。
Java:
public static void main(String[] args) {
String name = "Gentleman";
System.out.println("Hello," + name);
}
Kotlin:
fun main(args: Array<String>) {
val name = "Gentleman"
println("Hello,$name")
//当然字符串模板不仅限于简单的变量名称,还可以引用更复杂的表达式,不过使用表达式的时候要用花括号括起来
println("Hello ,${if (args.size > 0) args[0] else "Gentleman"}")
}
类和属性
在Java中类是这样的
public class Student{
private final String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//相同的类,用kotlin来写的话是这样的
class Student(val name:String)
在Java中,我们需要在构造方法中写很多重复的代码,把参数赋值给有着同样名称的字段。而在Kotlin中,这种逻辑不用这么多的样板代码就可以表达了,在Kotlin中把public修饰符去掉了,这是因为在Kotlin中public是默认的可见性,所以可以把它省略掉。
在刚才的例子中,Kotlin中声明的属性时不可变属性,接下来我们来试试可变属性
//在这里name是只读属性:生成一个字段和一个简单的getter,age是可写字段,一个getter和一个setter
class Student(val name: String,var age:Int)
//Student类的实例化和使用
Java:
Student student = new Student("Gentleman",18);
System.out.println("name = "+student.getName()+" age = "+student.getAge());
Kotlin:
//调用构造方法时不需要new关键字
val student = Student("Gentleman",18)
//可以直接访问属性,但调用的是getter
println("name = "+student.name+"age = "+student.age)
自定义访问器
还是以之前的Student,现在我们想知道这个学生是否成年,在kotlin中,不需要一个单独的字段来存储这个信息(是否成年),因为可以随时通过检查学生的年龄来判断
class Student(val name: String,var age:Int){
val isAdult:Boolean
get(){
return age>=18
}
}
//属性isAdult不需要字段来保存它的值,它只有一个自定义实现的getter,它的值是每次访问属性的时候计算出来的
小结:
- kotlin跟Java相比,在类的书写上,省略了Java构造器中的重复模板代码
- kotlin在实例化类的时候可以省略new关键字
- kotlin默认是省略public修饰符的,因为public是kotlin默认的可见性
网友评论