[转载] Scala继承与Java的区别
参考链接: Java中将final与继承一起使用
在之前的笔记Java静态属性和方法的继承问题中,通过具体的实验证明,在子类中重写父类的字段时并没有覆盖父类的字段,只是隐藏了父类的字段。而在scala中则不同,scala子类的同名字段会重写且覆盖父类的同名字段,这里做了个简单实验,并记录下来。
Parent.scala
class Parent {
val normalStr: String = "Normal member of parent."
def normalMethod() = {
println("Normal method of parent.")
}
}
定义了一个字段normalStr和一个方法normalMethod(),在Scala中,类的字段是由一个私有属性和对应的getter/setter方法组成的。
Child.scala
class Child extends Parent {
override val normalStr: String = "Normal member of child."
override def normalMethod() = {
println("Normal method of child.")
}
}
子类Child继承了父类Parent,并override父类的normalStr和normalMethod()。
TestMain和Result
object TestMain{
def main(args: Array[String]) {
val child: Child = new Child
println(child.normalStr)
child.normalMethod()
//val child1:Parent = child.asInstanceOf[Parent]
//采用Parent类型的变量指向创建的Child对象
val child1:Parent = new Child
println(child1.normalStr)
child1.normalMethod()
}
}
输出的结果如下:
Normal member of child.
Normal method of child.
Normal member of child.
Normal method of child.
从结果可以看出,子类重写并覆盖了父类的同名属性和方法
Scala子类的构造顺序
这里顺便记录下Scala子类的构造顺序,这里直接用书上给出的例子,以便后续查看:
先写两个类,一个父类Creature.scala,一个子类Ant.scala:
Creature
class Creature {
val range: Int = 10
val env: Array[Int] = new Array[Int](range)
def show(): Unit = {
println(range)
}
}
Ant
class Ant extends Creature {
override val range = 2
}
现在创建一个Ant的对象ant,那么ant.env.length的值是多少,凭第一感觉应该是10或者2,然而答案是0,接下来我写下ant创建的过程中构造器的运行顺序:
首先调用父类Creature的构造器(父类的构造器先于子类的构造器被调用),所以首先把range设置为10。为了后续的说明这里说明下,类的字段是由一个私有属性和对应的getter和setter方法组成的,而子类在重写父类的同名字段时,对于val类型的属性子类重写了getter方法。接下来初始化env数组,所以需要调用range的getter方法,然而子类已经重写了getter方法,且子类并没初始化,所有的字段都是对象创建过程中,内存清零后的默认值,所以此时range的值为0。这也就解释了上述问题的疑问。接下来调用子类的构造器,range被设为2。
所以在构造器中,对象的初始化不应该依赖于val的值,因为val的值对应的getter方法可能会被子类重写覆盖。解决办法有:
将val声明为final。(简单高效,但是不够灵活)在超类中将val声明为lazy。(简单灵活,但是不够高效)还有种就是子类中使用提前定义语法。(这个就不介绍了)
ant对象调用show()方法输出的则是子类range的值,即为2。而在Java中,则是父类的range的值:10。主要原因还是由于在Scala中,子类重写父类的属性或者方法,覆盖了父类的属性和方法,而在Java中,只有非静态的方法会被子类重写覆盖,而非静态/静态属性和静态方法都只是被隐藏了。
主要参考:《快学Scala》
[转载] Scala继承与Java的区别相关推荐
- Scala深入浅出——从Java到Scala
本文适合有一定Java基础的,并想系统学习Scala的小伙伴借鉴学习.文章有大量实例,建议自己跑一遍. Scala深入浅出--从Java到Scala Scala 一.介绍 1.什么是Scala? 2. ...
- Java中继承和实现的区别【单继承,多实现】
继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们相同的部分都放到父类中,让他们都继承这个类. 实现:如果多个类处理的目标都是一样的,但是处理的方法不同,那么就可以定义一个接口,让 ...
- 简述scala语言与java语联系与区别_scala语言与java的区别
scala支持关联映射,如可以用(key -> value)表示一个键值对 scala中的所有类型都是对象,包括基本数据类型 scala中的case语句用来判断接收的消息,比java中的swit ...
- Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书)
Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书) 基本信息 作者: (美)Venkat Subramaniam 译者: 郑晔 李剑 丛书名: 图灵程序设计丛书 出版社:人民 ...
- Scala协变与Java泛型
2019独角兽企业重金招聘Python工程师标准>>> Scala协变与Java泛型 先定义一个支持协变的scala类,如下, class ContainerPlus01[+A](v ...
- java和python的web自动化有什么区别-三分钟看懂Python和Java的区别
随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...
- python和java一样吗-三分钟看懂Python和Java的区别
随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...
- python和java一样吗-python和java的区别,看了这个就会区分了!
翻看日历,2019年结束也就剩下3个月的时间了!时光飞逝,伴随着互联网人工智能时代的发展,人类一直在预测,2020年什么技术会火?其中,人工智能编程成了大家讨论的热点,Python.Java一直被人们 ...
- 【C/C++】从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪?C语言、C++学习路线?
转自羊哥的公众号 这几个问题都是私信里常被问到的,也是我当时学习过程中的一些疑惑.谁说黑乎乎的命令行里运行的程序就没有用!这跟学什么编程语言.后续从事什么编程方向均无关,只要做编程开发,这四个计算机基 ...
最新文章
- Gut-2018-菌群标志物有望诊断早期肝癌
- cookie 记住浏览历史
- 编译安装mysql5.6.36_MySQL5.6.36编译安装
- python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别
- ASP.NET MVC 4 内容映射
- 管家婆辉煌2虚拟服务器,管家婆辉煌:三步轻松完成软狗组网!
- Docker web管理界面——Shipyard
- enum ordinal java_Java中怎样由枚举常量的ordinal值获得枚举常量对象
- 游戏开发之静态成员实现单列设计模式(C++基础)
- java web 缓存省市县_实现 Java 本地缓存,该从这几点开始
- 现在动手,建立你的灾备系统
- C盘清理方法汇总:SpaceSniffer与Windows.edb
- 解决sudo: no valid sudoers sources found, quitting
- 【前端领域】3D旋转超美相册(HTML+CSS)
- 【最终省二】全国大学生数学建模大赛-参赛经历
- Linux——开发工具
- 频繁用电脑打字 武汉大三女生求职提笔忘字
- c语言中i++与++i的区别
- 2014全国计算机等级考试大纲,2014全国计算机等级考试大纲级.doc
- python 图书管理_Python-图书管理系统
热门文章
- python label标签的作用_label标签的作用是什么?
- Java安全(一) : java类 | 反射
- wordcount linux java_linux下在eclipse上运行hadoop自带例子wordcount
- redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...
- 登陆拦截拦截ajax,过滤器实现登录拦截需要注意的问题(AJAX请求的处理)
- oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関数
- 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
- ubunt16.04 安装3090显卡驱动 cuda cudnn pytorch
- springboot超级详细的日志配置(基于logback)
- Docker 命令详解(run篇)