Kotlin学习笔记(三) 方法(函数) 类 继承

1.方法的定义

        使用fun关键字定义,取自英文function;

fun me():String{ return "" }

       如上:返回值类型为String,大括号为方法体,若函数没有返回值,则返回值使用Unit修饰,可省略不写;

2.类的写法

class Person constructor(
         var name:String,
         var age :Int,
         var sex :String
         )


(1)小括号中跟着的是该类的主构造函数,主构造函数没有可见性修饰,没有注解,可以省略construct;

(2)大括号中没有内容,也可以省略;

(3)若构造函数中的属性全部都有初始化值,则该类会有一个默认的无参构造,属性值为默认值;否则没有无参构造;

(4)对于类初始化是要执行的方法,在大括号init(){}方法中可以写;

class Person constructor(
         var name:String,
         var age :Int,
         var sex :String
         ){
    init {
        println("我出生了")
    }
}

(5)默认的类都是final的,若要被继承,类前用open修饰, open class Person... ...

(6)创建类与java不同的是省略了 new 关键字;

(7)对于数据类,可以用data修饰类,

data class Person(
         var name:String = "小明",
         var age :Int = 0,
         var sex :String = "man"
         )

fun main(args: Array<String>) {
    println(Person())
}
输出为:Person(name=小明, age=0, sex=man)

编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

  • equals() / hashCode()
  • toString() 格式如 "User(name=John, age=42)"
  • componentN() functions 对应于属性,按声明顺序排列
  • copy() 函数

对于data修饰的数据类,有以下限制:

  • 主构造函数至少包含一个参数。

  • 所有的主构造函数的参数必须标识为val 或者 var ;

  • 数据类不可以声明为 abstractopensealed 或者 inner;

在官方文档中有如下一句话: 数据类不能继承其他类 (但是可以实现接口)

open class Person(
         var name:String = "小明",
         var age :Int = 0,
         var sex :String = "man"
         )
data class Child constructor(var weight:Double = 0.0):Person(name = "345")

但该继承也没有报错;

(8)getter/setter方法

class Dog{

    var name:String = "Anny"   //var 声明变量为可变变量
        get() {return field.toUpperCase()}   //fidle代表的是当前的属性字段
        set(value) {field = value}  //可以自定义set方法

    var sex:String = "man"
        get() = field.toUpperCase()
        set                    //默认的set方法

    val Dogger:Double = 0.0  //val 修饰与java中final一样,为不可变量,没有set方法
             
}

(9)抽象类

        与java相同用abstract修饰类,抽象类省略open修饰,默认是非final的可继承;

(10)接口

        与java相同用interface修饰,省略open修饰,默认是非final的可实现;

(11)内部类

       使用inner修饰,inner class

3.继承

(1)由于kotlin中类默认为final的,所以父类要被继承必须声明为open;

(2)继承采用':'标识,属性默认值为父类的属性默认值;

class Child constructor(var weight:Double = 0.0):Person()

fun main(args: Array<String>) {
    println(Child().name)      //在java中为getName(),但在kotlin中可以直接调用属性,默认调用get方法
}
输出为:小明

(3)若要在子类改变默认值,

//从继承处将字段传进来
class Child constructor(var weight:Double = 0.0,name: String = "小李"):Person(name)

猜你喜欢

转载自my.oschina.net/u/3220575/blog/1822736