Kotlin 创建接口或者抽象类的匿名对象实例

作者:三元转换 时间:2022-02-02 13:12:23 

一 ,定义接口和抽象类


interface IPerson{
//获取名字
fun getName():String
//获取身份证ID
fun getID():String
}

abstract class BaseAnimal{
abstract fun getVoice():String
}

二,创建对应的匿名对象


object : IPerson {
  override fun getName(): String = "jason"
  override fun getID(): String = "00000123"
 }

object : BaseAnimal() {
  override fun getVoice() = "旺旺叫"
 }

补充知识:android Kotlin 继承、派生、接口、构造方式,方法、属性重写

前言

kotlin 作为google官方android 开发语言,大势所趋,据传到2018底kotlin要全面替代java在android中的地位,其实这个也不担心毕竟kotin和java可以100%互操作。两种语言进行编写也是可以的。

Kotlin 继承

1.使用 open 关键字进行修饰

2.主构造函数紧跟着在类后面声明的函数


open class Person(var name : String, var age : Int){// 基类

}

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {

}

// 二级构造函数

calss Student : Person {

constructor(ctx: Context) : super(ctx) {
}

constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}

另一种写法,基类构造函数,次级构造函数


/**用户基类**/
open class Person(name:String){
/**次级构造函数**/
constructor(name:String,age:Int):this(name){
 //初始化
 println("-------基类次级构造函数---------")
}
}

/**子类继承 Person 类**/
class Student:Person{

/**次级构造函数**/
constructor(name:String,age:Int,no:String,score:Int):super(name,age){
 println("-------继承类次级构造函数---------")
 println("学生名: ${name}")
 println("年龄: ${age}")
 println("学生号: ${no}")
 println("成绩: ${score}")
}
}

fun main(args: Array<String>) {
var s = Student("Runoob", 18, "S12345", 89)
}

方法重写

基类fun函数默认 final 修饰符,无法在子类进行重写

需要加上 open 修饰符号

方法获得,同名方法获得

一个类从其他类或者接口(继承实现来的方法),同名方法,在子类中必须显示进行调用


open class A {
open fun f () { print("A") }
fun a() { print("a") }
}

interface B {
fun f() { print("B") } //接口的成员变量默认是 open 的
fun b() { print("b") }
}

class C() : A() , B{
override fun f() {
 super<A>.f()//调用 A.f()
 super<B>.f()//调用 B.f()
}
}

fun main(args: Array<String>) {
val c = C()
c.f();
}

open class A {
open fun f () { print("A") }
fun a() { print("a") }
}

interface B {
fun f() { print("B") } //接口的成员变量默认是 open 的
fun b() { print("b") }
}
class C() : A() , B{
override fun f() {
 super<A>.f()//调用 A.f()
 super<B>.f()//调用 B.f()
}
}
fun main(args: Array<String>) {
val c = C()
c.f();
}

属性重写

属性重写使用 override 关键字,属性必须具有兼容类型,每一个声明的属性都可以通过初始化程序或者getter方法被重写:


open class Foo {
open val x: Int get { …… }
}
class Bar1 : Foo() {
override val x: Int = ……
}

你可以用一个var属性重写一个val属性,但是反过来不行。因为val属性本身定义了getter方法,重写为var属性会在衍生类中额外声明一个setter方法

你可以在主构造函数中使用 override 关键字作为属性声明的一部分:


interface Foo {
val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
override var count: Int = 0
}

Kotlin 接口

Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现:


interface MyInterface {
fun bar() // 未实现
fun foo() { //已实现
 // 可选的方法体
 println("foo")
}
}

接口中的属性

接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:


interface MyInterface{
var name:String //name 属性, 抽象的
}

class MyImpl:MyInterface{
override var name: String = "runoob" //重载属性
}

函数重写

实现多个接口时,可能会遇到同一方法继承多个实现的问题。例如:

实例


interface A {
fun foo() { print("A") } // 已实现
fun bar()     // 未实现,没有方法体,是抽象的
}

interface B {
fun foo() { print("B") } // 已实现
fun bar() { print("bar") } // 已实现
}

class C : A {
override fun bar() { print("bar") } // 重写
}

class D : A, B {
override fun foo() {
 super<A>.foo()
 super<B>.foo()
}

override fun bar() {
 super<B>.bar()
}
}

fun main(args: Array<String>) {
val d = D()
d.foo();
d.bar();
}

输出结果为:

ABbar

实例中接口 A 和 B 都定义了方法 foo() 和 bar(), 两者都实现了 foo(), B 实现了 bar()。因为 C 是一个实现了 A 的具体类,所以必须要重写 bar() 并实现这个抽象方法。

然而,如果我们从 A 和 B 派生 D,我们需要实现多个接口继承的所有方法,并指明 D 应该如何实现它们。

这一规则 既适用于继承单个实现(bar())的方法也适用于继承多个实现(foo())的方法。

来源:https://blog.csdn.net/Jason101123/article/details/79119614

标签:Kotlin,接口,抽象类,匿名对象
0
投稿

猜你喜欢

  • java使用正则表达校验手机号码示例(手机号码正则)

    2022-04-07 20:37:04
  • C#实现向函数传递不定参数的方法

    2021-06-21 01:33:22
  • Unity实现场景漫游相机

    2023-06-15 19:08:57
  • Java正则多字符串匹配替换

    2021-12-16 02:24:48
  • java实现简易超市管理系统 附源码下载

    2021-11-05 18:58:30
  • 集合嵌套之ArrayList嵌套ArrayList实例

    2021-06-23 07:32:25
  • 详解Java的Hibernat框架中的Map映射与SortedMap映射

    2021-08-21 20:31:59
  • springboot配置Jackson返回统一默认值的实现示例

    2023-12-08 13:55:22
  • C#的Excel导入、导出

    2023-09-10 01:00:24
  • Java读取TXT文件内容的方法

    2023-11-23 22:33:41
  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    2021-07-10 10:38:17
  • 浅谈hibernate急迫加载问题(多重外键关联)

    2023-08-18 12:58:54
  • Java多线程编程综合案例详解

    2023-12-09 18:13:25
  • Springboot WebFlux集成Spring Security实现JWT认证的示例

    2021-06-02 03:24:50
  • 对Mapper 中几种update的区别说明

    2023-05-19 04:39:44
  • springcloud之自定义简易消费服务组件

    2022-01-29 00:18:24
  • c#基础系列之ref和out的深入理解

    2023-05-20 10:51:50
  • 详解java动态代理模式

    2023-03-29 13:39:29
  • Java自动添加重写的toString方法详解

    2021-11-05 14:29:13
  • Java读取properties配置文件的8种方式汇总

    2022-05-03 17:11:34
  • asp之家 软件编程 m.aspxhome.com