1 Scala继承的基本语法

class 子类名 extends 父类名 { 类体 }

  1. class Person {
  2. var name : String = _
  3. var age : Int = _
  4. def showInfo(): Unit = {
  5. println("学生信息如下:")
  6. println("名字:" + this.name)
  7. }
  8. }
  9.  
  10. class Student extends Person {
  11. def studying(): Unit = {
  12. println(this.name + "学习 scala中....")
  13. }
  14. }

Scala继承给编程带来的便利

1)代码的复用性提高了

2)代码的扩展性和维护性提高了

scala子类继承了什么,怎么继承了?

子类继承了所有的属性,只是私有的属性不能直接访问,需要通过公共的方法去访问

  1. object Extends02 {
  2. def main(args: Array[String]): Unit = {
  3. val sub = new Sub()
  4. sub.sayOk()
  5. }}
  6.  
  7. class Base {
  8. var n1: Int = 1
  9. protected var n2: Int = 2
  10. private var n3: Int = 3
  11. def test100(): Unit = {
  12. println("base 100")
  13. }
  14. protected def test200(): Unit = {
  15. println("base 200")
  16. }
  17. private def test300(): Unit = {
  18. println("base 300")
  19. }
  20. }
  21. class Sub extends Base {
  22. def sayOk(): Unit = {
  23. this.n1 = 20
  24. this.n2 = 40
  25. println("范围" + this.n1 + this.n2)
  26. }}

2 重写方法

说明: scala明确规定,重写一个非抽象方法需要用override修饰符,调用超类的方法使用super关键字

  1. class Person {
  2. var name : String = "tom"
  3. def printName() {
  4. println("Person printName() " + name)
  5. }
  6. }
  1. class Emp extends Person {
  2. //这里需要显式的使用override
  3. override def printName() {
  4. println("Emp printName() " + name)
  5. super.printName()
  6. }
  7. }

3 Scala中类型检查和转换

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

1)classOf[String]就如同Java的 String.class 。

2)obj.isInstanceOf[T]就如同Java的obj instanceof T 判断obj是不是T类型。

3) obj.asInstanceOf[T]就如同Java的(T)obj 将obj强转成T类型。

类型检查和转换的最大价值在于:可以判断传入对象的类型,然后转成对应的子类对象,进行相关操作,这里也体现出多态的特点。

4 Scala中超类的构造

Scala超类的构造说明

1) 类有一个主构器和任意数量的辅助构造器,而每个辅助构造器都必须先调用主构造器(也可以是间接调用.),这点在前面我们说过了。

  1. class Person {
  2. var name = "zhangsan"
  3. println("Person...")}
  4. class Emp extends Person {
  5. println("Emp ....")
  6. def this(name : String) {
  7. this // 必须调用主构造器
  8. this.name = name
  9. println("Emp 辅助构造器~")
  10. }}

2) 只有主构造器可以调用父类的构造器。辅助构造器不能直接调用父类的构造器。在Scala的构造器中,你不能调用super(params)

  1. class Person(name: String) { //父类的构造器
  2. }
  3. class Emp (name: String) extends Person(name) {// 将子类参数传递给父类构造器,这种写法√
  4.  
  5. // super(name) (×) 没有这种语法
  6. def this() {
  7. super("abc") // (×)不能在辅助构造器中调用父类的构造器
  8. }
  9. }

5  覆写字段

基本介绍

在Scala中,子类改写父类的字段,我们称为覆写/重写字段。覆写字段需使用 override修饰。

Scala覆写字段快速入门

   

覆写字段的注意事项和细节

1) def只能重写另一个def(即:方法只能重写另一个方法)

2) val只能重写另一个val 属性 或 重写不带参数的def

3) var只能重写另一个抽象的var属性

 

抽象属性:声明未初始化的变量就是抽象的属性,抽象属性在抽象类

var重写抽象的var属性小结

1) 一个属性没有初始化,那么这个属性就是抽象属性

2) 抽象属性在编译成字节码文件时,属性并不会声明,但是会自动生成抽象方法,所以类必须声明为抽象类

3) 如果是覆写一个父类的抽象属性,那么override 关键字可省略 [原因:父类的抽象属性,生成的是抽象方法,因此就不涉及到方法重写的概念,因此override可省略]

6 抽象类

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

快速入门案例

抽象类基本语法

说明:抽象类的价值更多是在于设计,是设计者设计好后,让子类继承并实现抽象类(即:实现抽象类的抽象方法)

Scala抽象类使用的注意事项和细节讨论

1)抽象类不能被实例

2)抽象类不一定要包含abstract方法。

3)也就是说,抽象类可以没有abstract方法 一旦类包含了抽象方法或者抽象属性,则这个类必须声明为abstract

4)抽象方法不能有主体,不允许使用abstract修饰。

