Kotlin------类和对象(二)

get/set方法

声明一个属性的完整语法是

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

PropertyType、property_initializer、getter、setter均是可选的元素,这里再强调下,val类型变量为可读变量,所以只拥有get方法,而var类型则有get/set方法。这里直接自定义Student类的birthday的get/set方法

class Student {
    ...
    var age: Int?//自定义get/set方法
        get() = field //使用备用字段自定义get/set方法
        set(value) {//value是自定义的变量名,名字可以随便起
            age = value
        }
    ...
}

接口

Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。

public interface SomeInterface{
    var value:String //默认abstract

    fun reading() // 未实现

    fun writing(){  //已实现
        // do nothing
    }
}
class MyImpl:SomeInterface{
    override var value: String = "jason" //重载属性
    override fun reading() {
        // 方法体
    }
}

枚举

枚举类的最基本的用法是实现类型安全的枚举

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

每个枚举常量都是一个对象。枚举常量用逗号分隔。

使用:

 var color:Color=Color.BLUE
  println(Color.values())
  println(Color.valueOf("RED"))
  println(color.name)
  println(color.ordinal)//返回下标

委托

委托模式是一个很有用的模式,它可以用来从类中抽取出主要负责的部分。委托模式是Kotlin原生支持的,所以它避免了我们需要去调用委托对象。委托者只需要指定实现的接口的实例。

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // 输出 10
}

在 Derived 声明中,by 子句表示,将 b 保存在 Derived 的对象实例内部,而且编译器将会生成继承自 Base 接口的所有方法, 并将调用转发给 b。

委托属性

kotlin通过属性委托的方式,为我们实现了一些常用的功能,包括:

  1. 延迟属性(lazy properties): 其值只在首次访问时计算,
  2. 可观察属性(observable properties): 监听器会收到有关此属性变更的通知,
  3. 把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。

延迟属性

延迟属性我们应该不陌生,也就是通常说的懒汉。

//标准委托 延迟属性
    val lazyValue : String by lazy {
           Log.d("m", "只执行1次")
           "value"
    }
 println(lazyValue)
 println(lazyValue)

 //执行
 D/m: 只执行1次
 I/System.out: value
 I/System.out: value

可观察属性 Observable

Delegates.observable() 接受两个参数:初始值和修改时处理程序(handler)。 每当我们给 属性赋值时会调用该处理程序(在赋值后执行)。它有三个参数:被赋值的属性、旧值和新 值:

class User {
    var name: String by Delegates.observable("<no name>") {
        prop, old, new ->
        println("$old -> $new")
    }
}
//可观察属性 Observable
   val user = User()
   user.name = "first"
   user.name = "second"
//执行结果
I/System.out: <no name> -> first
I/System.out: first -> second

把属性储存在映射中

一个常见的用例是在一个映射(map)里存储属性的值。 这经常出现在像解析 JSON 或者做其他“动态”事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。

class MapUser(val map: Map<String, Any?>) {

    val name: String by map
    val age: Int     by map
}
//把属性储存在映射
  val userMap = MapUser(mapOf(
        "name" to "小七",
        "age"  to 21
   ))
  println(userMap.name)
   println(userMap.age)
//执行结果
I/System.out: 小七
I/System.out: 21
时间: 2025-01-14 03:10:22

Kotlin------类和对象(二)的相关文章

类和对象(二)

对象的自身引用是面向对象程序设计语言中特有的.十分重要的一种机制.在C++中,为这种机制设立了专门的表示:this指针变量. 在类的每一个成员函数的形参表中都有一个隐含的指针变量this,该指针变量的类型就是成员函数所属类的类型. 当程序中调用类的成员函数时,this指针变量被自动初始化为发出函数调用的对象的地址. 例如: 123456789101112131415161718 #include <iostream>using namespace std;class Sample{ int x

C++中的类和对象(二)

一,对象的动态建立和释放 1.什么是对象的动态建立和释放 通常我们创建的对象都是由C++编译器为我们在栈内存中创建的,我们无法对其进行生命周期的管理.所以我们需要动态的去建立该对象,因此我们需要在堆内存中创建对象和释放对象.在C语言中为我们提供了malloc()函数和free()函数来为我们提供在堆内存中分配变量的方式,但是在C++中引入了new和delete关键字来让我们动态的创建和释放变量. 2.new和delete关键字 new关键字是用来在堆内存中创建变量的,格式为:Type * ptr

Kotlin类和对象

来源于:菜鸟教程 Kotlin类可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明. Kotlin中使用关键字class声明类,后面紧跟类名: class   Runoob {   //类似Java } 但是Kotlin可以定义一个空类: class Empty 类中定义成员函数: class Runoob() { fun foo() { print("Foo")} //成员函数 } 类的属性 属性定义 类的属性可以用关键字var声明为可变的,否则使用关键字val 声明为不

Kotlin 类和对象

类定义 Kotlin 类可以包含:构造函数和初始化代码块.函数.属性.内部类.对象声明. Kotlin 中使用关键字 class 声明类,后面紧跟类名: class Runoob { // 类名为 Runoob // 大括号内是类体构成 } 我们也可以定义一个空类: class Empty 可以在类中定义成员函数: class Runoob() { fun foo() { print("Foo") } // 成员函数 } 类的属性 属性定义 类的属性可以用关键字 var 声明为可变的,

php类和对象(二)

面向对象第三大特性:多态 概念: 当父类引用指向子类实例的时候,由于子类对父类函数进行了重写,导致我们在使用该引用取调用相应方法时表现出的不同 条件: 1.必须有继承 2.子类必须对父类的方法进行重写 多态在弱类型语言中表现不明显,在强类型语言中表现比较明显,在php中不用考虑. class Ren { public $name; public $sex; function say() { echo "hello"; } } class China extends Ren { func

python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法

在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object):     def spam(self):         print 'A.spam' class B(A):     def spam(self):         print 'B.spam'         A.spam(self) if __name__=='__main__':     b=B()     b.spam() 但是上面的代码有一个问题,如果B的父类变更了,而且有很多子类的父

Kotlin基础(三)类、对象和接口

类.对象和接口 一.定义类的继承结构 一)Kotlin中的接口 Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态. 1 interface Clickable{ 2 fun click() 3 fun showoff()=println("It's show time!") 4 } 5 6 interface Focusable{ 7 fun setFocus(b: Boolean)= 8 println("I ${

C++笔记二:类和对象

类和对象 1:面向对象基础 2: 定义类和对象 3: 类和对象的使用 4: 构造函数和析构函数 5: this指针和复制构造函数 6: static静态成员 7: const对象和const成员 8: friend友元 ---------------------------------------------------------------------------------------------------------------------- (1)面向对象基础 一.什么是面向对象程序

PHP 类与对象 全解析( 二)

目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 7.Static关键字 声明类成员或方法为static,就可以不实例化类而直接访问.不能通过一个对象来访问其中的静态成员(静态方法除外). 静态成员属于类,不属于任何对象实例,但类的对象实例都能共享. 小结: 在类内部访问静态成员属性或者方法,使用 self::(没有 $ 符号),如:  self:: $country  //类内部访问静态成员属性  self:: myCountry()

oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造成内存泄露 全局区:所有的全局变量和静态变量 常量区:所有的常量 代码区:程序编译后的指令集 类是模板,肯定需要存在内存里面,因为实例化对象的时候需要根据这个模板来创建,那么存在内存里面,存在哪呢?? 类模板存在:全局区! 存的是:类的描述,还有所有的方法实现 每个对象都会有一个系统给我们的isa指