继续Kotlin的面向对象之旅。

继承:

在Java中我们知道除了final类不能被继承,其它的情况都是可以被继承的,而在Kotlin中的规则是这样的:“在Kotlin中,所有类在默认情况下都是无法被继承的,换句话说,在Kotlin中,所有类默认情况下都是final的”。其实这样更加的人性,因为平常我们写的任何java类都可以被人随时继承,而在Kotlin中只有你开放了继承权限的类才能被其它人继承,下面来看一下:

其中报错的提示为:

那要继承,则需要这样做:

接下来再来看:

那。。为啥报错了呢?看一下错误提示:

这里又有一个规则出来:“在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化父类型,或者通过其他secondary构造方法完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。”,所以,咱们可以这样做:

重写:

方法重写:

只要有类的继承,肯定就会有类方法的重写,所以接下来看一下在Koltin中重写是如何搞滴:

报错提示:

是因为Fruit有个不带参的构造方法,所以需要这样写:

那接下来咱们在子类中来重写父类的方法:

看下错误提示:

所以咱们显示的加上override来看下:

所以:

可见在Kotlin中增加了很多的关键字,并非平白无故的就增加了,都是为了语义更加的强而增加的,想一想,在Java中对于父类的重写,如果站在子类的角度是不是很难知道该方法是重写的父类的,排除IDE的提示,但是在Kotlin中,我们只要发现方法中有override,肯定就代码是重写了父类的方法了,语义性特别的强。

接下来继续:

接下来再来定义一个新的class:

属性重写:

错误提示:

一样的处理办法:

接下来使用一下:

另外还有一种重写字段的方法,就是在primary构造当中,如下:

接下来再来定义一个新的class:

再定义子类:

另外有一个细节:

那。。如果反过来定义呢?

这个报错是因为得再定义一个set方法才行,如下:

那么问题来了,为啥var可以重写val属性,而val属性不能重写var? 因为一个val属性相当于一个get方法,是只读;而一个var属性相当于既有get方法又有set方法,基于这个特性,很明显多的可以复写少的,而少的不可能复写多的,所以。。说实话,有点绕~~下面最后再总结一下:

1、val  可以 override val

2、var 可以 override val

3、val 不可以 override var

本质上,val相当于get方法;var相当于get与set方法

Kotlin继承与重写重要特性剖析的更多相关文章

  1. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  2. C#和Java的类、继承、重写与多态

    面向对象的三大特性是封装.继承.多态,C#和Java都是面向对象的语言所以他们的类.继承.重写与多态有很多共同点,但是实现上也存在一定的区别.其中Java中其实没有虚函数的概念,也可以认为Java的函 ...

  3. Php面向对象 – 继承和重写

    Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public  $p_c  ...

  4. 创建线程时如果既传入了runnable对象,又继承thread重写了run方法,会执行的哪里的代码

    1 使用线程的方式,继承thread类,重写run方法 new Thread() { @Override public void run() { System.out.println("我是 ...

  5. Django admin 继承user表后密码为明文,继承UserAdmin,重写其方法

    Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...

  6. Java多态机制和继承中重写重载

    关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...

  7. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

  8. Kotlin协程第一个示例剖析及Kotlin线程使用技巧

    Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...

  9. 20140415 HOG 不同继承方式的访问特性 虚函数工作原理

    1.HOG block重叠的好处 由于行人通常其形状可以视为柔体,人 的边缘位置不固定,而有一些移动,block 重叠后,一个边缘的梯度信息在两个相邻重叠的 block 中都能有所表达,这样即使边缘的 ...

随机推荐

  1. [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  2. kexue shangwang002

    需先搭建 openvpn 海外服务端, 具体参考 https://www.cnblogs.com/weifeng1463/p/11041550.html 选择阿里云华东ecs 搭建openvpn 的客 ...

  3. 本地mysql启动之后,另外一台电脑利用数据库访问软件,连接问题

    背景:在一台电脑上面安装MySQL数据库之后,利用另一台电脑访问本台电脑上面的数据,访问失败的问题 解决方法 开启 MySQL 的远程登陆帐号有两大步: 1.确定服务器上的防火墙没有阻止 3306 端 ...

  4. Python界面常用GUI包

    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的 1.tkin ...

  5. python 浅拷贝和深拷贝(9)

    何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~     一.普通的变量赋值 我们平常使用的变量赋值就是 ...

  6. QT5 添加resource的方法

    在工程中右键点击xxx.qrc文件,选择"open in editor",然后可以用"Add ""Remove"按钮进行资源文件的添加.

  7. npm,umi,yarn

    npm 是什么? npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门.它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(pack ...

  8. Linux04 目录的相关操作(mkdir、rmdir、rm、cp)

    一.创建目录:mkdir mkdir 目录名 二.删除目录:rmdir / rm rmdir 目录名 rm -r 目录名      每一级子目录都会询问是否删除 rm -rf 目录名     慎用,给 ...

  9. Shiro集成SSM基于动态URL权限管理(二)

    这个案例基于上一个demo扩展而来.所以数据库表,在Shiro集成SSM基于URL权限管理(一)开篇的一致.如果上个demo操作的建议重新导入一次,避免出现问题. 而这次都不是通过固定写在方法上的注解 ...

  10. if的条件表达式

    常用的: [ -a FILE ] 如果 FILE 存在则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真. [ -e FILE ] 如果 指定的文件或目录存在时返回为真. [ ...