美文网首页
scala10.继承

scala10.继承

作者: Java架构师之路 | 来源:发表于2020-01-05 14:37 被阅读0次

10.1继承类

和Java一样使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法。
如果类声明为final,他讲不能被继承。
如果单个方法声明为final,将不能被重写。

10.2重写方法

重写一个非抽象方法需要用override修饰符。
调用超类的方法使用super关键字

10.3类型检查和转换

要测试某个对象是否属于某个给定的类,可以用isInstanceOf方法。
用asInstanceOf方法将引用转换为子类的引用。
classof获取对象的类名。

10.4受保护的字段和方法

protected声明字段和方法,子类可见,所属包不可见。

10.5超类的构造

只有主构造器才能调用超类的构造器,构造器的参数,传入了超类的构造函数。
Scala不能通过super(a)这种方式调用超类的构造函数。

10.6重写字段

子类改写父类或者抽象父类的字段,通过以下方式:
注意如下限制(同时参照表8-2):
·def只能重写另一个def。
val只能重写另一个val或不带参数的def。
·var只能重写另一个抽象的var(参见8.8节“抽象类”)。

10.7匿名子类

可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类:
匿名类的变量类型为:Person{def greeting:String}这是一个结构类型

10.8抽象类

可以通过abstract关键字标记不能被实例化的类。
方法不用标记abstract,只要省掉方法体即可。
类可以拥有抽象字段,抽象字段就是没有初始值的字段。
子类实现抽象方法不需要override。

10.9构造顺序和提前定义

当子类重写了父类的方法或者字段后,父类又依赖这些字段或者方法初始化,这个时候就会出现问题,比如:
解决这个问题,可以有3种方法:
1)将val声明为final,这样子类不可改写。
2)将超类中将val声明为lazy,这样安全但并不高效
3)可以使用提前定义语法,可以在超类的构造器执行之前初始化子类的val字段,

10.10Scala继承层级

所有其他类都是AnyRef的子类,AnyRef是Java或.NET虚拟机中Object类的同义词。

AnyVal和AnyRef都扩展自Any类,而Any类是整个继承层级的根节点。
Any类定义了isInstanceOf、aslnstanceOf方法,以及用于相等性判断和哈希码的方法,我们将在8.12节中介绍。
AnyVal并没有追加任何方法。它只是所有值类型的一个标记。

AnyRef类追加了来自Object类的监视方法wait和notify/notifyAll。同时提供了一个带函数参数的方法synchronized。这个方法等同于Java中的synchronized块。例如:
所有的Scala类都实现ScalaObject这个标记接口,这个接口没有定义任何方法。

在继承层级的另一端是Nothing和Null类型。
Null类型的唯一实例是null值。你可以将l赋值给任何引用,但不能赋值给值类型的变量。举例来说,我们不能将lnt设为null。这比Java更好,在Java中我们可以将Integer包装类引用设为null。
Nothing类型没有实例。它对于泛型结构时常有用。举例来说,空列表Nl的类型是List[Nothing],它是List[T]的子类型,T可以是任何类。

import org.scalatest.FunSuite

class Chapter09Test extends FunSuite {

  test("core01") {
    //继承类
  }
  test("core02") {
    //重写方法
  }
  test("core03") {
    //类型检查和转换
    val r = scala.math.random
    val p = if (r < 0.1) {
      new Array(1)
    } else {
      new scala.collection.mutable.ArrayBuffer[Int]()
    }
    //某个对象是否属于某个给定的类
    //    if (p.isInstanceOf[Array]) {
    //      //用asInstanceOf方法将引用转换为子类的引用
    //      val s = p.asInstanceOf[Array]
    //    }
    //classof获取对象的类名
    //    if (p.getClass == classOf[p.type]) {
    //      println(123)
    //    }
  }
  test("core04") {
    //protected
  }
  test("core05") {
    //超类的构造
    //只有主构造器才能调用超类的构造器,构造器的参数,传入了超类的构造函数。

  }
  test("core06") {
    //重写字段

  }
  test("core07") {
    //匿名子类

  }
  test("core08") {
    //    抽象类
  }
  test("core09") {
    //    构造顺序和提前定义
  }
  test("core10") {
    println(111)
  }

}

//继承
class Person {
  var name = ""

  //重写
  override def toString: String = getClass.getName
}

class Employee extends Person {
  val salary = 0.0

  override def toString: String = super.toString

  //protected声明字段和方法,子类可见,所属包不可见
  protected var empno = 0
}

//超类的构造举例
class Person1(val name: String, val age: Int) {
  override def toString = getClass.getName + "[name=" + name +
    ",age=" + age + "]"
}

class Employee1(name: String, age: Int, val salary: Double) extends
  Person1(name, age) {
  override def toString = super.toString + "[salary=" + salary + "]"
}

//子类重写父类的字段
abstract class Person2 {  
  def id: Int  
}

class Student(override val id: Int) extends Person2

//抽象类
abstract class AbstractPerson(val pname: String) {
  //抽象类的字段 方法
  val id: Int
  var name: String

  def idString: Int
}

// 提前定义
class Creature {
  val range: Int = 10
  val env: Array[Int] = new Array[Int](range)
}

class Bug extends {
  // 提前定义
  override val range = 3
} with Creature

相关文章

  • scala10.继承

    10.1继承类 和Java一样使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的...

  • 继承 继承

    属性拷贝 继承不单单能通过原型链实现,也能通过其他方式实现,属性拷贝就是其中一种方法。 通过属性拷贝也能实现继承子...

  • 继承(单继承,多继承)

    将共性的内容放在父类中,子类只需要关注自己特有的内容 python中所有的内容都是对象,所有的对象都直接或间接继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • 原型相关(二)

    1.继承 继承方式:接口继承(只继承方法签名)实现继承(继承实际的方法)ECMAScript只支持实现继承,并且主...

  • 继承

    继承的引入和概述 继承案例和继承的好处 继承的弊端 Java中继承的特点 继承的注意实现和什么时候使用继承 继承中...

  • Java面向对象三大特性之继承

    继承 一、继承的特点 Java只支持单继承单继承 多继承 单继承、多继承优缺点①单继承优点:提高了代码的复用性,让...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • 【重学前端】JavaScript中的继承

    JavaScript中继承主要分为六种:类式继承(原型链继承)、构造函数继承、组合继承、原型式继承、寄生式继承、寄...

网友评论

      本文标题:scala10.继承

      本文链接:https://www.haomeiwen.com/subject/aovzectx.html