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

智能推荐

基于Haar特征的Adaboost级联人脸检测分类器_bbzz2的博客-程序员秘密

基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器。通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征、Adaboost、级联。理解了这三个词对该算法基本就掌握了。1        算法要点Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联;

第11周 项目三-点类派生直线类_冷基栋_攻城师的博客-程序员秘密

定义点类Point,并以点类为基类,派生出直线类Line,从基类中继承的点的信息表示直线的中点。请阅读下面的代码,并将缺少的部分写出来。#include#includeusing namespace std;class Point //定义坐标点类{public: Point():x(0),y(0) {}; Point(double x0, double

ngx_lua 模块支持 subrequest 了!_iteye_1105的博客-程序员秘密

ngx_lua 模块将 Lua 整合在 NginX 中,使用 Lua coroutine per request 机制实现无缝的 I/O 复用处理。受益于 Lua 解释器的极低开销和原生 coroutine 支持,用户代码仍然能以习惯的顺序方式编写,丝毫不会感受到 NginX I/O 复用结构的存在,同时又能享受到其天然的非阻塞大并发能力和非凡的速度。借助 agentzh 在 ngx_echo...

自动刷抖音极速版得红包金币(APP实现)_自动刷抖音极速版神器_景兄弟1366的博客-程序员秘密

上回我们用python实现了自动刷抖音的功能(https://blog.csdn.net/u012539700/article/details/100058939),这回我们用android app的形式来实现自动刷抖音,这样就可以不用连接电脑啦。 原理很简单,使用android无障碍里面的AccessibilityService就可以啦。 首先在res目录下新建一个xml文件...

php_pthreads.dll,PHP多线程扩展Pthreads只能运行在ts安全线程_哲部豪跋的博客-程序员秘密

本来想测试下,结果无论本地或生产环境都是nts,所以这里只说安装,不说使用,因为没用上。windows版本的下载地址http://windows.把pthreadVC2.dll和php_pthreads.dll文件,把vc2文件放到php.exe同级目录,把php_pthreads.dll放到扩展目录下。1、修改php.ini文件 添加extension=php_pthreads.dll2、Apa...

springboot整合02_依依y6的博客-程序员秘密

整合定时任务1.引入依赖`<!--定时任务的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>简单测试@Componentpubl

随便推点

extern关键字的测试_xiaoming_zhong的博客-程序员秘密

新建test.h文件,内容如下:#ifndef __TEST_H__#define __TEST_H__char a='a';#endif新建change_a.c文件,内容如下:#include "test_h.h"void change_a(){ extern char a; a='c'; return 0;}新建hello.c文件,内容如下:

计算机毕业设计、计算机课程设计怎么做?计算机设计1900套来帮你!_我要少吃肉的博客-程序员秘密

计算机毕业设计、计算机课程设计怎么做?计算机设计1900套来帮你!人生做什么事都有套路,大学毕业设计、课程设计通常比较简单,大多数都是找个项目做参考,有的人随便抄一抄糊弄一下,只要查重,格式别出错就行。学校也不傻,毕设、课设上卡你们没什么意义,赶紧把你们送走才是最重要的这里可参考计算机毕业设计1900套来帮你!帮你轻松搞定毕设、课设。是学习参考的优秀模板,既可以作为提高优秀同学的毕设质量,也可以作为给某些同学糊弄参考通过的保障。计算机毕业设计1900套,帮你事半功倍,具体所有名称项目清单看照片目录。获取方式

ES基本查询总结_es数据查询_ZhaoYingChao88的博客-程序员秘密

ES与数据库比较 查询操作Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。有了数据后,我们就需要对数据进行检索操作。根据实际开发需要,往往我们需要支持包含但不限于以下类型的检索:1)精确匹配,类似mysql中的 “=”操作;2)模糊匹配,类似mysql中的”like %关键词% “查询操作;3)前缀匹配;4)...

Vuepress博客美化技巧_ReevesJ的博客-程序员秘密

文章目录导航栏透明+背景图填充+悬浮气泡背景图填充导航栏透明图片中的点击向下跳转的样式悬浮气泡导航栏透明+背景图填充+悬浮气泡背景图填充效果图:下面的小框扩展到大框,让后面的导航栏透明更完善一些。编辑Theme/components/HomeBlog.vue下的.hero { margin $navbarHeight auto 0 position relative box-sizing border-box padding 0 20px hei

vite/Vuecli配置proxy代理解决跨域_vite设置dev proxy_williamyi74的博客-程序员秘密

上代码:import { defineConfig } from 'vite';import vue from '@vitejs/plugin-vue';import { resolve } from 'path';// https://vitejs.dev/config/export default defineConfig({ server: { port: 9090, strictPort: true, // 严格端口 true:如果端口已被使用,则直接退出,而不会再

Mathematica三维坐标系的建立_mathematica画图设置x轴三维_sachin_woo的博客-程序员秘密

背景某些情况下(如在三维绘图),需要绘制系统坐标系。首先来看一下三维迪卡尔坐标系的组成:坐标原点(0,0,0),带箭头的坐标轴,坐标轴标签。因此在绘制坐标系,需要绘制这些元素。Mathematica实现coordinateSystem3D = { {RGBColor[{1, 0, 0}], Arrowheads[0.05], Arrow[Tube[{{0, 0, 0}, {1, 0,...

推荐文章

热门文章

相关标签