参考链接: 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的区别相关推荐

  1. Scala深入浅出——从Java到Scala

    本文适合有一定Java基础的,并想系统学习Scala的小伙伴借鉴学习.文章有大量实例,建议自己跑一遍. Scala深入浅出--从Java到Scala Scala 一.介绍 1.什么是Scala? 2. ...

  2. Java中继承和实现的区别【单继承,多实现】

    继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们相同的部分都放到父类中,让他们都继承这个类. 实现:如果多个类处理的目标都是一样的,但是处理的方法不同,那么就可以定义一个接口,让 ...

  3. 简述scala语言与java语联系与区别_scala语言与java的区别

    scala支持关联映射,如可以用(key -> value)表示一个键值对 scala中的所有类型都是对象,包括基本数据类型 scala中的case语句用来判断接收的消息,比java中的swit ...

  4. Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书)

    Scala程序设计:Java虚拟机多核编程实战(国内第一本Scala图书) 基本信息 作者: (美)Venkat Subramaniam  译者: 郑晔 李剑 丛书名: 图灵程序设计丛书 出版社:人民 ...

  5. Scala协变与Java泛型

    2019独角兽企业重金招聘Python工程师标准>>> Scala协变与Java泛型 先定义一个支持协变的scala类,如下, class ContainerPlus01[+A](v ...

  6. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  7. python和java一样吗-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  8. python和java一样吗-python和java的区别,看了这个就会区分了!

    翻看日历,2019年结束也就剩下3个月的时间了!时光飞逝,伴随着互联网人工智能时代的发展,人类一直在预测,2020年什么技术会火?其中,人工智能编程成了大家讨论的热点,Python.Java一直被人们 ...

  9. 【C/C++】从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪?C语言、C++学习路线?

    转自羊哥的公众号 这几个问题都是私信里常被问到的,也是我当时学习过程中的一些疑惑.谁说黑乎乎的命令行里运行的程序就没有用!这跟学什么编程语言.后续从事什么编程方向均无关,只要做编程开发,这四个计算机基 ...

最新文章

  1. Gut-2018-菌群标志物有望诊断早期肝癌
  2. cookie 记住浏览历史
  3. 编译安装mysql5.6.36_MySQL5.6.36编译安装
  4. python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别
  5. ASP.NET MVC 4 内容映射
  6. 管家婆辉煌2虚拟服务器,管家婆辉煌:三步轻松完成软狗组网!
  7. Docker web管理界面——Shipyard
  8. enum ordinal java_Java中怎样由枚举常量的ordinal值获得枚举常量对象
  9. 游戏开发之静态成员实现单列设计模式(C++基础)
  10. java web 缓存省市县_实现 Java 本地缓存,该从这几点开始
  11. 现在动手,建立你的灾备系统
  12. C盘清理方法汇总:SpaceSniffer与Windows.edb
  13. 解决sudo: no valid sudoers sources found, quitting
  14. 【前端领域】3D旋转超美相册(HTML+CSS)
  15. 【最终省二】全国大学生数学建模大赛-参赛经历
  16. Linux——开发工具
  17. 频繁用电脑打字 武汉大三女生求职提笔忘字
  18. c语言中i++与++i的区别
  19. 2014全国计算机等级考试大纲,2014全国计算机等级考试大纲级.doc
  20. python 图书管理_Python-图书管理系统

热门文章

  1. python label标签的作用_label标签的作用是什么?
  2. Java安全(一) : java类 | 反射
  3. wordcount linux java_linux下在eclipse上运行hadoop自带例子wordcount
  4. redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...
  5. 登陆拦截拦截ajax,过滤器实现登录拦截需要注意的问题(AJAX请求的处理)
  6. oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関数
  7. 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
  8. ubunt16.04 安装3090显卡驱动 cuda cudnn pytorch
  9. springboot超级详细的日志配置(基于logback)
  10. Docker 命令详解(run篇)