[转载] 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》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Source Map调试压缩后代码

在前端开发过程中,无论是样式还是脚本,运行时的文件可能是压缩后的,那这个时候调试起来就很麻烦。 这个时候,可以使用Source Map文件来优化调试,Source Map是一个信息文件,里面储存着原代码位置信息&#x…

[转载] Python3十大经典错误及解决办法

参考链接: Python中的关键字2 ◆ ◆ ◆ ◆ ◆ 接触了很多Python爱好者,有初学者,亦有转行人。不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的。下面,严小样儿为大家罗…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑,最常用的方法是用u盘或移动硬盘等存储设备来拷贝,这样速度慢,而且可能拷贝多次才能将数据拷贝完。现提供一种方法,就是通过windows 的文件共享来实现。通过千兆网线直接连…

[转载] 使用 Web 标准生成 ASP.NET 2.0 Web 站点

参考链接: 使用super访问Java祖父母的成员 Stephen WaltherSuperExpert.com 适用于: Microsoft ASP.NET 2.0 (Beta 2) Microsoft Visual Studio .NET 2005 Microsoft Visual Web Developer 摘要: Microsoft ASP.NET 2.0 具有很多有用的功能…

Office快捷键大全之三(Access快捷键下篇)

向下键 向某帮助主题的末尾滚动 Page Up 以较大增量向某帮助主题的开头滚动 Page Down 以较大增量向某帮助主题的末尾滚动 Home 移到某帮助主题的开头 End 移到某帮助主题的末尾 CtrlP 打印当前帮助主题 CtrlA 选定整个帮助主题 CtrlC 将选定项复制到"剪贴…

[转载] 如何在Android设备之间共享Google Play应用,音乐等

参考链接: 使用super访问Java祖父母的成员 We recently showed you how to configure your iOS devices for app and media sharing; more than a few people wrote in asking how to do the same thing with Google Play purchases. Read on as we dig into how t…

linux 高性能读书笔记之通用socket地址

####socket网络编程接口 socket的地址是结构体sockaddr 代码如下 struct sockaddr{ sa_family_t sa_family; char sa_data[14]; } sa_family 成员是地址族类型(sa_family_t)变量。地址族类型通常与协议族类型对应 1.二者对应表 协议族地址表描述PF_UNIXAF_UNIXUNIX本…

[转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调用时机:如果你有构造代码块 系统会帮你调用 帮你在创建对象…

struts2中s:select标签的使用

转自&#xff1a;https://www.cnblogs.com/Sara-shi/archive/2013/03/13/struts2_select.html 1 静态生成 <s:select name"user.sex" list"#{0:男,1:女}" label"性别" headerKey"" headerValue"请选择性别"></s:se…

[转载] JAVA面试题大全(part_1)

参考链接&#xff1a; 对Java中派生类方法更严格的访问 JAVA面试题大全(part_1) 1、面向对象的特征有哪些方面 (1)抽象&#xff1a; 抽象就是忽略一个主题中与当前目标无关的那些方面&#xff0c;以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题&#xf…

使用mysqladmin命令修改MySQL密码与忘记密码

修改密码&#xff1a; 1.例如你的 root用户现在没有密码&#xff0c;你希望的密码修改为123456&#xff0c;那么命令是&#xff1a; mysqladmin -u root password 123456 2.如果你的root现在有密码了&#xff08;123456&#xff09;&#xff0c;那么修改密码为abcdef的命令是&a…

[转载] java面试100问+参考答案

参考链接&#xff1a; 对Java中派生类方法更严格的访问 1、面向对象的特征有哪些方面 (1).抽象&#xff1a; 抽象就是忽略一个主题中与当前目标无关的那些方面&#xff0c;以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题&#xff0c;而只是选择其中的…

工作所用的模块回滚脚本

俗话说的好&#xff1a;“真男人从来不回滚”&#xff0c;但是家中常备一个回滚脚本也是很有必要的&#xff0c;我所在公司的服务器模块名都是在初始化的时候写进/etc/role_install这个文件里&#xff0c;如下图的这个服务器就是fss服务器&#xff1a; 再比如下面这个服务器&am…

Linux服务器性能评估与优化

一、影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2. 程序应用级 二、系统性能评估标准影响性能因素评判标准好坏糟糕CPUuser% sys%< 70%user% sys% 85%user% sys% >90%内存Swap In&#xff08;si&…

[转载] Java序列化的几种方式以及序列化的作用

参考链接&#xff1a; Java中带有继承的对象序列化 文章转载自&#xff1a; 本文着重讲解一下Java序列化的相关内容。 如果对Java序列化感兴趣的同学可以研究一下。 一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去&#xff0c;有的时候我们…

nginx 非80、443端口跳转到80、443

其实很简单: 123if ($server_port ! 80 ) { rewrite ^/(.*)$ http://$host/$1 permanent; }举一反三。。。 123if ($server_port ! 443 ) { rewrite ^/(.*)$ https://$host/$1 permanent; }123if ($host ! host ) { rewrite ^/(.*)$ http://host/$1 permanent; }本文转自 ninny…

[转载] 一文彻底搞懂父类引用指向子类对象问题

参考链接&#xff1a; 用子类引用子类对象 vs 父类引用 public class Father { private String name; private int age; private int weight; public void eat() { System.out.println("Father is eating"); } private void run() { System.out.println("Runin…

把控站外seo效果的几个操作点

把控站外seo效果的几个操作点 实际上&#xff0c;站外的seo不仅仅是外链这么简单&#xff0c;还包括用户行为&#xff08;点击&#xff09;&#xff0c;品牌词曝光等工作。大部分情况下&#xff0c;我们所说的站外优化就是发外链。本文就外链相关事宜&#xff0c;讲解些许操作点…

[转载] 【C语言】fopen C4996错误解决

参考链接&#xff1a; C和C#重载可以与继承一起使用吗 C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解决方案&#xff1a;添加宏定…

Quartus II 8.1 详解--有图---图片详解 【1讲】

Quartus II 8.1 详解--有图---图片详解 看图片比较清楚&#xff0c;比文章清楚的多 本文转自 zhangguangyi 51CTO博客&#xff0c;原文链接http://blog.51cto.com/bosszhang/808019: