Kotlin知识——类

基础语法

构建一个简单的 Person 类,示例如下:

calss Person(val name: String, var isMarried: Boolean)

此时 Person 类有一个可读属性 name 和一个可写属性 isMarried,在声明属性的时候会自动为其创建访问器(只读属性有一个 getter,可写属性有 getter 和 setter)
当然也可以自定义访问器,示例如下:

calss Rectangle(val height: Int, val width: Int) {
	val isSquare: Boolean
		get() {
			return height == width
		}
}

也可以修改访问器的可见性,示例如下:

class LengthCounter{
	//此时不能在类的外部修改这个属性
	var counter: Int = 0
		private set
	
	fun addWord(word: String){
		counter += word.length
	}
}

构造函数

主构造方法

  • 定义一个包含主构造方法的类的示例如下:
calss Person(val name: String, var isMarried: Boolean)
  • 括号中的即为主构造方法,当然也可以为参数设置默认值,示例如下;
calss Person(val name: String, var isMarried: Boolean = false)
  • 也可以把主构造方法设置为私有,示例如下:
calss Secretive private constructor() {}
  • 主构造方法中不能包含代码语句,因此初始化代码可以放到 init 初始化块中,示例如下:
calss Person(var name: String?){
	init{
		//初始化块中可以使用主构造方法中的参数(name)
		print("my name is $name")
	}
}

注:如果同时包含 init 初始化块和从构造函数,init 初始化块会优于从构造函数执行

从构造方法

calss View{
	constructor(ctx: Context){...}
	
	constructor(ctx: Context, attr: AttributeSet){...}
}

数据类

通过为类添加 data 修饰符可以将其声明为数据类,数据类会自动为我们重写以下所有标准 Java 方法:

  • equals 用来比较实例
  • hashCode 用来作为例如 HashMap 这种基于哈希容器的键
  • toString 用来为类生成按声明顺序排列的所有字段的字符串表达形式
    构造数据类的示例如下:
data calss Person(val name: String, var isMarried: Boolean)

类委托

通过使用 by 关键字可以实现类委托机制:创建一个新类,实现与原始类一样的接口并将原来的类的实例作为一个字段保存,与原始类拥有相同行为的方法不用被修改,只需要转发到原始类的实例。示例如下:
不使用委托机制时,构建一个 Collection 的接口的装饰器,不修改任何行为:

class DelegatingCollection<T>: Collection<T>{
	private val innerList = arrayListOf<T>()

	override val size: Int get() = innerList.size
	override fun empty(): Boolean = innerList.empty()
	override fun contains(element: T): Boolean = innerList.contains(element)
	override fun iterator(): Iterator<T> = innerList.iterator()
	override fun containsAll(elements: Collection<T>): Boolean = innerList.containsAll(elements)
}

在使用类委托机制时其代码如下:

class DelegatingCollection<T>(
	innerList: Collection<T> = ArrayList<T>()
): Collection<T> by innerList {}

创建实例

Kotlin 中调用构造方法不需要 new 关键字,创建一个类的示例如下:

calss Person(val name: String, var isMarried: Boolean)
val person = Person("Bob", true)

类中的访问修饰符

修饰符相关成员评注
final(默认)不能被重写类中成员默认使用
open可以被重写需要明确的表明
abstract必须被重写只能在抽象类中使用;抽象成员不能持有
override重写父类或接口中的成员如果没有使用 final 表明,重写的成员默认是开放的

注:当一个类允许被继承,或者一个方法允许被重写时都需要显示地用 open 修饰符修饰。

可见性修饰符

修饰符类成员顶层声明
public(默认)所有地方可见所有地方可见
internal模块中可见模块中可见
protected子类中可见——
private类中可见文件中可见

注:internal 修饰符在字节码中会变成 public。

内部类

类 A 在另一个类 B 中声明在 Java 中在 Kotlin 中
嵌套类(不储存外部类的引用)static class Aclass A
内部类(储存外部类的引用)class Ainner class A

Kotlin 中内部类引用外部类实例需要使用 this@Outer,示例如下:

class Outer{
	inner class Inner{
		fun getOuterReference(): Outer = this@Outer
	}
}

枚举类

  • 声明一个简单的枚举类:
enum class Color {
	RED, GREEN, BLUE
}
  • 声明一个带属性值的枚举类:
enum class Color(val r: Int, val g: Int, val b: Int) {
	RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);

	//定义一个方法
	fun rgb() = (r * 256 + g) * 256 + b
}
  • 使用 when 来选择正确的枚举值
fun getColor(color: Color) = 
	when (color) {
		Color.RED -> "Richard"
		Color.GREEN -> "Gave"
		Color.BLUE -> "Battle"
	}

注:when 是一个有返回值的表达式。

抽象类

声明一个抽象类的示例如下:

abstract class Animated{
	//抽象函数,必须被子类重写
	abstract fun animate()

	//用 open 修饰可以被重写
	open fun stopAnimating(){}

	//没有被 open 修饰,不可用于重写
	fun animateTwice(){}
}

单例类

使用 object 关键字可以在定义一个类的同事创建一个实例,示例如下:

object Single{
	...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值