Kotlin学习快速入门(3)——类 继承 接口 (2)

如果要在get和set引用当前的字段(属性值),得使用filed关键字代替内容

class Student() { var name: String = "" //如果当前的name为"",则返回小红作为姓名 //这里的filed就是name,类型也与name一样 get() { return if(field.length==0) "小红" else field } var age: Int = 0 constructor(name: String) : this() { this.name = name } constructor(name: String, age: Int) : this(){ this.name = name this.age = age } }

setter方法与之前的getter方法一样,里面也是使用field代替当前的数值,只不过setter有一个参数,默认为value,可以修改名字

set(value){ filed = vaule } 嵌套类和内部类

嵌套类和内部类的区别是,嵌套类无法引用外层类的属性和方法,而内部类可以

//Nested为嵌套类 class Outer { private val bar: Int = 1 class Nested { //这里因为是嵌套类,无法引用Outer中的bar fun foo() = 2 } } val demo = Outer.Nested().foo() // == 2

内部类,使用inner关键字

class Outer { private val bar: Int = 1 inner class Inner { //这里可以引用bar fun foo() = bar } } val demo = Outer().Inner().foo() // == 1 继承和接口 继承

kotlin所有的类都是继承于Any,注意,Any 并不是 java.lang.Object

kotlin中的类默认是不可继承的,需要有open关键字修饰类,需要在子类复写的方法,也得在父类用open修饰该方法

open class Person{ var name: String = "" var age: Int =0 constructor(){} constructor(name: String, age: Int){ this.name = name this.age = age } open fun hello() { println("hello this is person") } } class Student: Person { constructor() : super(){} constructor(name: String,age: Int) :super(name,age){} override fun hello() { println("hello this is student") } } 接口

接口的实现也是使用:,声明接口也是interface关键字,注意,kotlin中的接口方法可以实现

interface Print { fun print() fun say(){ println("sayhello") } }

Student类继承Person并实现Print接口:

class Student: Person,Print { override fun print() { //复写接口里的方法 } constructor(name: String,age: Int) :super(name,age){} override fun hello() { } } 数据类 介绍

kotlin提供了一个数据类,专门类存放数据,使用关键字data修饰类

官方的关于数据类的规范:

主构造函数需要至少有一个参数;

主构造函数的所有参数需要标记为 val 或 var;

数据类不能是抽象、开放、密封或者内部的;

(在1.1之前)数据类只能实现接口。

数据类主要有下面两种特点:

自动解析

直接复制

数据类定义 data class Person(var name: String,var age: Int){ } 自动解析

自动解析有顺序,根据类中属性的属性

val person = Person("star",19) //val括号里可以根据需要选择不同参数,注意顺序,不能跳过一个不需要的属性 val(name,age) = person println("$name, $age years of age") // 输出 "star, 19 years of age" 复制 val person = Person("star",19) val person1 = person.copy() //复制并修改部分属性 val person2 = person.copy(age =23) 总结

个人觉得,如果某个类只有一个构造方法,可以定义类只含有一个主构造方法即可,使用那个最简洁的方式。

如果需要有不同参数的构造方法(或者是Java Bean),则使用次级构造方法

如果是用来当做数据类,则使用数据类定义

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppdsj.html