kotlin的类与继承_长颈鹿bao的博客-程序员秘密

技术标签: java  继承  class  Kotlin  

本文是对kotlin的官方文档进行翻译,供自己学习方便,英语比较好的朋友可以直接看官方文档。官方文档

一、类

       在kotlin中和在java中一样,类的声明使用关键字class

class Invoice {
}
       类的声明由类名,类头(指定参数类型,主构造函数等)和类体组成,由大括号括起来。 类头和类体都是可选的; 如果类没有类体,可以省略大括号。

class Empty


二、构造函数

        kotlin中的一个类可以有一个主要的构造函数和一个或多个辅助构造函数。主构造函数是类头的一部分:它在类名后面(和可选的类型参数)。

class Person constructor(firstName: String) {
}
        如果主构造函数没有任何的注解或者可见的修饰符,那么constructor可以省略。

class Person(firstName: String) {
}
        主构造函数不能包含任何代码。初始化代码可以放在初始化程序块中,前缀为init关键字:

class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}
        请注意,主构造函数的参数可以在初始化程序块中使用。它们也可以用在类体的属性初始化声明中

class Customer(name: String) {
    val customerKey = name.toUpperCase()
}
        实际上,为了声明属性并初始化主构造函数中的参数,Kotlin有一个简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}
       与常规属性一样,在主构造函数中声明的属性可以是可变的(var)或只读(val)。
       如果构造函数具有注释或可见性修饰符,那么构造函数关键字constructor是必需的,修饰符就在它之前:

class Customer public @Inject constructor(name: String) { ... }
三、辅助构造函数

       一个类可以声明辅助构造函数,辅助构造函数要用constructor作为前缀。

class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    }
}
       如果类具有主构造函数,则每个辅助构造函数需要通过另一个辅助构造函数直接或间接地委派给主构造函数。 使用this关键字对同一类的另一个构造函数进行委派:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}
        如果一个非抽象类没有声明任何构造函数(主构造函数或辅助构造函数),那么它将生成一个没有参数的主构造函数,构造函数的可见性将是公开的。如果您不希望您的类具有公有构造函数,则需要声明具有非默认可见性的空主构造函数:
class DontCreateMe private constructor () {
}
注意:在JVM中,如果主构造函数的所有参数都具有默认值,编译器将生成一个额外的无参数构造函数,它将使用默认值。 这使得更容易使用Kotlin与诸如Jackson或JPA的库,通过无参数构造函数创建类实例。
class Customer ( val customerName : String = "" )

四、创建实例

        要创建一个类的实例,我们调用构造函数,就像它是一个常规函数一样:

val invoice = Invoice()

val customer = Customer("Joe Smith")

五、类成员

一个类包括

1.构造函数和初始化程序块

2.函数

3.属性

4.嵌套和内部类

5.对象声明


六、继承

       Kotlin中的所有类都有一个通用的父类Any,(在java中是object)这是一个没有超类声明类的默认父类:

class Example // 隐式继承自Any
       Any和Object是不同的,Any除了equals(),hashCode()和toString()之外不具备任何成员。

      要声明一个显式的父类,我们将父类放在类头中的冒号后面:

open class Base(p: Int)

class Derived(p: Int) : Base(p)
      如果类具有主构造函数,则可以使用主构造函数的参数(并且必须)初始化基类型。

      如果类没有主构造函数,则每个辅助构造函数必须使用super关键字初始化基类型,或者委托给另一个构造函数。 请注意,在这种情况下,不同的辅助构造函数可以调用基类型的不同构造函数:

class MyView : View {
    constructor(ctx: Context) : super(ctx)

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
}
        一个类的open注释与Java中的final是相反的,如果一个类用open,那么其他类可以继承自这个类。默认情况下,在kotlin中所有类都是final的。

七、覆盖方法

在kotlin中进行重写要有明确的注释,就是刚才提到的open注释。这一点和java是不相同的。

open class Base {
    open fun v() {}
    fun nv() {}
}
class Derived() : Base() {
    override fun v() {}
}
Derived.v()需要用 override注释,如果缺少,编译器将会提示,如果一个函数没有open注释,比如Base.nv(),在子类中声明相同名字的函数是非法的,不管是否重写。在一个final类中(一个没有open注释的类)open类型的成员是被禁止的。






版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/changjinglubeipan/article/details/73558249

智能推荐

Android 在native层binder跨进程通信_文森88的博客-程序员秘密

目录 -bbinder与bbinder通讯 -bpbinder与bbinder通讯 -共享内存 -ion

YT04-贪心课后练习-1002—Repair the Wall-(6.14日-烟台大学ACM预备队解题报告)_kewlgrl的博客-程序员秘密

