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<String>){
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/