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. Oracle数据库日期格式转换操作

    1. 日期转化为字符串 (以2016年10月20日为例) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  strDateTime from dual; ...

  2. CCSUOJ评测系统——第二次scrum冲刺

    1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 2.第二次冲刺任务安排 对HUSTOJ数据库进行分析 序号 表名 作用 备注 1 compileinfo 记录编译错误的记录 2 contest ...

  3. 【转】ubuntu右键在当前位置打开终端

    ubuntu右键在当前位置打开终端   ubuntu增加右键命令:   在终端中打开   软件中心:   搜索nautilus-open-terminal安装   命令行:   sudo apt-ge ...

  4. 配置 tsconfig.json

    作用 指导编译器如何生成 JS 文件 参数 target: 编译目标平台(es3, es5, es2015) module: 组织代码方式(commonjs, AMD) sourceMap:编译文件对 ...

  5. LeetCode题解之Multiply Strings

    1.题目描述 2.问题分析 按照手算乘法的过程进行计算,首先计算乘法,然后计算加法. 3.代码 string multiply(string num1, string num2) { string s ...

  6. SQL Server FOR XML PATH 和 STUFF函数的用法

    FOR XML PATH ,其实它就是将查询结果集以XML形式展现,将多行的结果,展示在同一行. 下面我们来写一个例子: 假设我们有个工作流程表: CREATE TABLE [dbo].[Workfl ...

  7. 封装CoreGraphics的API简化绘图操作

    封装CoreGraphics的API简化绘图操作 效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https ...

  8. 【2017.12.05 智能驾驶/汽车电子】转载:如何成为一名无人驾驶工程师 By刘少山

    之前对无人驾驶的理解就是通过刘少山老师的书:第一本无人驾驶技术书 通读之后,对智能驾驶有了一个初步的认识,如感知.决策.控制都涉及哪些领域,有哪些可以利用的技术: 但经过一段时间的实践,发现即使是在我 ...

  9. django 错误之 OSError: mysql_config not found

    pip 导入包时出现如下错误 Complete output from command python setup.py egg_info: /bin/: mysql_config: not found ...

  10. 12-5 张雨RTCM3数据解码解不出的原因

    数据大小:75kB 时间12-4 原因:二进制数据乱码,未通过电文头检验 2018-12-10 08:44:05 张雨RTCM32-MSM4无法固定,连差分都没有