Scala的类继承
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
}
类装载机制运行大致如下
- Ant的构造器初始化之前,调用Animal的构造器
- Animal的构造器将age设置为10
- Animal的构造器初始化array数组,调用age()取值器
- 输出Ant类的range字段值
- range方法返回0(默认值为0)
- env被设为长度为0的数组
- 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的类继承的更多相关文章
- Programming In Scala笔记-第十一章、Scala中的类继承关系
本章主要从整体层面了解Scala中的类层级关系. 一.Scala的类层级 在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类.在Scala中所有类的最终父类为A ...
- Scala学习之路 (六)Scala的类、对象、继承、特质
一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...
- scala学习手记13 - 类继承
在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...
- Scala学习——类,继承,接口(中)
基本类的使用:(初) package com.dtspark.scala.basics /** * trait是一个接口 * 接口的第一次继承用extends,多继承时用with * 多继承时,如果这 ...
- 快学Scala 第十一课 (类继承)
类继承: class People { } class Emp extends People{ } 和Java一样,final的类不能被继承.final的字段和方法不能被override. 在Scal ...
- scala学习-类与对象
类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...
- Scala:类,对象和特征(接口)
http://blog.csdn.net/pipisorry/article/details/52902609 Scala类和对象 类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象 ...
- Scala的类层级讲解
Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类. 因为所有的类都是Any的子类,所以定义在Any中的方法就是"共同的"方法:它们可以被任何对象调用. Sca ...
- Scala进阶之路-Scala特征类与unapply反向抽取
Scala进阶之路-Scala特征类与unapply反向抽取 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala特征类分析 1>.Unit 答:用于定义返回值类型, ...
随机推荐
- 线性代数的视角理解LSR(least square regression)的参数评估算法本质
https://medium.com/@andrew.chamberlain/the-linear-algebra-view-of-least-squares-regression-f67044b7f ...
- [EntityFramework] 对 DateTime 类型使用 SQL 服务器时间或者字段默认值
DateTime 类型在 SQL 服务器上如果设置了默认值,在 EntityFramework 添加新行的时候想使用该默认值,则不能对新增加的实体的 DateTime 字段赋值. 但是如果新增加的实体 ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- [控件] 心形加载的view
心形加载的view 效果: 素材图片: 源码: StarView.h 与 StarView.m // // StarView.h // Star // // Created by XianMingYo ...
- 检查windows系统支持的密码套件
Windows 10客户端及Windows server 2016 服务器可以使用powershell 命令获得系统支持的密码套件列表,禁用启用相应的密码套件. #命令链接:https://techn ...
- [T-ARA][I'm so bad]
歌词来源:http://music.163.com/#/song?id=22704433 作曲 : 김태현 , 조영수 [作曲 : k/gim-Tae-hyeon , c/jo-yeong-su] 作 ...
- 【理解】 Error 10053和 Error 10054
1. 10053 这个错误码的意思是: A established connection was aborted by the software in your host machine, 一个已建 ...
- P2607 [ZJOI2008]骑士
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- 简单的Windows 服务的安装和卸载
步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...
- Hadoop学习之路(九)HDFS深入理解
HDFS的优点和缺点 HDFS的优点 1.可构建在廉价机器上 通过多副本提高可靠性,提供了容错和恢复机制 服务器节点的宕机是常态 必须理性对象 2.高容错性 数据自动保存多个副本,副本丢失后,自动 ...