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 答:用于定义返回值类型, ...
随机推荐
- mybatis 在存储Integer、bigdecimal等java数据类型时,将0存成null
我们的项目中,有关于金额的计算,所以,一般在java环境中我们使用bigdecimal来做运算和存储金额信息.数据库sqlServer2008用的float类型 问题是,当我将金额赋值成0时,很意外的 ...
- python-threading.Event实现事件功能--汽车过红绿灯(转载)
python-threading.Event实现事件功能 enent可以通过设置.等待.清除一个标识(flag),来进行线程间的控制线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线 ...
- 手动搭建 redis 集群
转自http://meia.fun/article/1544161420745 手动搭建 redis 集群 redis 基本命令: 启动 redis 服务:redis-server xxx.conf ...
- php 打印
php 打印功能需要printer.dll文件 扩展下载地址 http://downloads.php.net/pierre/ 这里有很多PHP的扩展
- Oracle EBS 查询客户报错 查询已超出 200 行。可能存在更多的行,请限制查询。
- C/C++内存分区
C/C++编译的程序占用的内存分区 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若 ...
- K8S Deployment 命令
创建 Deployment kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record ...
- (1)String类 (2)StringBuilder类和StringBuffer类 (3)日期相关的类
1.String类(重中之重)1.1 常用的方法(练熟.记住)(1)常用的构造方法 String() - 使用无参的方式构造空字符串对象. String(byte[] bytes) - 根据参数指定的 ...
- Basestation函数解析(二)
---恢复内容开始--- 这部分从Basestation的RecvDataThread开始,流程为 RecvDataThread->RecvData->Decoder->PostDa ...
- web应用安全发展与介绍
安全与安全圈的认识 中国黑客的发展过程:1990年代初,部分人开始研究黑客技术 1997-1999年,黑客团队涌现,进入黄金时代, 21世纪初,黑客工具傻瓜化,门槛降低,黑客精神不在… 圈内熟知的安全 ...