kotlin语法(中)
一.类与对象
Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。
1.1 无构造器的类
//定义一个类 class BaseDataType { // 属性定义 val byteValue:Byte = 127 //get与set, field只在get和set中使用 var lastName: String = "zhang" get() = field.uppercase() // 将变量赋值后转换为大写 private set(value) { field=value+"_set" } //函数定义 fun display(){ println("Byte Value: $byteValue") //创建类实例,没有 new 关键字,与python一样 val selfobj=BaseDataType() selfobj.byteValue; } }
1.2 有构建器的类
//定义一个主构造的类 class BaseDataType constructor(name: String) { //定义二级构造 constructor(name: String, age:Int):this(name) { println("初始化网站名: ${name},创建了:${age}年") } val siteName=name //初始化 init { println("初始化网站名: ${name}") } } val bdt:BaseDataType=BaseDataType("菜鸟教程") //输出:初始化网站名: 菜鸟教程 val bdt2:BaseDataType=BaseDataType("cnblogs", age = 20) //输出:初始化网站名: cnblogs //输出:初始化网站名: cnblogs,创建了:20年
1.3 抽象类
类本身,或类中的部分成员,都可以声明为abstract的。抽象成员在类中不存在具体的实现。
abstract class HumanBase{ //定义抽象函数,返回字符串 abstract fun sayHello():String fun A(){ println("我是父类函数") } } class ChineseHuman:HumanBase() { //重写父类的抽象函数 override fun sayHello():String{ return "kotlin 您好" } } val ch=ChineseHuman() //输出: kotlin 您好 println(ch.sayHello()) //调用父类的函数,输出:我是父类函数 ch.A();
1.4重写抽象类中的函数
在Kotlin中,默认情况下,类中成员是不开放的(即不能被其他类继承或重写),要开放使用open关键字。
注意:无需对抽象类或抽象成员标注open,它们是开放的。
abstract class HumanBase{ //定义抽象函数,返回字符串 abstract fun sayHello():String open fun A(){ println("我是父类函数") } } class ChineseHuman:HumanBase() { //重写父类的抽象函数 override fun sayHello():String{ return "kotlin 您好" } override fun A(){ //调用父类的函数 super.A() println("我是子类函数") } } // 输出:我是父类函数 // 输出:我是子类函数 val ch=ChineseHuman() ch.A();
1.5 嵌套类
class Outer { private val bar: Int = 1 // 嵌套类 class Nested { fun foo() = 2 } } // 调用格式:外部类.嵌套类.嵌套类方法/属性 val demo = Outer.Nested().foo() //输出:2 println(demo)
1.6 类的修饰符
类属性修饰符:abstract--抽象类、final--类不可继承,默认属性、enum--枚举类、open--类可继承,类默认是final的,annotation--注解类
访问权限修饰符:private、protected、public、internal与C#的差不多。
二.继承
2.1 Any超类
Kotlin 中所有类都继承 Any 类,它是所有类的超类, 类似于java中的object类,但注意Any不是 java.lang.Object
Any提供了三个函数:equals()、hashCode()、toString()
2.1 open
如果一个类要被继承,可以使用 open 关键字进行修饰
open class Base(p: Int) // 定义基类 class Derived(p: Int) : Base(p) //子类继承
2.3 override
在子类中使用 override 来重写基类中open修饰的函数。在1.4中有代码示例
override 还可以重写属性,如下所示:
open class Foo { open val x: Int get { …… } } class Bar1 : Foo() { override val x: Int = …… }
2.4 super
上面1.4中也使用到了supper,没有使用supper泛型,如果子类实现了多个继承,可以使用supper泛型,如下所示:
//如果是普通基数(不是抽象类或接口类)需要子类继承,则必须在class前加open open class A { open fun f () { print("A") } fun a() { print("a") } } //接口的成员变量默认是 open 的,与c#\java不一样,接口中可以有函数体 interface B { fun f() { print("B") } fun b() { print("b") } } //继承 class C() : A() , B{ override fun f() { //super 泛型去选择性地调用父类的实现 super<A>.f()//调用 A.f() 输出A super<B>.f()//调用 B.f() 输出B } }
三.接口
3.1 接口格式
使用 interface 关键字定义接口,允许方法有默认实现(这点与java、c#不同),一个类可以实现多个接口
接口中的方法和属性不需要使用open关键字,接口中的方法和属性是开放的
interface MyInterface { fun bar() // 未实现 fun foo() { //已实现 // 可选的方法体 println("foo") } }
3.2 接口中的属性
接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性。
定义属于使用var 可修改的变量,如下所示:
interface MyInterface{ var name:String //name 属性, 抽象的 } class MyImpl:MyInterface{ override var name: String = "runoob" //重写属性 }
3.2 接口中函数重写
interface A { fun foo() { print("A") } // 已实现 fun bar() // 未实现,没有方法体,是抽象的 } class C : A { override fun bar() { print("bar") } // 重写 }
四. kotlin扩展
kotlin可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator (装饰者)模式。
扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。
4.1 扩展函数
class User(var name:String) //扩展函数 fun User.Print(){ println("用户名 $name") } //输出:用户名 hello world var user = User("hello world") user.Print()
五.kotlin数据类和密封类
Kotlin 可以创建一个只包含数据的类,关键字为 data
5.1 数据类
//定义一个数据类 data class User(val name: String, val age: Int) //使用数据类 fun main(args: Array<String>) { val jack = User(name = "Jack", age = 1) val olderJack = jack.copy(age = 2) //输出:User(name=Jack, age=1) println(jack) //输出:User(name=Jack, age=2) println(olderJack) }
5.2 密封类
声明一个密封类,使用 sealed 修饰类。sealed 不能修饰 interface ,abstract class(会报 warning,但是不会出现编译错误)
与C#一样
浙公网安备 33010602011771号