Scala的类继承

  • extend

Scala扩展类的方式和java一样使用extends关键字

class Employee extends Person {

}


与java一样,可以在定义的子类重写超类的方法,定义父类不存在的属性和方法

  • override
class Person {
override def toString = getClass.getName +"name="
}

在Scala中调用的超类的方法和java完全一致,使用super关键字

public class Employee extends Person {
override def toString = super.toString
}
  • 类型检查和转换

测试某个对象是否某个给定的类,可以使用isInstanceOf方法,如果返回true,可以使用asInstanceOf方法将引用转为子类的引用,现在看下面的代码:

   if(p.isInstanceOf[Employee]) {
// s的类型为Employee
val s = p.asInstanceOf[Employee]
}

分析上面的代码片段,若p指向的是Employee类及其子类(假定子类是Manager),则p.isInstanceOf[Employee] 返回true,否则返回false,另外还有一种情况是:p指向是一个Employee对象而不是其子类,可以使用 if(p.getClass == classOf[Employee])

  • 保护字段

与java一致,可以将字段或方法声明为protected,这样的成员可以被任何子类访问,但其他位置无法访问。Scala中提供了protected[this] 将访问权限限定在当前的对象

  • 构造的执行优先级

当你在子类重写val并且在超类的构造器中使该值的话,不一定可以看到重写的val变量。以下面例子说明

父类:
class Animal {
val age : Int = 10
val array : Array[Int] = new Array[Int](age)
} 子类:
class Ant extends Animal {
override val age = 2
}

类装载机制运行大致如下

  1. Ant的构造器初始化之前,调用Animal的构造器
  2. Animal的构造器将age设置为10
  3. Animal的构造器初始化array数组,调用age()取值器
  4. 输出Ant类的range字段值
  5. range方法返回0(默认值为0)
  6. env被设为长度为0的数组
  7. Ant的构造器继续执行,将其range字段设为2

从代码看range可能为10或者为2,但是env被设为长度为0的数组,因为字段默认都有get/set方法,Ant类继承了env,由于env没有重写,默认构造为长度为0的数组

解决冲突有以下方法:

1. 将val声明为final
2. 在超类中val声明为lazy
3. 在子类总使用提前定义语法如下:
class Ant extends{ override val range = 2}with Animal
  • 对象相等性

当定义产品Item可能会认为两个物件有相同的描述和价格就是相等的,应该是以下equals方法

final override def equals(other: Any) = {
val that = other.asInstanceOf[Item]
if(that==null) false else description ==that.description && price ==that.price
}
注意要确保equals的方法参数类型为Any,否则不会重写equals方法

Scala的类继承的更多相关文章

  1. Programming In Scala笔记-第十一章、Scala中的类继承关系

    本章主要从整体层面了解Scala中的类层级关系. 一.Scala的类层级 在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类.在Scala中所有类的最终父类为A ...

  2. Scala学习之路 (六)Scala的类、对象、继承、特质

    一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...

  3. scala学习手记13 - 类继承

    在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...

  4. Scala学习——类,继承,接口(中)

    基本类的使用:(初) package com.dtspark.scala.basics /** * trait是一个接口 * 接口的第一次继承用extends,多继承时用with * 多继承时,如果这 ...

  5. 快学Scala 第十一课 (类继承)

    类继承: class People { } class Emp extends People{ } 和Java一样,final的类不能被继承.final的字段和方法不能被override. 在Scal ...

  6. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...

  7. Scala:类,对象和特征(接口)

    http://blog.csdn.net/pipisorry/article/details/52902609 Scala类和对象 类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象 ...

  8. Scala的类层级讲解

    Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类. 因为所有的类都是Any的子类,所以定义在Any中的方法就是"共同的"方法:它们可以被任何对象调用. Sca ...

  9. Scala进阶之路-Scala特征类与unapply反向抽取

    Scala进阶之路-Scala特征类与unapply反向抽取 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala特征类分析 1>.Unit 答:用于定义返回值类型, ...

随机推荐

  1. 带你从零学ReactNative开发跨平台App开发[react native SqlLite 终极运用](十二)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  2. TYPE_SCROLL_INSENSITIVE is not compatible with CONCUR_UPDATABLE

    There are two options when setting ResultSet to be scrollable: TYPE_SCROLL_INSENSITIVE - The result ...

  3. 机器学习中正则惩罚项L0/L1/L2范数详解

    https://blog.csdn.net/zouxy09/article/details/24971995 原文转自csdn博客,写的非常好. L0: 非零的个数 L1: 参数绝对值的和 L2:参数 ...

  4. 使用Membership,您的登录尝试不成功。请重试"的解决方法

    提示信息是标准Login控件产生的,打开数据库,检查aspnet_Membership表,检查IsLockedOut字段的值是否为False, 如果为True,表示这个用户锁定了,把它改成False即 ...

  5. 查询会龄 sql部分

      AND (       case when ${fld:vc_age} = '1' then ((current_date-d.c_idate::date)/30)<3       when ...

  6. [UI] Elastic Stack & scrollReveal.js

    Elastic Stack & scrollReveal.js Elastic Stack http://freebiesbug.com/code-stuff/elastistack-js-d ...

  7. android-eclips中logcat不显示信息的问题解决

    time:2015/11/20 1. logcat窗口不显示问题 解决: 参考[1] 2. logcat中不显示信息 (1)红米手机 (2)解决问题 * 有些文章提到重启eclipse,或者重启手机. ...

  8. AC自动机, 字符串匹配算法

    package utils import java.util.HashMapimport java.util.LinkedListimport util.control.Breaks._import ...

  9. Oracle数据库运维:要对监听日志文件(listener.log)进行定期清理,如果不定期清理,会遇到下面一些麻烦

    原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?EmPreviewTypeV=2& ...

  10. 新手学Linux:在VMware14中安装CentOS7详细教程

    VMware Workstation14安装CentOS7.0 详情教程 1.准备工作 a)下载VMware workstation14 b)下载CentOS7 c)下载SSH Secure Shel ...