5) 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法和抽象属性,除非它自己也声明为abstract类。

6)抽象方法和抽象属性不能使用private、final 来修饰,因为这些关键字都是和重写/实现相违背的。

7)  抽象类中可以有实现的方法.

8) 子类重写抽象方法不需要override,写上也不会错.

7 匿名子类

和Java一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类.

 

8 继承层级

subtype : 子类型

implicit Conversion 隐式转换

class hierarchy : 类层次

继承层级图小结

1) 在scala中,所有其他类都是AnyRef的子类,类似Java的Object。

2)AnyVal和AnyRef都扩展自Any类。Any类是根节点

3)Any中定义了isInstanceOf、asInstanceOf方法,以及哈希方法等。

4)Null类型的唯一实例就是null对象。可以将null赋值给任何引用,但不能赋值给值类型的变量

5)Nothing类型没有实例。它对于泛型结构是有用处的,举例:空列表Nil的类型是List[Nothing],它是List[T]的子类型,T可以是任何类。

Scala 面向对象(六):面向对象的特征二:继承 (一)的更多相关文章

  1. 面向对象(OPP)的三大特征之 继承

    OPP(面向对象编程的缩写)的三大优势: 1.继承 2.封装 3.多态 一.继承 1.继承:是两个对象之间的一种关系 a继承b 例如王思聪继承王健林 在OPP中继承是描述类与类之间的一种关系 2.继承 ...

  2. java面向对象编程(六)--四大特征之继承

    本文将介绍继承.方法重载和方法覆盖.其中方法重载和方法覆盖是在讲多态时必须要清楚的一个知识点. 一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变 ...

  3. 【java基础】面向对象的三大基本特征之-------继承

    面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类 ...

  4. 包(package)以及面向对象三个基本特征(继承)的介绍

    1.包(package) 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包也可以看成一个目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维 ...

  5. 面向对象的三大特性之二——继承(含super的使用)

    1.继承的语法:class 子类 extends 父类 例1: class Person { int age; String name; public void print1() { System.o ...

  6. Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)

    一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...

  7. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  8. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  9. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  10. Java——面向对象的特征二:继承性

    2.1面向对象的特征二:继承性 ①引入类继承最基本的作用是:代码重用. ②语法 [修饰符列表] class 子类名 extends 父类名{ 类体; } ③子类继承父类以后,父类中声明的属性.方法,子 ...

随机推荐

  1. ServiceStack.Redis 5.8 版本去掉每小时 6000 次访问限制

    ServiceStack.Redis这个官方 Redis 访问组件从4.0版本后开始商业化了,在使用的时候会有很多限制: 1.类型限制 类型限制是20,这个组件自带序列化功能,使得我们可以直接把对象保 ...

  2. Spark GraphX企业运用

    ========== Spark GraphX 概述 ==========1.Spark GraphX是什么?  (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...

  3. 【大厂面试08期】谈一谈你对HashMap的理解?

    摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...

  4. 能被 K 整除的最大连续子串长度

    [来源]网上流传的2017美团秋招笔试题 [问题描述] 两个测试样例输出都是5 [算法思路] 暴力解法时间会超限,使用一种很巧妙的数学方法.用在读取数组arr时用数组sum记录其前 i 项的和,即 s ...

  5. C++_继承

    C++支持单继承和多继承,并提供3类继承:public.private及protected.在public继承中,每个派生类对象都是基类对象,反之基类对象却不是派生类对象.派生类成员无法直接访问基本的 ...

  6. 图解leetcode5-10 | 和233酱一起刷leetcode系列(2)

    本周我们继续来看5道磨人的小妖精,图解leetcode6-10- 多说一句,leetcode10 杀死了233酱不少脑细胞... 另: 沉迷算法,无法自拔.快来加入我们吧! 别忘了233酱的一条龙服务 ...

  7. JavaWeb网上图书商城完整项目--day02-15.登录功能流程分析

    当用户点击登录界面的登录按钮的时候,将登录的用户名.密码和验证码上传到后台,后台的业务流程如下面所示:

  8. TestNG学习笔记新的

    1.参考官方文档https://www.yiibai.com/html/testng/2013/0915300.html package com.cib.testng; import org.test ...

  9. 尚硅谷maven视频教程笔记

    07.尚硅谷_Maven_部署Maven核心程序.avi 第一步先安装jdk 第二步下载maven 特别需要注意的是maven不能存储在有中文和空格的目录下面 3.调试是否安装成功,在cmd中输入 m ...

  10. SpringMVC 学习笔记(三)数据的校验

    34. 尚硅谷_佟刚_SpringMVC_数据绑定流程分析.avi 例如:在jsp中输入一个String字符串类型,需要转换成Date类型的流程如下 convertservice对传入的数据进行转换 ...