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继承的更多相关文章

  1. Scala 继承

    1. 继承 Scala 通过 extends 关键字来继承类. 那么继承一个类有什么好处呢? 子类拥有继承自超类的方法和字段(即为val(常量), var(变量)所定义的) 可以添加自己需要的新方法和 ...

  2. Scala学习(八)---Scala继承

    Scala继承 摘要: 在本篇中,你将了解到Scala的继承与Java和C++最显著的不同.要点包括: 1. extends.final关键字和Java中相同 2. 重写方法时必须用override ...

  3. 7.scala:继承

    版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=315 排版乱?请移步原文获得更好的阅读体验 类似于java中的继承,在scala中同样有继承一说,而且在很多方面 ...

  4. Scala实战高手****第10课:Scala继承彻底实战和Spark源码鉴赏

    isInstanceOf  和 asInstanceOf is用于判断 as用于转换,把父类类型转换成子类类型   getClass 具体找出类型    

  5. 快学Scala之继承

        ## 1. 继承 Scala语言通过 extends 关键字来继承类. 那么继承一个类有什么好处呢? 子类除了拥有继承自超类的方法和字段(即为val(常量), var(变量)所定义的), 还可 ...

  6. Scala学习八——继承

    一.本章要点 extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段 二.扩展类 Scala扩展类和Java一样(使用ext ...

  7. Scala 面向对象(六):面向对象的特征二:继承 (一)

    1 Scala继承的基本语法 class 子类名 extends 父类名 { 类体 } class Person { var name : String = _ var age : Int = _ d ...

  8. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  9. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

随机推荐

  1. Master HA彻底解密

    本课主题 Master HA 解析 Master HA 解析源码分享 Master HA 解析 生产环境下一般采用 ZooKeeper 做 HA,且建义为 3台 Master, ZooKeeper 会 ...

  2. GridView中的更新按钮不能触发RowUpdating事件

    当点击“编辑”按钮以后,可以看到“更新”和“取消”按钮,“取消”按钮可以正常触发RowCancelingEdit事件,但是“更新”按钮不能触发RowUpdating事件. 解决方案: 在<asp ...

  3. CRUD全栈式编程架构之数据层的设计

    CodeFirst 一直以来我们写应用的时候首先都是创建数据库 终于在orm支持codefirst之后,我们可以先建模. 通过模型去创建数据库,并且基于codefirst可以实现方便的 实现数据库迁移 ...

  4. POJ 3088 斯特林

    题意:有一个n个按钮的锁,按下一些按钮打开门,有多少开门方式,其中,一些按钮可以选,可以不选,选中的按钮 可以分成一些集合,集合之间无序,是同时按下的. 分析: 1.首先选择 i 个按钮,组合数 2. ...

  5. div可编辑框,去除粘贴文字样式😄

    上个月做了个聊天的需求(网页版的).说到聊天都想到输入框,说到输入框都会想到input,但是input标签是不支持插入图片的(包括areatext标签).查阅了一些资料就看到div标签有一个属性con ...

  6. python-文件基本操作(二)

    在上一篇文章中,简单介绍了打开文件的方法以及关于读.写.追加的操作,点击此处查看. 在此篇文章中,继续介绍另外一种打开文件的方法和几种同时读写的模式. 一.打开文件方法:with 使用file()或o ...

  7. apache开启.htaccess及使用方法

    1 . 如何让的本地APACHE器.htaccess 如何让的本地APACHE呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess开启了,来看看操作 打开h ...

  8. LeetCode1.两数之和 JavaScript

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 实例: 给定 nums = [2, 7, 11, 15], target ...

  9. BP神经网络—java实现(转载)

    神经网络的结构 神经网络的网络结构由输入层,隐含层,输出层组成.隐含层的个数+输出层的个数=神经网络的层数,也就是说神经网络的层数不包括输入层.下面是一个三层的神经网络,包含了两层隐含层,一个输出层. ...

  10. ATK-DataPortal 设计框架(二)

    在信息的交换过程中,总是有此相同相似的功能,由于业务的各自不同,由同一类型来处理诸如增删改查等常见的信息处理方式.从日常的对些类行为操作为生成的类分析,大量雷同的代码遍布整个项目.框架中xxxHand ...