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

一 ,定义接口和抽象类

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())的方法。

以上这篇Kotlin 创建接口或者抽象类的匿名对象实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Kotlin中实体类的创建方式

    类的基本格式 class 类名{ } 属性的基本格式 var 属性名字 : 类型 下面是实体类代码 package com.dldw.entity import java.util.* class Demo { //var 声明的属性可以被二次赋值 val声明的是不可变属性,赋值以后不能在赋值,否则编译报错 //长整型 64位 注意后面加大写L var height: Long? = 0L //整型 32 位 var id : Int?= 0 //短整型 16位 var short :Short

  • Kotlin 匿名类实现接口和抽象类的区别详解

    我就废话不多说了,还是上代码吧 接口: interface OnBind { fun onBindChildViewData(holder: String, itemData: Any, position: Int) } lesson.does(object : OnBind { override fun onBindChildViewData(holder: String, itemData: Any, position: Int) { println(holder + itemData +

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

    一 ,定义接口和抽象类 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(): S

  • Java匿名对象与匿名内部类

    匿名对象:没有名字的对象. 非匿名对象: ClassName c=new ClassName(); c.run(); 匿名对象: new ClassName().run(); 注意事项: 1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象. 2.两个匿名对象不可能是同一个对象. 3.一般不给匿名对象赋予属性值,因为永远无法获取到. 4.运行一次,直接就被回收掉了,节省内存空间. 匿名对象使用的代码例子: public class Anony{ int a=1; int b=2; void

  • 浅析Java常用API(Scanner,Random)匿名对象

    API:即Application programming Interface,应用编程接口. Java中封装了许许多多的API供用户使用,Scanner与Random便是其中之一,API实际就是类,已经封装好了Scanner类,Random类,我们只需按照其语法编写即可,无需了解其根本源代码 Scanner类: 1.使用Scanner类需导入其所在包,import java.util.Scanner或import java.util.*(前者是导入util中的Scanner类,后者是导入util

  • Python面向对象之接口、抽象类与多态详解

    本文实例讲述了Python面向对象之接口.抽象类与多态.分享给大家供大家参考,具体如下: 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 接口主要是java等语言中的概念,python中并没有明确的限定 from abc import ABCMeta,abstractmethod class Pay

  • Java中接口和抽象类的区别详解

    需求:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?抽象类中是否可以有静态的main方法? 先说明二者的定义,然后聊聊需求,最后分析二者的区别. 含有abstract修饰符的类即为抽象类,抽象类不能创建实例对象.含有抽象方法的类必须定义为abstract class.在abstract class中,方法不必是抽象的,但是抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法.子类如果没有实现抽象父类中的所

  • 浅析Java中接口和抽象类的七大区别

    目录 接口 抽象类 区别1:定义关键字不同 区别2:继承或实现的关键字不同 区别3:子类扩展的数量不同 区别4:属性访问控制符不同 区别5:方法控制符不同 区别6:方法实现不同 区别7:静态代码块使用不同 总结 Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象.封装.继承和多态. 而本文介绍的接口和抽象类就是面向对象编程中"抽象"的具体实现,也就是说接口和抽象类都是用来定义实体类的公共行为的,它们是对实体类(对象)更高层次的抽象. ​说明:本文以下内容基于 JDK

  • java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    内部类的介绍 定义在另外一个类中的类,叫内部类 成员内部类 1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象 2..this 可以通过外部类的类名.this去访问外部类的所有属性和方法. public class Test1 { String name = "asnd"; public static void main(String[] args) { Test1 test1 = new Test1(); Inner mInner = test1.

  • Java中的接口和抽象类用法实例详解

    本文实例讲述了Java中的接口和抽象类用法.分享给大家供大家参考,具体如下: 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题领域进行分析. 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象. 比如:我们要描述"水果",它就是一个抽象,它有质量.体积等

  • Java接口和抽象类用法实例总结

    本文实例讲述了Java接口和抽象类用法.分享给大家供大家参考,具体如下: 接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现

随机推荐