Kotlin 类和对象

Kotlin 类和对象


Kotlin 和 Java 不同,一个 .java  文件必须以一个类作为顶级元素的,而一个 .kt 文件并不需要以一个类作为顶级元素,一个.kt 中可以存在多个类,多个方法,甚至一个.kt 文件可以全部由方法和属性构成(这就类似于FP编程风格了);

demo.kt

fun foo(param:String):String{
    ... 
}
class User(var name:String,var age:Int){
    ...
}
class address(var city:String,var country:String){
    ...
}

类的创建和调用

类的创建
以下是一个典型的 JavaBean 代码转化为 Kotlin 代码
User.java
public class User {
    private String name;
    private int age;
    private String city;
    public User() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
User.kt
class User(){
    var name:String? = null;
    var age:Int? = null;
    var city:String? = null;
}

对于Kotlin的类,其构造器分为主构造器和次构造器,主构造器只有一个,次构造器可以有多个,如下:
class User(name:String){    //主构造器的参数在类声明中声明
    var name:String? = null;
    var age:Int? = null;
    var city:String? = null;
    init{                 //主构造器
        this.name = name;
    }
    constructor(name:String,age:Int):this(name){  //次构造器,调用主构造器,使用this关键字调用其他构造器
        this.age = age;
    }
    constructor(name:String,age:Int,city:String):this(name,age){  //次构造器,调用上面的构造器
        this.city = city;
    }
}
Kotlin 的类代码不需要提供 get,set 方法,对于其中的属性会自动提供这些方法,如果需要对get,set方法手动添加代码,可以按如下的方式:
class User(name:String){   
     var name:String? = ""
            get()= if (this.name == null) this.name else "no name"
            set(value)= if(value != null || value.toString().length <20) field=value else this.name="";
    
    var age:Int? = null;
    var city:String? = null;
    ....
    
}

由于 Kotlin 中属性的默认提供get,set方法给外部调用,如果要屏蔽set方法,使属性不可为外部访问,可以按如下的方式,注意getter的可访问性和变量声明是一致的,不可修改,而setter的可访问性必须小于或等于变量声明的可访问性:
class User(name:String){    
     var name:String? = ""
        private set;       //屏蔽外部的setter    
}

实际上对于基本的 JavaBean,Kotlin 提供了一种更加简便的语法用于构造类似 JavaBean,如下:
class User(var name:String,var age:Int,var city:String){    //自动提供name,age,city属性的声明和提供一个包含这3个参数的构造器
......
}

类的调用
对于类的调用同Java中,只不过没有new关键字;
var user:User = User("assad",21,"guangzhou");
var user2:User = User(name = "assad",age = 21,city = "Guangzhou");

对应Java静态方法的编写方式

与 Java /C# 不同,在 Kotlin 中类没有静态方法。在大多数情况下,它建议简单地使用包级函数。
如果需要类似 Java、C# 中的静态方法的写法(如需要编写一个单例模式),可以将这些原来 Java 中静态的工厂方法编写到类中的 伴生对象中,使用 companion object 的方法声明一个伴生对象;
如下:
java代码:
class Demo{
        ....
        public static void foo(){
               ....
        }
}
对应的Kotlin代码
class Demo{
        ....
        companion object{
            fun foo(){
                ......
            }
        }
}
//调用  Demo.foo()
//or
class Demo{
        ....
        companion object : Factory{
            fun foo(){
                ......
            }
        }
}
//调用 Demo.Factory.foo();


类和接口的继承

对于 Kotlin 中类对于接口和类的继承,只需要使用 " : " 关键字代替Java中的 "extends","implements" 关键字,同时对于被继承的类添加open关键字,对于覆盖的属性添加  override 关键字即可;
如下接口和类:
interface Man{
    var name:String;
    fun say();
}
open class Person(var name:String,var age:Int):Man{
    override say():String = "Im am Person:$name,$age";
}
class Student(var name:String,var age:Int,id:String):Person{
    override say():String = "Im am Student:$name.$age,$id";
}


数据类

对于用于储存数据的类,类似于纯粹的JavaBean,Kotlin提供了data关键字来进行声明,声明后会自动提供以下的属性反方法成员:
  • equals()
  • hashCode() 
  • toString():格式是 "User(name=John, age=42)",
  • componentN() 函数 按声明顺序对应于所有属性,
  • copy() :深拷贝;
如下:
data class User(var name:String,var age:Int);
//使用示例
fun main(args: Array){
    val user = User("assad",20);
    
    println(user.toString());
    
    val(name,age) = user;
    println("$name,$age");
    
    val copyUser = user.copy();
    val copyUser2 = user.copy(age=18);
}

更多先关知识详见: https://www.kotlincn.net/docs/reference/



你可能感兴趣的:(Kotlin,Kotlin,开发小结)