Repair the WallTime Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 33   Accepted Submission(s) : 14Font: Times New Roman | Verdana | Georg

python编程狮苹果系统_编程狮Mac版-编程狮for Mac下载 V2.1.0-PC6苹果网_weixin_39940253的博客-程序员秘密

编程狮Mac版是Mac电脑上的一款随时随地学编程,零基础高效学编程神器。编程狮Mac版是一款专业的编程入门学习软件,致力于帮助初学者入门及提升程序员开发效率,目前已提供1000+常见编程语言教程和免费技术文档,涵盖前端开发/Python/Java/PHP等热门编程语言。注意事项macOS Catalina (macOS 10.15) 已损坏无法打开解决办法:打开终端(“启动台”—“其他”),输入以...

不使用libpng,较好解决OpenGL中使用png图标的方法_glb中png文件提出_lxnkobe的博客-程序员秘密

之前看到有使用第三方库libpng 解决openGL中使用png图标的文章。今天实现了使用QT+OpengL 实现了png图标的使用,没有使用libpng。下面是代码,仅供参考:void QglModel::LoadIcons(char * file,GLuint &texture_ID) { QImage t; QImage b; glEnable(GL_TEXTURE_2D)

python+Appium——移动端自动化之元素定位及操作_觅远的博客-程序员秘密

元素定位方法根据ID同Selenium的定位方法相同,ID属性一般唯一,在安卓应用元素中,这个ID信息为resource-id属性,使用的代码为.find_element_by_id()根据CLASS NAME安卓界面的class属性其实是根据元素的类型,类似于web中的tagname(标签名)属性,所以通常并不唯一,因此,根据classs属性来选择元素时,通常是选择多个具有这一属性的元素,使用.find_elements_by_class_name(),结果为列表存放。使用class属

[转]Eclipse中如何恢复已删除文件_weixin_34060741的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

随便推点

Linux下使用Python连接Oracle 报cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be lo..._weixin_30817749的博客-程序员秘密

在Linux上使用python运行数据库脚本的时候报:cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded解决方法这个导致这个问题的原因是本机的Python2.7是64位的,而数据库用了32位的instantclient-basic,所以要把instantclient-basic的版本更...

ubuntu 12.04 Wine 找不到 gnome-keyring-pkcs11.so 的解决方法_ubuntu gnome-keyring_Rexxxxxxxxxx的博客-程序员秘密

在64位ubuntu上运行wine出现下面错误p11-kit:couldn'tloadmodule: /usr/lib/i386-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/i386-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No

SWT项目的常见问题总结_创建swt项目的时候显示错误_zhou_tomcat的博客-程序员秘密

1.JRE的包没有导入 jdk的包2.db.propotites的位置不对 因为你解析的文件的目录位置跟你写的类的文件位置不一致 3.DBHelper中的获取连接不对 这个是否就要检查你的数据库服务是否打开 ,是否导入ojdbc的包, 然后 获取用户名、密码 是否正确 ,下一步检查你的s

学习网址汇总_weixin_42170257的博客-程序员秘密

编程相关的学习网站:网络编程网站开发教程大全,内含有大量的参考手册,博文阅读,优质项目、在线工具、在线代码、开放平台等,囊括PHP、SQL、HTML、JS等w3school,你可以找到你所需要的所有的网站建设教程,从基础的 HTML 到 CSS,乃至进阶的 XML、SQL、JS、PHP 和 ASP.NET。源码之...

未能启动 java jar_5个Java开发人员中有4个未能解决此问题_danpu0978的博客-程序员秘密

未能启动 java jar Java Deathmatch的结果–开发人员的益智迷你游戏 几个月前,我们发布了一个新的附带项目,其中有一个名为Java Deathmatch的微型站点 ,自那时以来,已有20,000多名开发人员进行了尝试。 该站点包含20个选择题Java的问题,今天我们收集了所有已玩游戏的统计信息后,很高兴与您分享一些结果和解决方案。 总体而言,我们收集了61,872个...

OpenCV图像处理算法——14(基于Retinex成像原理的自动色彩均衡算法(ACE))_自动色彩均衡算法代码是什么_Delv_Peter的博客-程序员秘密

基于Retinex成像原理的自动色彩均衡算法(ACE)前言这个算法是IPOL上一篇名为《Automatic Color Equalization(ACE) and its Fast Implementation》提出的,这实际上也是《快速ACE算法及其在图像拼接中的应用》这篇论文中使用的ACE算法,这个算法主要是基于Retinex成像理论做的自动彩色均衡,我用C++ OpenCV实现了,来分享...

推荐文章

热门文章

相关标签