Scala继承
override重写
- 为什么要用override关键字?因为这样更清楚,不容易出错,比如打错字了,就没覆盖成功,但是不会报错
- override可以覆盖feild和method
class Person{
private val name = "CZM"
def getName = name
}
class Student extends Person{
private val score = "A"
def getScore = score
override def getName = "My name is "+super.getName //重写需要使用关键字override声明。如果父类定义为final则不可重写
}
val s1 = new Student
s1.getScore
s1.getName
isInstanceOf和asInstanceOf:多态判断
- 在多态的转换中,会把子类对象赋值给父类变量,如果遇到需要把本来是子类的对象变回子类怎么实现?
- isInstanceOf用于判断是否是指定类的对象
- asInstanceOf用于将对象转换成指定类型
//接上文代码
//旧API,这个并不能精准判断
val p1:Person = new Student
if (p1.isInstanceOf[Student]){
val s1:Student = p1.asInstanceOf[Student] //p1的本质是没有改变的,返回一个clone的对象
s1.getScore //如果不转换,这个学生就失去了这个方法
}
//新API,非精准判断
p1 match {
case _: Student =>
p1.asInstanceOf[Student]
p1
case _ =>
}
getClass和classOf:精准判断
val p1: Person = new Student
val s1 = new Student
p1.getClass == classOf[Student] //false
p1.getClass == classOf[Person] //true
protected关键字
除了private之外,scala还提供和了protect关键字,子类访问权限
- private[this]:出了自己的{ }就不承认了,就比如说一个人有病,只有自己知道,在外人看来是不存在的,儿子也不知道
- protected[this]:出了自己和儿子的{ }就不承认了,就比如说一个人有病,只有自己和儿子知道,在外人看来是不存在的,儿子不会告诉别人的儿子
class Person() {
protected[this] val name = "CZM" def getName = name }
class Student extends Person {
private val score = "A" def getScore = score def makeFriend(s: Student): Unit = {
println("My name is " + name + " , I'm " + s.name + " is friend!") //在自己家可以调用name,无法调用s.name相当于自己儿子去了别人家
}
}
val s1 = new Student
val s2 = new Student
s1.makeFriend(s2)
调用父类constructor
- 为什么调用父类构造函数这么奇葩? 因为子类constructor第一行必须调用主constructor或者其他辅助constructor
- 为什么不用super(...)? 因为没有
//父类,定义了两个constructor
class Person(val name: String) {
var age = 10 def getName = name
def this(name: String, age: Int) {
this(name)
this.age = age
}
}
//子类 定义自己的constructor(name:传值,age:重写父类中的age字段,score:定义自己的变量score) Person()这里就决定了调用哪一个constructor
class Student(name: String, override val age: Int, val score: Double) extends Person(name) {
匿名内部类
- 匿名内部类:定义一个没有名称的某个类(接口)的子类,并马上实例化new
- 匿名内部类本身没有构造器,但是会调用父类构造器
- 匿名内部类必须继承或实现一个接口,但最多只能一个父类或实现一个接口(JAVA == scala)
JAVA中的匿名内部类
new 父类构造器( ) 或 接口( )
{
//todo
}
scala中的匿名内部类,跟JAVA没有一点区别
class Person(val name: String) {
def sayHello = println("Person class " + name)
}
val p1 = new Person("CZM") //p1是一个Person类的对象
val p2 = new Person("leo") { //p2是一个Person类的匿名子类的对象
override def sayHello = println("new sun class " + name)
}
p1.sayHello
p2.sayHello
abstract抽象
- 子类覆盖抽象类的抽象方法可以不需要override,IDEA推荐还是使用override
- 抽象类中允许有非抽象方法
- 没有implement关键字,依然使用extends
- 可以抽象field(需要在抽象类中),编译在编译抽象类时,生成了getter和setter方法,但是父类中没有这个field
//抽象类和抽象方法
abstract class Person {
def sayHello():Any
}
class student extends Person{
override def sayHello() = ??? }
//抽象类和抽象field
abstract class Person {
abstract val name:String }
Scala继承的更多相关文章
- Scala 继承
1. 继承 Scala 通过 extends 关键字来继承类. 那么继承一个类有什么好处呢? 子类拥有继承自超类的方法和字段(即为val(常量), var(变量)所定义的) 可以添加自己需要的新方法和 ...
- Scala学习(八)---Scala继承
Scala继承 摘要: 在本篇中,你将了解到Scala的继承与Java和C++最显著的不同.要点包括: 1. extends.final关键字和Java中相同 2. 重写方法时必须用override ...
- 7.scala:继承
版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=315 排版乱?请移步原文获得更好的阅读体验 类似于java中的继承,在scala中同样有继承一说,而且在很多方面 ...
- Scala实战高手****第10课:Scala继承彻底实战和Spark源码鉴赏
isInstanceOf 和 asInstanceOf is用于判断 as用于转换,把父类类型转换成子类类型 getClass 具体找出类型
- 快学Scala之继承
## 1. 继承 Scala语言通过 extends 关键字来继承类. 那么继承一个类有什么好处呢? 子类除了拥有继承自超类的方法和字段(即为val(常量), var(变量)所定义的), 还可 ...
- Scala学习八——继承
一.本章要点 extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段 二.扩展类 Scala扩展类和Java一样(使用ext ...
- Scala 面向对象(六):面向对象的特征二:继承 (一)
1 Scala继承的基本语法 class 子类名 extends 父类名 { 类体 } class Person { var name : String = _ var age : Int = _ d ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习
下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...
随机推荐
- FIFO认识(一)
1.什么是FIFO? FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据 ...
- 如何修改Fiori Launchpad里Tile计数调用的时间间隔
Fiori launchpad里的Tile上有一个数字,例如下图My Leads的例子:每隔指定的时间间隔,会向后台发起一次数据请求,读取当前Lead的个数. 这个请求可以在Chrome Develo ...
- 关于rapidxml无法解析中文路径问题
先放结果 setlocale(LC_ALL, ""); rapidxml::file<> f(szPath); setlocale(LC_ALL, "C&qu ...
- Android(java)学习笔记22:我们到底该如何处理异常?
1. 我们到底该如何处理异常? (1)原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个 ...
- Type Syntax error, insert ")" to complete Expression
今天倒持了 几个小时! 愣是 没有明确 ,为什么我的JSP的第一行没有代码? 还是报错! 错误是: Description Resource Path Location Type Sy ...
- luogu P1121 环状最大两段子段和
嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...
- POJ 1416 Shredding Company【dfs入门】
题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ...
- [19/03/21-星期四] 异常(Exception) (一)
一.引言 在实际工作中,我们遇到的情况不可能是非常完美的.比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件, 这个文件可能不存在或者文件格式不对 ,你要读取数据库的数据,数据可 ...
- c#类的练习
类部分练习题 - dijiaxing1234的博客 - CSDN博客 https://blog.csdn.net/dijiaxing1234/article/details/81230811 真好啊
- 一步一步部署SSIS包图解教程
本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...