目录
一、抽象类与接口
1、接口
接口不能有状态,必须由类对其进行实现后使用
2、抽象类
- 实现了一部分协议的半成品
- 可以有状态,可以有方法实现
- 不能实例化,必须由子类继承后使用
抽象类和接口的共性
- 比较抽象,不能直接实例化
- 有需要子类(实现类)实现的方法
- 父类(接口)变量可以接受子类(实现类)的实例赋值
抽象类和接口的区别
- 抽象类有状态,接口没有状态
- 抽象类有方法实现,接口只能有无状态的默认实现
- 抽象类只能单继承,接口可以多实现
- 抽象类反应本质,接口体现能力
二、继承
Person.kt
abstract class Person(open val age: Int){
abstract fun work()
}
class MaNong(age: Int): Person(age){
override val age: Int
get() = 0
override fun work() {
println("我是码农,我在写代码")
}
}
class Doctor(age: Int): Person(age){
override fun work() {
println("我是医生,我在给病人看病")
}
}
fun main(args: Array<String>) {
val person: Person = MaNong(23)
person.work()
println(person.age)
val person2 : Person = Doctor(24)
person2.work()
println(person2.age)
}
Manager.kt
class Manager: Driver, Writer {
override fun write() {
}
override fun drive() {
}
}
interface Driver{
fun drive()
}
interface Writer{
fun write()
}
class SeniorManager(val driver: Driver, val writer: Writer): Driver by driver, Writer by writer
class CarDriver: Driver {
override fun drive() {
println("开车呢")
}
}
class PPTWriter: Writer {
override fun write() {
println("做PPT呢")
}
}
fun main(args: Array<String>) {
val driver = CarDriver()
val writer = PPTWriter()
val seniorManager = SeniorManager(driver, writer)
seniorManager.drive()
seniorManager.write()
}
二、伴生对象与静态成员
fun main(args: Array<String>) {
val latitude = Latitude.ofDouble(3.0)
val latitude2 = Latitude.ofLatitude(latitude)
println(Latitude.TAG)
}
class Latitude private constructor(val value: Double){
companion object{
@JvmStatic
fun ofDouble(double: Double): Latitude{
return Latitude(double)
}
fun ofLatitude(latitude: Latitude): Latitude{
return Latitude(latitude.value)
}
@JvmField
val TAG: String = "Latitude"
}
}
三、方法重载(overloads)
四、扩展成员(二次加工)
fun main(args: Array<String>) {
println("abc" * 16)
"abc".b = 5
println("abc".b)
}
operator fun String.times(int: Int): String{
val stringBuilder = StringBuilder()
for(i in 0 until int){
stringBuilder.append(this)
}
return stringBuilder.toString()
}
val String.a: String
get() = "abc"
var String.b: Int
set(value) {
}
get() = 5
五、属性代理
class Delegates{
val hello by lazy {
"HelloWorld"
}
val hello2 by X()
var hello3 by X()
}
class X{
private var value: String? = null
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("getValue: $thisRef -> ${property.name}")
return value?: ""
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String){
println("setValue, $thisRef -> ${property.name} = $value")
this.value = value
}
}
fun main(args: Array<String>) {
val delegates = Delegates()
println(delegates.hello)
println(delegates.hello2)
println(delegates.hello3)
delegates.hello3 = "value of hello3"
println(delegates.hello3)
}
六、数据类
七、内部类
open class Outter{
val a: Int = 0
inner class Inner{
val a: Int = 5
fun hello(){
println(this@Outter.a)
}
}
}
interface OnClickListener{
fun onClick()
}
class View{
var onClickListener: OnClickListener? = null
}
fun main(args: Array<String>) {
val inner = Outter().Inner()
val view = View()
view.onClickListener = object : Outter(), OnClickListener{
override fun onClick() {
}
}
}
八、枚举
enum class LogLevel(val id: Int){
VERBOSE(0), DEBUG(1), INFO(2), WARN(3), ERROR(4), ASSERT(5);
fun getTag(): String{
return "$id, $name"
}
override fun toString(): String {
return "$name, $ordinal"
}
}
fun main(args: Array<String>) {
println(LogLevel.DEBUG.ordinal)
LogLevel.values().map(::println)
println(LogLevel.valueOf("ERROR"))
}
class LogLevel2 protected constructor(){
companion object{
val VERBOSE = LogLevel2()
val DEBUG = LogLevel2()
val INFO = LogLevel2()
val WARN = LogLevel2()
val ERROR = LogLevel2()
val ASSERT = LogLevel2()
}
}
九、密封类
sealed class PlayerCmd {
class Play(val url: String, val position: Long = 0): PlayerCmd()
class Seek(val position: Long): PlayerCmd()
object Pause: PlayerCmd()
object Resume: PlayerCmd()
object Stop: PlayerCmd()
}
enum class PlayerState{
IDLE, PAUSE, PLAYING
}