工作生活

Kotlin学习笔记(一)

2019-07-25  本文已影响0人  Gentleman_fad4

函数

假设我们要写一个简单的函数,这个函数的作用主要是比较输入值的大小,然后返回其中的最大值。

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

小结:

变量

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,它的值是每次访问属性的时候计算出来的

小结:

上一篇 下一篇

猜你喜欢

热点阅读