kotlin学习(3)-面向对象

(1)类的定义

class EmptyClass

fun main(args:Array<String>){
    var ec = EmptyClass() //kotlin创建对象不需要new
    println(ec.toString())//调用类的toString()方法
    println(ec::class) //::表示将class方法传入一个方法中当参数
    println(ec is EmptyClass)//判断类的归属
}

(2)带参类的定义

class Student{
    var name:String
    var score:Int = 60 //Int类型必须有初始化值
    var cls:Int = 3

    constructor(name: String, score: Int, cls: Int){
        this.name = name
        this.score = score
        this.cls = cls
    }

    override fun toString(): String {
        return "Student(name='$name', score=$score, cls=$cls)"
    }

}

fun main(args:Array<String>){
    var student = Student("name",32,34)
    println(student.toString())
}

或者:

class Teacher(name:String,age:Int){
    var mName = name;
    var mAge = age;
    override fun toString(): String {
        return "name = ${mName} and age = ${mAge}"
    }
}

fun main(args:Array<String>){
    var teacher = Teacher("ailian",32)
    println(teacher.toString())
}

还有一种办法可以不创建属性mName/mAge,而是在构造参数前添加var

class Teacher(var name:String, var age:Int){
    override fun toString(): String {
        return "name = ${name} and age = ${age}"
    }
}

fun main(args:Array<String>){

    var teacher = Teacher("ailian",32)
    println(teacher.toString())
}

(3)抽象类

abstract class Animal{//定义一个抽象类
    abstract var name:String//抽象类的属性必须是抽象的
    abstract var age:Int
    abstract fun cry():Boolean//定义抽象方法


    /**
     * 定义一个普通方法、Unit表示无需返回值
     * 默认是final,不可以覆写
     */
    fun smile():Unit{
        "haha..."
    }

    /**
     * 定义一个可以覆写的普通方法
     */
    open fun call():Unit{
        "haha..."
    }
}

class Dog(override var name: String, override var age: Int):Animal(){//override:覆写属性,Cat继承Animal,并实现抽象方法
    override fun cry(): Boolean { //实现方法
        println("${name} is cry...")
        return true
    }

    override fun call() {
        super.call()
        println("${name} is call...")
    }
}

class Pig: Animal() {
    override var name: String = ""
    override var age: Int = 0
    override fun cry(): Boolean {
        println("${name} is cry... age is ${age}")
        return true
    }

}

fun main(args:Array<String>):Unit{
    var pig = Pig()
    pig.name = "Peppa"
    pig.age = 4
    println(pig.cry())

    var dog = Dog("dahuang",3)
    println(dog.call())
    println(dog.cry())
}

(4)接口

/**
 * 定义一个Animal接口
 */
interface Animal {
    var name: String
    var age: Int
    fun cry()
    fun smile() {
        println("I am smile ... ")
    }
}

/**
 * 定义一个Action接口
 */
interface Action {

}

/**
 * 创建一个Pig类并实现Animal和Action接口
 */
class Pig(override var name: String, override var age: Int) : Animal,Action{
    override fun cry() {
        println("${name} is cry ... ")
    }

}

/**
 * 用另一种形式创建一个类Dog并实现Animal和Action接口
 */
class Dog:Animal,Action{
    override var name: String =""
    override var age: Int = 0
    override fun cry() {
        println("${name} is cry ... ")
    }
}

fun main(args:Array<String>):Unit{
    var pig = Pig("Peppa",2)
    println(pig.cry())

    var dog = Dog()
    dog.name = "xiaowang"
    dog.age = 3
    println(dog.cry())
}

(5)内部类

package 类与对象


class Outter{

    val a:Int=0
    //非静态内部类
    inner class Inner{

        val a:Int=5
        fun hello(){
            println([email protected])
        }
    }

    //静态内部类
    class Innera{
        
    }
}
interface OnClickListener{
    fun onClick()
}
class View{
    var onClickListener:OnClickListener?= null
}
fun main(args: Array<String>) {
    val inner=Outter.Innera()

    val view=View()
    view.onClickListener=object :OnClickListener{
        override fun onClick() {

        }
    }
}

(6)伴生对象与静态成员

package 类与对象

class A{
    val ww:String="fadas"
    companion object {
        fun ss(){
            val ss=A.a
        }
        val a:String="sdada"
    }
}

(7)扩展方法

考虑四点:

1.那个类需要扩展  String

2.扩展的方法名 multiply

扫描二维码关注公众号,回复: 2989960 查看本文章

3.是否需要参数 int

4.是否需要返回值 String

package 类与对象


//扩展方法
fun main(args: Array<String>) {
    println("abc".multiply(13))
}

fun String.multiply(int:Int):String{
    val stringBuilder=StringBuilder()
    for (i in 0 until int){
        stringBuilder.append(this)
    }

    return stringBuilder.toString()
}

 (8)属性代理 by关键字

1.val/var 定义的属性名 by 类名

2.类中实现get/set方法

package 类与对象

import kotlin.reflect.KProperty

class Delegates{

    val hello by lazy {
        "hello"
    }

    val hello2 by X()

    var hello3 by X()
}

class X{

    private var value:String?=null
    operator fun getValue(thisRef:Any?,property:KProperty<*>):String{
        return "Hello"
    }

    operator fun setValue(thisRef:Any?,property:KProperty<*>,value:String){
        this.value=value
    }
}

fun main(args: Array<String>) {
    val delegates=Delegates()
    println(delegates.hello)
    println(delegates.hello2)

    println(delegates.hello3)
    delegates.hello3="dsadasdasd"
    println(delegates.hello3)
}

(9)数据类(javaBean)

package 类与对象

data class Country(val id:Int,val name:String)


fun main(args: Array<String>) {
    val china=Country(0,"中国")
    println(china)
    println(china.component1())
    println(china.component2())

    val (id,name)=china
    println(id)
    println(name)


}
(10)枚举类
package 类与对象

enum class LogLevel(val id:Int){
    VERBOSE(0),DEBUG(1),INFO(2),WARN(3),ERROR(4);

    fun getTag():String{
        return "$id,$name"
    }
}



class LogLevel2 protected constructor(){
    companion object {
        val VERBOSE=LogLevel2()
        val DEBUG=LogLevel2()
        val INFO=LogLevel2()
        val WARN=LogLevel2()
        val ERROR=LogLevel2()

    }
}

 (11)密封类

package 类与对象

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()
}

猜你喜欢

转载自blog.csdn.net/pgg_cold/article/details/82151884